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 bc5e6d9  NIFI-10253 Correctly process interface hierarchy for 
controller service APIs (#20)
bc5e6d9 is described below

commit bc5e6d9f1a76d63e1cad3762da38432387877167
Author: Bryan Bende <bbe...@gmail.com>
AuthorDate: Wed Jul 20 14:47:59 2022 -0400

    NIFI-10253 Correctly process interface hierarchy for controller service 
APIs (#20)
    
     Signed-off-by: Kevin Doran <kdo...@apache.org>
---
 .../extraction/ExtensionDefinitionFactory.java     | 53 ++++++++++++++++------
 .../extraction/StandardServiceAPIDefinition.java   | 24 ++++++++++
 2 files changed, 64 insertions(+), 13 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 5e51614..1f2f037 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
@@ -88,19 +88,18 @@ public class ExtensionDefinitionFactory {
     }
 
     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());
-
-                        serviceApis.add(serviceDefinition);
-                    }
-                }
+        final Class<?>[] extensionInterfaces = extensionClass.getInterfaces();
+        if (extensionInterfaces == null) {
+            return;
+        }
+
+        for (final Class<?> immediateInterface : extensionInterfaces) {
+            final Set<Class<?>> interfaceHierarchy = new HashSet<>();
+            interfaceHierarchy.add(immediateInterface);
+            getInterfaceHierarchy(immediateInterface, interfaceHierarchy);
+
+            for (final Class<?> implementedInterface : interfaceHierarchy) {
+                processImplementedInterface(implementedInterface, 
controllerServiceClass, serviceApis);
             }
         }
 
@@ -109,6 +108,34 @@ public class ExtensionDefinitionFactory {
         }
     }
 
+    private void getInterfaceHierarchy(final Class<?> implementedInterface, 
final Set<Class<?>> interfaceHierarchy) {
+        final Class<?>[] parentInterfaces = 
implementedInterface.getInterfaces();
+        if (parentInterfaces == null) {
+            return;
+        }
+
+        for (final Class<?> parentInterface : parentInterfaces) {
+            if (!interfaceHierarchy.contains(parentInterface)) {
+                interfaceHierarchy.add(parentInterface);
+                getInterfaceHierarchy(parentInterface, interfaceHierarchy);
+            }
+        }
+    }
+
+    private void processImplementedInterface(final Class<?> 
implementedInterface, final Class<?> controllerServiceClass, final 
Set<ServiceAPIDefinition> serviceApis) {
+        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());
+
+                serviceApis.add(serviceDefinition);
+            }
+        }
+    }
+
     private Set<String> discoverClassNames(final String extensionType) throws 
IOException {
         final Set<String> classNames = new HashSet<>();
 
diff --git 
a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardServiceAPIDefinition.java
 
b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardServiceAPIDefinition.java
index eb11a2d..a6fe057 100644
--- 
a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardServiceAPIDefinition.java
+++ 
b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardServiceAPIDefinition.java
@@ -18,6 +18,8 @@ package org.apache.nifi.extension.definition.extraction;
 
 import org.apache.nifi.extension.definition.ServiceAPIDefinition;
 
+import java.util.Objects;
+
 public class StandardServiceAPIDefinition implements ServiceAPIDefinition {
     private final String serviceAPIClassName;
     private final String serviceGroupId;
@@ -50,4 +52,26 @@ public class StandardServiceAPIDefinition implements 
ServiceAPIDefinition {
     public String getServiceVersion() {
         return serviceVersion;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final StandardServiceAPIDefinition that = 
(StandardServiceAPIDefinition) o;
+        return serviceAPIClassName.equals(that.serviceAPIClassName)
+                && serviceGroupId.equals(that.serviceGroupId)
+                && serviceArtifactId.equals(that.serviceArtifactId)
+                && serviceVersion.equals(that.serviceVersion);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(serviceAPIClassName, serviceGroupId, 
serviceArtifactId, serviceVersion);
+    }
 }

Reply via email to