This is an automated email from the ASF dual-hosted git repository.

jlahoda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 9762c40938 The ClassLoader used to load annotation processors does not 
return directories from getResource/getResources methods, while normal 
ClassLoaders do - fixing.
     new a2e110a6e3 Merge pull request #6466 from 
lahodaj/fix-classloader-getresource-directory
9762c40938 is described below

commit 9762c409389cecb5416da8d2b8951031456ea290
Author: Jan Lahoda <jan.lah...@oracle.com>
AuthorDate: Fri Sep 15 09:40:58 2023 +0200

    The ClassLoader used to load annotation processors does not return 
directories from getResource/getResources methods, while normal ClassLoaders do 
- fixing.
---
 .../modules/java/source/parsing/Archive.java       | 15 ++++++
 .../java/source/parsing/CacheFolderArchive.java    |  6 +++
 .../java/source/parsing/CachingArchive.java        | 16 ++++++
 .../source/parsing/CachingArchiveClassLoader.java  | 10 ++++
 .../java/source/parsing/CachingPathArchive.java    | 26 +++++++--
 .../java/source/parsing/FileObjectArchive.java     | 10 ++++
 .../modules/java/source/parsing/FileObjects.java   | 55 ++++++++++---------
 .../modules/java/source/parsing/FolderArchive.java | 13 +++++
 .../modules/java/source/parsing/PathArchive.java   | 11 ++++
 .../modules/java/source/parsing/ProxyArchive.java  | 12 +++++
 .../parsing/CachingArchiveClassLoaderTest.java     | 61 ++++++++++++++++++++++
 .../java/source/parsing/CachingArchiveTest.java    | 21 ++++++++
 .../source/parsing/CachingPathArchiveTest.java     | 17 ++++++
 .../java/source/parsing/FileObjectArchiveTest.java | 13 +++++
 .../java/source/parsing/PathArchiveTest.java       | 19 +++++++
 15 files changed, 275 insertions(+), 30 deletions(-)

diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java
index 47b4983222..ac8d9894ad 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java
@@ -20,6 +20,7 @@
 package org.netbeans.modules.java.source.parsing;
 
 import java.io.IOException;
+import java.net.URI;
 import java.util.Collections;
 import java.util.Set;
 import javax.tools.JavaFileObject;
@@ -65,6 +66,15 @@ public interface Archive {
      */
     public JavaFileObject getFile(final @NonNull String name) throws 
IOException;
 
+    /**
+     * Returns a {@link URI} for a directory of the given name, or null if it 
does
+     * not exist.
+     *
+     * @param dirName the name of the directory
+     * @return a URI if the given directory is in this archive, {@code null} 
otherwise.
+     */
+    public URI getDirectory(final @NonNull String dirName) throws IOException;
+
     /**
      * Checks if the {@link Archive} is represents a multi release archive.
      * @return true if the {@link Archive} is supports multiple releases.
@@ -91,6 +101,11 @@ public interface Archive {
             return null;
         }
 
+        @Override
+        public URI getDirectory(String name) throws IOException {
+            return null;
+        }
+
         @Override
         public boolean isMultiRelease() {
             return false;
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java
index fed6986da9..792fa89532 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java
@@ -21,6 +21,7 @@ package org.netbeans.modules.java.source.parsing;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URI;
 import java.util.Set;
 
 import javax.tools.JavaFileObject;
@@ -62,6 +63,11 @@ class CacheFolderArchive implements Archive, 
FileChangeListener {
         return delegate.getFile(name);
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        return delegate.getDirectory(dirName);
+    }
+
     @Override
     public void clear() {
         delegate.clear();
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchive.java
index 8a9b29d56f..9be20747b8 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchive.java
@@ -24,6 +24,8 @@ import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -45,11 +47,13 @@ import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.api.java.classpath.ClassPath;
 import 
org.netbeans.modules.java.preprocessorbridge.spi.JavaFileFilterImplementation;
+import static 
org.netbeans.modules.java.source.parsing.FileObjects.getZipPathURI;
 import org.openide.filesystems.FileAttributeEvent;
 import org.openide.filesystems.FileChangeListener;
 import org.openide.filesystems.FileEvent;
 import org.openide.filesystems.FileRenameEvent;
 import org.openide.filesystems.FileUtil;
+import org.openide.util.BaseUtilities;
 import org.openide.util.Exceptions;
 import org.openide.util.NbBundle;
 import org.openide.util.Parameters;
@@ -199,6 +203,18 @@ public class CachingArchive implements Archive, 
FileChangeListener {
         }
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        Map<String, Folder> folders = doInit();
+
+        if (folders.containsKey(dirName)) {
+            URI zipURI = BaseUtilities.toURI(this.archiveFile);
+            return getZipPathURI(zipURI, dirName);
+        }
+
+        return null;
+    }
+
     @Override
     public String toString() {
         return String.format(
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoader.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoader.java
index 22de204d9e..d58a70f81d 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoader.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoader.java
@@ -23,6 +23,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -177,6 +178,15 @@ public final class CachingArchiveClassLoader extends 
ClassLoader {
                             usedRoots
                                     .map((c) -> RES_PROCESSORS.equals(name) ? 
null : c)
                                     .ifPresent((c) -> c.accept(p.first()));
+                        } else {
+                            URI dirURI = archive.getDirectory(name);
+
+                            if (dirURI != null) {
+                                v.add(dirURI.toURL());
+                                usedRoots
+                                        .map((c) -> 
RES_PROCESSORS.equals(name) ? null : c)
+                                        .ifPresent((c) -> c.accept(p.first()));
+                            }
                         }
                     }
                     return v.elements();
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingPathArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingPathArchive.java
index 8b5cec85ca..9daca61cb3 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingPathArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingPathArchive.java
@@ -41,6 +41,7 @@ import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.api.java.classpath.ClassPath;
 import 
org.netbeans.modules.java.preprocessorbridge.spi.JavaFileFilterImplementation;
+import static 
org.netbeans.modules.java.source.parsing.FileObjects.convertPackage2Folder;
 
 /**
  *
@@ -118,6 +119,21 @@ public class CachingPathArchive extends 
AbstractPathArchive {
         return null;
     }
 
+    @Override
+    @CheckForNull
+    public synchronized URI getDirectory(String dirName) throws IOException {
+        init();
+
+        if (!data.containsKey(dirName)) {
+            return null;
+        }
+
+        final char sep = root.getFileSystem().getSeparator().charAt(0);
+        Path resolved = root.resolve(convertPackage2Folder(dirName, sep));
+
+        return resolved.toUri();
+    }
+
     @Override
     public synchronized void clear() {
         super.clear();
@@ -186,11 +202,11 @@ public class CachingPathArchive extends 
AbstractPathArchive {
                 @Override
                 public FileVisitResult postVisitDirectory(Path dir, 
IOException exc) throws IOException {
                     final State state = states.removeLast();
-                    if (state.currentFolder != EMPTY_FOLDER) {
-                        data.put(
-                            getResourceName(dir),
-                            Arrays.copyOfRange(state.currentFolder, 0, 
state.currentOffset));
-                    }
+
+                    data.put(
+                        getResourceName(dir),
+                        Arrays.copyOfRange(state.currentFolder, 0, 
state.currentOffset));
+
                     return FileVisitResult.CONTINUE;
                 }
             });
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjectArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjectArchive.java
index adf1f45e74..17c43ebbfa 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjectArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjectArchive.java
@@ -22,6 +22,7 @@ package org.netbeans.modules.java.source.parsing;
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -118,6 +119,15 @@ public class FileObjectArchive implements Archive {
         return file == null ? null : FileObjects.sourceFileObject(file, root, 
null, false);
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        FileObject dir = root.getFileObject(dirName);
+        if (dir != null && dir.isFolder()) {
+            return dir.toURI();
+        }
+        return null;
+    }
+
     @Override
     public boolean isMultiRelease() {
         Boolean res = multiRelease;
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjects.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjects.java
index 30c1edaf44..daeb0ca37a 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjects.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FileObjects.java
@@ -949,6 +949,34 @@ public class FileObjects {
         return null;
     }
 
+    public static URI getZipPathURI(URI zipURI, String resourceName) {
+        try {
+            //Optimistic try and see
+            return new URI ("jar:"+zipURI.toString()+"!/"+resourceName); 
//NOI18N
+        } catch (URISyntaxException e) {
+            //Need to encode the resName part (slower)
+            final StringBuilder sb = new StringBuilder ();
+            final String[] elements = resourceName.split("/");           
//NOI18N
+            try {
+                for (int i = 0; i< elements.length; i++) {
+                    String element = elements[i];
+                    element = URLEncoder.encode(element, "UTF-8");       
//NOI18N
+                    element = element.replace("+", "%20");               
//NOI18N
+                    sb.append(element);
+                    if (i< elements.length - 1) {
+                        sb.append(NBFS_SEPARATOR_CHAR);
+                    }
+                }
+                return new URI("jar:"+zipURI.toString()+"!/"+sb.toString());   
 //NOI18N
+            } catch (final UnsupportedEncodingException e2) {
+                throw new IllegalStateException(e2);
+            }
+            catch (final URISyntaxException e2) {
+                throw new IllegalStateException(e2);
+            }
+        }
+    }
+
     // <editor-fold defaultstate="collapsed" desc="Private helper methods">
     private static CharSequence getCharContent(InputStream ins, Charset 
encoding, JavaFileFilterImplementation filter, long expectedLength, boolean 
ignoreEncodingErrors) throws IOException {
         char[] result;
@@ -1642,31 +1670,8 @@ public class FileObjects {
         @Override
         public final URI toUri () {
             URI  zdirURI = this.getArchiveURI();
-            try {
-                //Optimistic try and see
-                return new URI ("jar:"+zdirURI.toString()+"!/"+resName);  
//NOI18N
-            } catch (URISyntaxException e) {
-                //Need to encode the resName part (slower)
-                final StringBuilder sb = new StringBuilder ();
-                final String[] elements = resName.split("/");                 
//NOI18N
-                try {
-                    for (int i = 0; i< elements.length; i++) {
-                        String element = elements[i];
-                        element = URLEncoder.encode(element, "UTF-8");       
//NOI18N
-                        element = element.replace("+", "%20");               
//NOI18N
-                        sb.append(element);
-                        if (i< elements.length - 1) {
-                            sb.append(NBFS_SEPARATOR_CHAR);
-                        }
-                    }
-                    return new 
URI("jar:"+zdirURI.toString()+"!/"+sb.toString());    //NOI18N
-                } catch (final UnsupportedEncodingException e2) {
-                    throw new IllegalStateException(e2);
-                }
-                catch (final URISyntaxException e2) {
-                    throw new IllegalStateException(e2);
-                }
-            }
+
+            return getZipPathURI(zdirURI, resName);
         }
 
         @Override
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FolderArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FolderArchive.java
index 3256273dd9..d35381b9c2 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FolderArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/FolderArchive.java
@@ -22,6 +22,7 @@ package org.netbeans.modules.java.source.parsing;
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.charset.Charset;
@@ -196,6 +197,18 @@ public class FolderArchive implements Archive {
         return null;
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        final String path = dirName.replace('/', File.separatorChar);        
//NOI18N
+        File dir = new File (this.root, path);
+
+        if (dir.isDirectory()) {
+            return dir.toURI();
+        }
+
+        return null;
+    }
+
     @Override
     public String toString() {
         return String.format(
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/PathArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/PathArchive.java
index a9f907ae17..d0b4bbdca1 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/PathArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/PathArchive.java
@@ -84,6 +84,17 @@ public final class PathArchive extends AbstractPathArchive {
                 null;
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        if (separator != FileObjects.NBFS_SEPARATOR_CHAR) {
+            dirName = dirName.replace(FileObjects.NBFS_SEPARATOR_CHAR, 
separator);
+        }
+        final Path target = root.resolve(dirName);
+        return Files.isDirectory(target) ?
+                target.toUri() :
+                null;
+    }
+
     @Override
     public JavaFileObject create(String relativeName, 
JavaFileFilterImplementation filter) throws UnsupportedOperationException {
         throw new UnsupportedOperationException("Write not supported");   
//NOI18N
diff --git 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ProxyArchive.java
 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ProxyArchive.java
index 8033f36e11..1e54b2c661 100644
--- 
a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ProxyArchive.java
+++ 
b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ProxyArchive.java
@@ -20,6 +20,7 @@
 package org.netbeans.modules.java.source.parsing;
 
 import java.io.IOException;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -58,6 +59,17 @@ abstract class ProxyArchive implements Archive {
         return null;
     }
 
+    @Override
+    public URI getDirectory(String dirName) throws IOException {
+        for (Archive delegate : delegates) {
+            final URI dirURI = delegate.getDirectory(dirName);
+            if (dirURI != null) {
+                return dirURI;
+            }
+        }
+        return null;
+    }
+
     @Override
     public void clear() {
         for (Archive delegate : delegates) {
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoaderTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoaderTest.java
new file mode 100644
index 0000000000..ebc4fcd7a8
--- /dev/null
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveClassLoaderTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.source.parsing;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.junit.NbTestCase;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+
+public class CachingArchiveClassLoaderTest extends NbTestCase {
+
+    public CachingArchiveClassLoaderTest(String name) {
+        super(name);
+    }
+
+
+    public void testClassLoaderGetResourcesDir() throws IOException {
+        clearWorkDir();
+
+        File wd = getWorkDir();
+        File dir1 = new File(new File(wd, "dir1"), "a");
+        assertTrue(dir1.mkdirs());
+        File dir2 = new File(new File(wd, "dir2"), "a");
+        assertTrue(dir2.mkdirs());
+        new FileOutputStream(new File(dir2, "test.txt")).close();
+
+        ClassPath cp = ClassPathSupport.createClassPath(wd.getAbsolutePath());
+        ClassLoader loader = CachingArchiveClassLoader.forClassPath(cp, null, 
null);
+
+        assertEquals(dir1.toURI().toURL(), loader.getResource("dir1/a"));
+        assertEquals(dir2.toURI().toURL(), loader.getResource("dir2/a"));
+
+        Enumeration<URL> resource = loader.getResources("dir1/a");
+        assertTrue(resource.hasMoreElements());
+        assertEquals(dir1.toURI().toURL(), resource.nextElement());
+        assertFalse(resource.hasMoreElements());
+    }
+
+}
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveTest.java
index a47f295c7e..a270a9a83c 100644
--- 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveTest.java
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingArchiveTest.java
@@ -19,8 +19,11 @@
 package org.netbeans.modules.java.source.parsing;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.util.Arrays;
 import java.util.Enumeration;
+import java.util.jar.JarOutputStream;
 import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -45,6 +48,7 @@ public class CachingArchiveTest extends NbTestCase {
         TestSuite suite = new NbTestSuite ();
         suite.addTest(new CachingArchiveTest("testPutName"));
         suite.addTest(new CachingArchiveTest("testJoin"));
+        suite.addTest(new CachingArchiveTest("testGetDirectory"));
         return suite;
     }
 
@@ -131,4 +135,21 @@ public class CachingArchiveTest extends NbTestCase {
             }                        
         }
     }
+
+    public void testGetDirectory() throws Exception {
+        clearWorkDir();
+
+        File archive = new File(getWorkDir(), "rt.jar");
+
+        try (OutputStream binOut = new FileOutputStream(archive);
+             JarOutputStream out = new JarOutputStream(binOut)) {
+            out.putNextEntry(new ZipEntry(("dir1/a/")));
+            out.putNextEntry(new ZipEntry(("dir2/a/test.txt")));
+        }
+
+        Archive a = new CachingArchive(archive, false);
+
+        assertEquals("jar:" + archive.toURI().toString() + "!/dir1/a", 
a.getDirectory("dir1/a").toString());
+        assertEquals("jar:" + archive.toURI().toString() + "!/dir2/a", 
a.getDirectory("dir2/a").toString());
+    }
 }
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingPathArchiveTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingPathArchiveTest.java
index 38f3018564..f2c250e906 100644
--- 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingPathArchiveTest.java
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/CachingPathArchiveTest.java
@@ -18,6 +18,8 @@
  */
 package org.netbeans.modules.java.source.parsing;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URI;
 import java.nio.file.FileVisitResult;
@@ -39,6 +41,8 @@ import javax.tools.JavaFileObject;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.java.source.TestUtilities;
 import org.netbeans.junit.NbTestCase;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
 import org.openide.util.BaseUtilities;
 
 /**
@@ -75,6 +79,19 @@ public final class CachingPathArchiveTest extends NbTestCase 
{
         }
     }
 
+    public void testGetDirectory() throws IOException {
+        clearWorkDir();
+        File wd = getWorkDir();
+        File dir1 = new File(new File(wd, "dir1"), "a");
+        assertTrue(dir1.mkdirs());
+        File dir2 = new File(new File(wd, "dir2"), "a");
+        assertTrue(dir2.mkdirs());
+        new FileOutputStream(new File(dir2, "test.txt")).close();
+        Archive a = new CachingPathArchive(wd.toPath(), wd.toURI());
+        assertEquals(dir1.toURI(), a.getDirectory("dir1/a"));
+        assertEquals(dir2.toURI(), a.getDirectory("dir2/a"));
+    }
+
     private static void verifyURIs(Path module) throws IOException {
         final URI javaHome = BaseUtilities.toURI(TestUtilities.getJava9Home());
         final URI rootURI = URI.create("nbjrt:"+javaHome+"!"+module+"/");
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/FileObjectArchiveTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/FileObjectArchiveTest.java
index 21085d61c2..478d6ae1b5 100644
--- 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/FileObjectArchiveTest.java
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/FileObjectArchiveTest.java
@@ -19,6 +19,7 @@
 package org.netbeans.modules.java.source.parsing;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.EnumSet;
@@ -28,6 +29,7 @@ import java.util.stream.StreamSupport;
 import javax.tools.JavaFileManager;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardLocation;
+import static junit.framework.TestCase.assertTrue;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileUtil;
@@ -90,6 +92,17 @@ public class FileObjectArchiveTest extends NbTestCase {
         assertEquals(Arrays.asList("non-package.org.me.X", 
"non-package.org.me.Y"), toInferedName(res));    //NOI18N
     }
 
+    public void testGetDirectory() throws IOException {
+        File dir1 = new File(new File(root, "dir1"), "a");
+        assertTrue(dir1.mkdirs());
+        File dir2 = new File(new File(root, "dir2"), "a");
+        assertTrue(dir2.mkdirs());
+        new FileOutputStream(new File(dir2, "test.txt")).close();
+        final Archive a = new FileObjectArchive(FileUtil.toFileObject(root));
+        assertEquals(dir1.toURI(), a.getDirectory("dir1/a"));
+        assertEquals(dir2.toURI(), a.getDirectory("dir2/a"));
+    }
+
     private static List<String> toInferedName(
             final Iterable<? extends JavaFileObject> jfos) {
         return StreamSupport.stream(jfos.spliterator(), false)
diff --git 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PathArchiveTest.java
 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PathArchiveTest.java
index 1c68089457..df8d296687 100644
--- 
a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PathArchiveTest.java
+++ 
b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PathArchiveTest.java
@@ -18,6 +18,8 @@
  */
 package org.netbeans.modules.java.source.parsing;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.file.FileVisitResult;
 import java.nio.file.FileVisitor;
@@ -35,6 +37,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.tools.JavaFileObject;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.java.source.TestUtilities;
 import org.netbeans.junit.NbTestCase;
@@ -61,6 +65,21 @@ public final class PathArchiveTest extends NbTestCase {
         }
     }
 
+    public void testGetDirectory() throws IOException {
+        clearWorkDir();
+
+        File root = getWorkDir();
+        File dir1 = new File(new File(root, "dir1"), "a");
+        assertTrue(dir1.mkdirs());
+        File dir2 = new File(new File(root, "dir2"), "a");
+        assertTrue(dir2.mkdirs());
+        new FileOutputStream(new File(dir2, "test.txt")).close();
+        Path rootPath = root.toPath();
+        final Archive a = new PathArchive(rootPath, rootPath.toUri());
+        assertEquals(dir1.toURI(), a.getDirectory("dir1/a"));
+        assertEquals(dir2.toURI(), a.getDirectory("dir2/a"));
+    }
+
     private static void verifyModule(Path module) throws IOException {
         final PathArchive pa = new PathArchive(module, null);
         final Map<String,Set<String>> pkgs = getPackages(module);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to