This is an automated email from the ASF dual-hosted git repository. kdoran pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-maven.git
commit cc264428959b9e41f3bc7cae852f43b060bc248a Author: Bryan Bende <bbe...@apache.org> AuthorDate: Thu Dec 1 12:15:52 2022 -0500 NIFI-10927 Remove service files from parent class loader before discovering class names This closes #27. Signed-off-by: Kevin Doran <kdo...@apache.org> --- .../extraction/ExtensionDefinitionFactory.java | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionDefinitionFactory.java b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionDefinitionFactory.java index 1f2f037..d8cabd3 100644 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionDefinitionFactory.java +++ b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionDefinitionFactory.java @@ -137,19 +137,29 @@ public class ExtensionDefinitionFactory { } private Set<String> discoverClassNames(final String extensionType) throws IOException { - final Set<String> classNames = new HashSet<>(); + final Set<URL> resourceUrls = new HashSet<>(); final Enumeration<URL> resources = extensionClassLoader.getResources(SERVICES_DIRECTORY + extensionType); - while (resources.hasMoreElements()) { - final URL resourceUrl = resources.nextElement(); - classNames.addAll(discoverClassNames(extensionClassLoader, resourceUrl)); + resourceUrls.add(resources.nextElement()); } + final ClassLoader parentClassLoader = extensionClassLoader.getParent(); + if (parentClassLoader != null) { + final Enumeration<URL> parentResources = parentClassLoader.getResources(SERVICES_DIRECTORY + extensionType); + while (parentResources.hasMoreElements()) { + resourceUrls.remove(parentResources.nextElement()); + } + } + + final Set<String> classNames = new HashSet<>(); + for (final URL resourceUrl : resourceUrls) { + classNames.addAll(discoverClassNames(resourceUrl)); + } return classNames; } - private Set<String> discoverClassNames(final ClassLoader classLoader, final URL serviceUrl) throws IOException { + private Set<String> discoverClassNames(final URL serviceUrl) throws IOException { final Set<String> classNames = new HashSet<>(); try (final InputStream in = serviceUrl.openStream();