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); + } }