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