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


The following commit(s) were added to refs/heads/main by this push:
     new 03d924c  NIFI-10011 Recursively look for provided API implementations
03d924c is described below

commit 03d924c1028bbb10792f045fe8cb0f5c670f36ae
Author: Bryan Bende <bbe...@gmail.com>
AuthorDate: Tue May 10 13:57:35 2022 -0400

    NIFI-10011 Recursively look for provided API implementations
---
 .../extraction/ExtensionDefinitionFactory.java     | 26 ++++++++++++++--------
 1 file changed, 17 insertions(+), 9 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 d632d19..5e51614 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
@@ -83,22 +83,30 @@ public class ExtensionDefinitionFactory {
 
         final Set<ServiceAPIDefinition> serviceApis = new HashSet<>();
         final Class<?> controllerServiceClass = 
Class.forName("org.apache.nifi.controller.ControllerService", false, 
extensionClassLoader);
+        addProvidedServiceAPIs(controllerServiceClass, extensionClass, 
serviceApis);
+        return serviceApis;
+    }
 
-        for (final Class<?> implementedInterface : 
extensionClass.getInterfaces()) {
-            if (controllerServiceClass.isAssignableFrom(implementedInterface)) 
{
-                final ClassLoader interfaceClassLoader = 
implementedInterface.getClassLoader();
-                if (interfaceClassLoader instanceof ExtensionClassLoader) {
-                    final Artifact interfaceNarArtifact = 
((ExtensionClassLoader) interfaceClassLoader).getNarArtifact();
+    private void addProvidedServiceAPIs(final Class<?> controllerServiceClass, 
final Class<?> extensionClass, final Set<ServiceAPIDefinition> serviceApis) {
+        if (extensionClass.getInterfaces() != null) {
+            for (final Class<?> implementedInterface : 
extensionClass.getInterfaces()) {
+                if 
(controllerServiceClass.isAssignableFrom(implementedInterface) && 
!controllerServiceClass.equals(implementedInterface)) {
+                    final ClassLoader interfaceClassLoader = 
implementedInterface.getClassLoader();
+                    if (interfaceClassLoader instanceof ExtensionClassLoader) {
+                        final Artifact interfaceNarArtifact = 
((ExtensionClassLoader) interfaceClassLoader).getNarArtifact();
 
-                    final ServiceAPIDefinition serviceDefinition = new 
StandardServiceAPIDefinition(implementedInterface.getName(),
-                        interfaceNarArtifact.getGroupId(), 
interfaceNarArtifact.getArtifactId(), interfaceNarArtifact.getBaseVersion());
+                        final ServiceAPIDefinition serviceDefinition = new 
StandardServiceAPIDefinition(implementedInterface.getName(),
+                                interfaceNarArtifact.getGroupId(), 
interfaceNarArtifact.getArtifactId(), interfaceNarArtifact.getBaseVersion());
 
-                    serviceApis.add(serviceDefinition);
+                        serviceApis.add(serviceDefinition);
+                    }
                 }
             }
         }
 
-        return serviceApis;
+        if (extensionClass.getSuperclass() != null) {
+            addProvidedServiceAPIs(controllerServiceClass, 
extensionClass.getSuperclass(), serviceApis);
+        }
     }
 
     private Set<String> discoverClassNames(final String extensionType) throws 
IOException {

Reply via email to