Skip to content

Commit

Permalink
[MODULES-289] Lazily initialize the JAR directory index
Browse files Browse the repository at this point in the history
  • Loading branch information
dmlloyd committed Jun 15, 2017
1 parent fefb3a5 commit a5ba75e
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions src/main/java/org/jboss/modules/JarFileResourceLoader.java
Expand Up @@ -66,7 +66,7 @@ final class JarFileResourceLoader extends AbstractResourceLoader implements Iter
private final URL rootUrl;
private final String relativePath;
private final File fileOfJar;
private final List<String> directory;
private volatile List<String> directory;

// protected by {@code this}
private final Map<CodeSigners, CodeSource> codeSources = new HashMap<>();
Expand Down Expand Up @@ -95,15 +95,6 @@ final class JarFileResourceLoader extends AbstractResourceLoader implements Iter
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Invalid root file specified", e);
}
final Enumeration<JarEntry> entries = jarFile.entries();
List<String> directory = new ArrayList<>();
while (entries.hasMoreElements()) {
final JarEntry jarEntry = entries.nextElement();
if (! jarEntry.isDirectory()) {
directory.add(jarEntry.getName());
}
}
this.directory = directory;
}

private static URI getJarURI(final URI original, final String nestedPath) throws URISyntaxException {
Expand Down Expand Up @@ -264,6 +255,23 @@ public Resource getResource(String name) {
public Iterator<Resource> iterateResources(String startPath, final boolean recursive) {
if (relativePath != null) startPath = startPath.equals("") ? relativePath : relativePath + "/" + startPath;
final String startName = PathUtils.canonicalize(PathUtils.relativize(startPath));
List<String> directory = this.directory;
if (directory == null) {
synchronized (jarFile) {
directory = this.directory;
if (directory == null) {
directory = new ArrayList<>();
final Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
final JarEntry jarEntry = entries.nextElement();
if (! jarEntry.isDirectory()) {
directory.add(jarEntry.getName());
}
}
this.directory = directory;
}
}
}
final Iterator<String> iterator = directory.iterator();
return new Iterator<Resource>() {
private Resource next;
Expand Down

0 comments on commit a5ba75e

Please sign in to comment.