diff --git a/src/main/java/io/neonbee/internal/scanner/ClassPathScanner.java b/src/main/java/io/neonbee/internal/scanner/ClassPathScanner.java index f262a6882..9d876c7b2 100644 --- a/src/main/java/io/neonbee/internal/scanner/ClassPathScanner.java +++ b/src/main/java/io/neonbee/internal/scanner/ClassPathScanner.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -70,6 +71,8 @@ public class ClassPathScanner { */ public static final Pattern SEPARATOR_PATTERN = Pattern.compile(";"); + private static final String NEONBEE_MANIFEST_PREFIX = "NeonBee-"; + private final ClassLoader classLoader; /** @@ -195,14 +198,15 @@ public Future> scanForAnnotation(Vertx vertx, ElementType... elementTypes) { Future> classesFromDirectories = scanWithPredicate(vertx, ClassPathScanner::isClassFile); - Future> classesFromJars = scanJarFilesWithPredicate(vertx, ClassPathScanner::isClassFile) - .map(uris -> { - List result = new ArrayList<>(uris.size()); - for (URI uri : uris) { - result.add(JarHelper.extractFilePath(uri)); - } - return result; - }); + Future> classesFromJars = + scanJarFilesWithPredicate(vertx, ClassPathScanner::isClassFile, ClassPathScanner::isNeonBeeJar) + .map(uris -> { + List result = new ArrayList<>(uris.size()); + for (URI uri : uris) { + result.add(JarHelper.extractFilePath(uri)); + } + return result; + }); return Future.all(classesFromDirectories, classesFromJars).compose(v -> vertx.executeBlocking(() -> { List classVisitors = new ArrayList<>(annotationClasses.size()); @@ -282,12 +286,16 @@ public Future> scanWithPredicate(Vertx vertx, Predicate pre * @return a future to a list of URIs representing the files which matches the given predicate */ public Future> scanJarFilesWithPredicate(Vertx vertx, Predicate predicate) { + return scanJarFilesWithPredicate(vertx, predicate, url -> true); + } + + private Future> scanJarFilesWithPredicate(Vertx vertx, Predicate predicate, + Predicate jarFilter) { return vertx.executeBlocking(() -> { List resources = new ArrayList<>(); for (URL manifestResource : getManifestResourceURLs()) { URI uri = manifestResource.toURI(); - // filter for manifest files inside of jar files - if ("jar".equals(uri.getScheme())) { + if ("jar".equals(uri.getScheme()) && jarFilter.test(manifestResource)) { try (FileSystem fileSystem = FileSystems.newFileSystem(uri, Map.of())) { Path rootPath = fileSystem.getPath("/"); scanDirectoryWithPredicateRecursive(rootPath, predicate) @@ -299,6 +307,21 @@ public Future> scanJarFilesWithPredicate(Vertx vertx, Predicate testContext.verify(() -> { + assertThat(list).isEmpty(); + testContext.completeNow(); + }))); + } + @Test @DisplayName("Should find classes which the class or any field or method within is annotated with a given annotation") void scanForAnnotation(Vertx vertx, VertxTestContext testContext) throws IOException {