aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRic Harris <harris_ric@hotmail.com>2024-04-24 16:56:27 +0100
committerAlexander Kriegisch <Alexander@Kriegisch.name>2024-04-26 09:58:56 +0200
commit975671fa81f823643adf892f2af0e8120322e682 (patch)
tree87766ad6e9a5ef3cb2105e0c51367c99b75576e7
parentc398a2105d7bf8153c2ef13dea372bcfa6c33a48 (diff)
downloadaspectj-975671fa81f823643adf892f2af0e8120322e682.tar.gz
aspectj-975671fa81f823643adf892f2af0e8120322e682.zip
Improve ClassPathManager performance, caching unfound entries
Fixes #306 and adds a few small optimisations. Co-authored-by: Alexander Kriegisch <Alexander@Kriegisch.name> Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
-rw-r--r--weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java33
1 files changed, 21 insertions, 12 deletions
diff --git a/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java b/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java
index bfef435ec..1730e4b40 100644
--- a/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java
+++ b/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java
@@ -31,9 +31,11 @@ import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -61,20 +63,22 @@ public class ClassPathManager {
private static final int MAXOPEN_DEFAULT = 1000;
- private List<Entry> entries;
+ private final List<Entry> entries;
+
+ private final Set<String> notFound = new HashSet<>(100);
// In order to control how many open files we have, we maintain a list.
// The max number is configured through the property:
// org.aspectj.weaver.openarchives
// and it defaults to 1000
- private List<ZipFile> openArchives = new ArrayList<>();
+ private final List<ZipFile> openArchives = new ArrayList<>();
static {
String openzipsString = getSystemPropertyWithoutSecurityException("org.aspectj.weaver.openarchives",
Integer.toString(MAXOPEN_DEFAULT));
maxOpenArchives = Integer.parseInt(openzipsString);
if (maxOpenArchives < 20) {
- maxOpenArchives = 1000;
+ maxOpenArchives = MAXOPEN_DEFAULT;
}
}
@@ -82,7 +86,7 @@ public class ClassPathManager {
if (trace.isTraceEnabled()) {
trace.enter("<init>", this, new Object[] { classpath==null?"null":classpath.toString(), handler });
}
- entries = new ArrayList<>();
+ entries = new ArrayList<>(classpath == null ? 1 : classpath.size());
for (String classpathEntry: classpath) {
addPath(classpathEntry,handler);
}
@@ -92,6 +96,7 @@ public class ClassPathManager {
}
protected ClassPathManager() {
+ entries = null;
}
public void addPath(String name, IMessageHandler handler) {
@@ -127,6 +132,9 @@ public class ClassPathManager {
trace.enter("find", this, type);
}
String name = type.getName();
+ if (notFound.contains(name)) {
+ return null;
+ }
for (Iterator<Entry> i = entries.iterator(); i.hasNext();) {
Entry entry = i.next();
try {
@@ -151,6 +159,7 @@ public class ClassPathManager {
if (trace.isTraceEnabled()) {
trace.exit("find", null);
}
+ notFound.add(name);
return null;
}
@@ -181,9 +190,9 @@ public class ClassPathManager {
static class ByteBasedClassFile extends ClassFile {
- private byte[] bytes;
+ private final byte[] bytes;
private ByteArrayInputStream bais;
- private String path;
+ private final String path;
public ByteBasedClassFile(byte[] bytes, String path) {
this.bytes = bytes;
@@ -215,7 +224,7 @@ public class ClassPathManager {
}
static class FileClassFile extends ClassFile {
- private File file;
+ private final File file;
private FileInputStream fis;
public FileClassFile(File file) {
@@ -247,7 +256,7 @@ public class ClassPathManager {
}
class DirEntry extends Entry {
- private String dirPath;
+ private final String dirPath;
public DirEntry(File dir) {
this.dirPath = dir.getPath();
@@ -273,8 +282,8 @@ public class ClassPathManager {
}
static class ZipEntryClassFile extends ClassFile {
- private ZipEntry entry;
- private ZipFileEntry zipFile;
+ private final ZipEntry entry;
+ private final ZipFileEntry zipFile;
private InputStream is;
public ZipEntryClassFile(ZipFileEntry zipFile, ZipEntry entry) {
@@ -407,7 +416,7 @@ public class ClassPathManager {
class TypeIdentifier extends SimpleFileVisitor<Path> {
// What are we looking for?
- private String name;
+ private final String name;
// If set, where did we find it?
public Path found;
@@ -586,7 +595,7 @@ public class ClassPathManager {
}
/* private */static boolean hasClassExtension(String name) {
- return name.toLowerCase().endsWith((".class"));
+ return name.toLowerCase().endsWith(".class");
}
public void closeArchives() {