This is an automated email from the ASF dual-hosted git repository. kdoran pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nifi-maven.git
commit 438612e8e30015441d3e5394d60067ccc75aa914 Author: Bryan Bende <[email protected]> AuthorDate: Fri Feb 1 16:50:58 2019 -0500 NIFI-5859 - Removing unused code that was moved to nifi-api, refactored logic for traversing dependencies - Added option to fail build if doc generation fails through enforceDocGeneration property on plugin configuration This closes #8. Signed-off-by: Kevin Doran <[email protected]> --- src/main/java/org/apache/nifi/NarMojo.java | 36 ++--- .../apache/nifi/PropertiesDefinitionWriter.java | 75 ---------- .../java/org/apache/nifi/XmlDefinitionWriter.java | 165 --------------------- .../extension/definition/ExtensionDefinition.java | 15 +- .../nifi/extension/definition/Restriction.java | 29 ---- .../nifi/extension/definition/Restrictions.java | 31 ---- .../extraction/ExtensionClassLoader.java | 10 +- .../extraction/ExtensionClassLoaderFactory.java | 93 +++++------- .../extraction/ExtensionDefinitionFactory.java | 112 +------------- .../extraction/StandardExtensionDefinition.java | 26 +--- .../definition/extraction/StandardRestriction.java | 39 ----- .../extraction/StandardRestrictions.java | 42 ------ 12 files changed, 71 insertions(+), 602 deletions(-) diff --git a/src/main/java/org/apache/nifi/NarMojo.java b/src/main/java/org/apache/nifi/NarMojo.java index 85ebfcf..3627adf 100644 --- a/src/main/java/org/apache/nifi/NarMojo.java +++ b/src/main/java/org/apache/nifi/NarMojo.java @@ -34,7 +34,6 @@ import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.dependency.utils.DependencyStatusSets; import org.apache.maven.plugin.dependency.utils.DependencyUtil; import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter; @@ -50,6 +49,7 @@ import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.project.ProjectBuilder; +import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException; import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter; import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter; @@ -76,19 +76,11 @@ import org.eclipse.aether.RepositorySystemSession; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; -import java.io.Reader; -import java.io.StringWriter; -import java.io.Writer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -479,6 +471,9 @@ public class NarMojo extends AbstractMojo { protected boolean cloneDuringInstanceClassLoading; + @Parameter(property = "enforceDocGeneration", defaultValue = "false", required = false) + protected boolean enforceDocGeneration; + /** * The {@link RepositorySystemSession} used for obtaining the local and remote artifact repositories. */ @@ -501,7 +496,12 @@ public class NarMojo extends AbstractMojo { try { generateDocumentation(); } catch (final Throwable t) { // Catch Throwable in case a linkage error such as NoClassDefFoundError occurs - getLog().warn("Could not generate extensions' documentation", t); + if (enforceDocGeneration) { + getLog().error("Could not generate extensions' documentation", t); + throw t; + } else { + getLog().warn("Could not generate extensions' documentation", t); + } } makeNar(); @@ -522,14 +522,17 @@ public class NarMojo extends AbstractMojo { try { extensionClassLoader = classLoaderFactory.createExtensionClassLoader(); } catch (final Exception e) { - if (getLog().isDebugEnabled()) { - getLog().debug("Unable to create a ClassLoader for documenting extensions. If this NAR contains any NiFi Extensions, those extensions will not be documented.", e); + if (enforceDocGeneration) { + throw new MojoExecutionException("Failed to create Extension Documentation", e); } else { - getLog().warn("Unable to create a ClassLoader for documenting extensions. If this NAR contains any NiFi Extensions, those extensions will not be documented. " + - "Enable mvn DEBUG output for more information (mvn -X)."); + if (getLog().isDebugEnabled()) { + getLog().debug("Unable to create a ClassLoader for documenting extensions. If this NAR contains any NiFi Extensions, those extensions will not be documented.", e); + } else { + getLog().warn("Unable to create a ClassLoader for documenting extensions. If this NAR contains any NiFi Extensions, those extensions will not be documented. " + + "Enable mvn DEBUG output for more information (mvn -X)."); + } + return; } - - return; } @@ -715,7 +718,6 @@ public class NarMojo extends AbstractMojo { .log(getLog()) .project(project) .projectBuilder(projectBuilder) - .remoteRepositories(remoteRepos) .repositorySession(repoSession) .artifactHandlerManager(artifactHandlerManager) .build(); diff --git a/src/main/java/org/apache/nifi/PropertiesDefinitionWriter.java b/src/main/java/org/apache/nifi/PropertiesDefinitionWriter.java deleted file mode 100644 index 402d18c..0000000 --- a/src/main/java/org/apache/nifi/PropertiesDefinitionWriter.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi; - -import org.apache.nifi.extension.definition.ExtensionDefinition; -import org.apache.nifi.extension.definition.Restriction; -import org.apache.nifi.extension.definition.Restrictions; -import org.apache.nifi.extension.definition.ServiceAPIDefinition; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Objects; -import java.util.Properties; - -public class PropertiesDefinitionWriter { - - public void writeDefinition(final ExtensionDefinition definition, final File file) throws IOException { - Objects.requireNonNull(definition); - - final String capabilityDescription = definition.getCapabilityDescription(); - - final Properties properties = new Properties(); - if (capabilityDescription != null) { - properties.setProperty("capability.description", capabilityDescription); - } - - int i=0; - for (final String tag : definition.getTags()) { - properties.setProperty("tags." + (i++), tag); - } - - final Restrictions restrictions = definition.getRestrictions(); - if (restrictions != null) { - final String restrictedDescription = restrictions.getGeneralRestrictionExplanation(); - - if (restrictedDescription != null) { - properties.setProperty("restricted.description", restrictedDescription); - } - - for (final Restriction restriction : restrictions.getRestrictions()) { - properties.setProperty("restriction." + restriction.getIdentifier(), restriction.getExplanation()); - } - } - - int serviceIndex = 0; - for (final ServiceAPIDefinition apiDefinition : definition.getProvidedServiceAPIs()) { - properties.setProperty("service.definition." + serviceIndex + ".class", apiDefinition.getServiceAPIClassName()); - properties.setProperty("service.definition." + serviceIndex + ".groupId", apiDefinition.getServiceGroupId()); - properties.setProperty("service.definition." + serviceIndex + ".artifactId", apiDefinition.getServiceArtifactId()); - properties.setProperty("service.definition." + serviceIndex + ".version", apiDefinition.getServiceVersion()); - - serviceIndex++; - } - - try (final OutputStream fos = new FileOutputStream(file)) { - properties.store(fos, null); - } - } -} diff --git a/src/main/java/org/apache/nifi/XmlDefinitionWriter.java b/src/main/java/org/apache/nifi/XmlDefinitionWriter.java deleted file mode 100644 index 3e91061..0000000 --- a/src/main/java/org/apache/nifi/XmlDefinitionWriter.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi; - -import org.apache.nifi.extension.definition.ExtensionDefinition; -import org.apache.nifi.extension.definition.ExtensionType; -import org.apache.nifi.extension.definition.Restriction; -import org.apache.nifi.extension.definition.Restrictions; -import org.apache.nifi.extension.definition.ServiceAPIDefinition; - -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -public class XmlDefinitionWriter { - - public void writeDefinition(final Collection<ExtensionDefinition> definitions, final File file) throws IOException { - final Map<ExtensionType, List<ExtensionDefinition>> definitionMap = definitions.stream() - .collect(Collectors.groupingBy(ExtensionDefinition::getExtensionType)); - - writeDefinition(definitionMap, file); - } - - public void writeDefinition(final Map<ExtensionType, ? extends Collection<ExtensionDefinition>> definitions, final File file) throws IOException { - Objects.requireNonNull(definitions); - Objects.requireNonNull(file); - - if (definitions.isEmpty()) { - return; - } - - try (final OutputStream fileOut = new FileOutputStream(file)) { - final XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(fileOut, "UTF-8"); - try { - writer.writeStartElement("extensions"); - - writer.writeStartElement("processors"); - writeDefinitions(ExtensionType.PROCESSOR, definitions.get(ExtensionType.PROCESSOR), writer); - writer.writeEndElement(); - - writer.writeStartElement("controllerServices"); - writeDefinitions(ExtensionType.CONTROLLER_SERVICE, definitions.get(ExtensionType.CONTROLLER_SERVICE), writer); - writer.writeEndElement(); - - writer.writeStartElement("reportingTasks"); - writeDefinitions(ExtensionType.REPORTING_TASK, definitions.get(ExtensionType.REPORTING_TASK), writer); - writer.writeEndElement(); - - writer.writeEndElement(); - } finally { - writer.close(); - } - } catch (XMLStreamException e) { - throw new IOException(e); - } - } - - private void writeDefinitions(final ExtensionType extensionType, final Collection<ExtensionDefinition> definitions, final XMLStreamWriter writer) throws XMLStreamException { - if (definitions == null) { - return; - } - - final String tagName; - switch (extensionType) { - case PROCESSOR: - tagName = "processor"; - break; - case CONTROLLER_SERVICE: - tagName = "controllerService"; - break; - case REPORTING_TASK: - tagName = "reportingTask"; - break; - default: - throw new AssertionError("Encountered unknown Extension Type " + extensionType); - } - - for (final ExtensionDefinition definition : definitions) { - writer.writeStartElement(tagName); - - writeTextElement(writer, "name", definition.getExtensionName()); - writeTextElement(writer, "description", definition.getCapabilityDescription()); - - writer.writeStartElement("tags"); - for (final String tag : definition.getTags()) { - writeTextElement(writer, "tag", tag); - } - writer.writeEndElement(); - - final Restrictions restrictions = definition.getRestrictions(); - if (restrictions == null) { - writer.writeEmptyElement("restrictions"); - } else { - writer.writeStartElement("restrictions"); - - writeTextElement(writer, "explanation", restrictions.getGeneralRestrictionExplanation()); - final Set<Restriction> specificRestrictions = restrictions.getRestrictions(); - for (final Restriction restriction : specificRestrictions) { - writer.writeStartElement("restriction"); - writeTextElement(writer, "identifier", restriction.getIdentifier()); - writeTextElement(writer, "explanation", restriction.getExplanation()); - writer.writeEndElement(); - } - - writer.writeEndElement(); - } - - if (extensionType == ExtensionType.CONTROLLER_SERVICE) { - writer.writeStartElement("providedServiceAPIs"); - - final Set<ServiceAPIDefinition> serviceDefinitions = definition.getProvidedServiceAPIs(); - if (serviceDefinitions != null) { - for (final ServiceAPIDefinition serviceDefinition : serviceDefinitions) { - writer.writeStartElement("service"); - - writeTextElement(writer, "className", serviceDefinition.getServiceAPIClassName()); - writeTextElement(writer, "groupId", serviceDefinition.getServiceGroupId()); - writeTextElement(writer, "artifactId", serviceDefinition.getServiceArtifactId()); - writeTextElement(writer, "version", serviceDefinition.getServiceVersion()); - - writer.writeEndElement(); - } - } - - writer.writeEndElement(); - } - - writer.writeEndElement(); - } - } - - private void writeTextElement(final XMLStreamWriter writer, final String tagName, final String text) throws XMLStreamException { - writer.writeStartElement(tagName); - - if (text != null) { - writer.writeCharacters(text); - } - - writer.writeEndElement(); - } -} diff --git a/src/main/java/org/apache/nifi/extension/definition/ExtensionDefinition.java b/src/main/java/org/apache/nifi/extension/definition/ExtensionDefinition.java index 8c0bc40..cbff75e 100644 --- a/src/main/java/org/apache/nifi/extension/definition/ExtensionDefinition.java +++ b/src/main/java/org/apache/nifi/extension/definition/ExtensionDefinition.java @@ -19,20 +19,6 @@ package org.apache.nifi.extension.definition; import java.util.Set; public interface ExtensionDefinition { - /** - * @return the extension's capability description - */ - String getCapabilityDescription(); - - /** - * @return the set of Tags associated with the extension - */ - Set<String> getTags(); - - /** - * @return the Restrictions that are placed on the Extension - */ - Restrictions getRestrictions(); /** * @return the type of Extension @@ -49,4 +35,5 @@ public interface ExtensionDefinition { * @return the name of the Extension */ String getExtensionName(); + } diff --git a/src/main/java/org/apache/nifi/extension/definition/Restriction.java b/src/main/java/org/apache/nifi/extension/definition/Restriction.java deleted file mode 100644 index 9b5064c..0000000 --- a/src/main/java/org/apache/nifi/extension/definition/Restriction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.extension.definition; - -public interface Restriction { - /** - * @return the Restriction identifier used by NiFi - */ - String getIdentifier(); - - /** - * @return an Explanation of why the Restriction exists. - */ - String getExplanation(); -} diff --git a/src/main/java/org/apache/nifi/extension/definition/Restrictions.java b/src/main/java/org/apache/nifi/extension/definition/Restrictions.java deleted file mode 100644 index 5e098fb..0000000 --- a/src/main/java/org/apache/nifi/extension/definition/Restrictions.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.extension.definition; - -import java.util.Set; - -public interface Restrictions { - /** - * @return if the extension has a General Restriction on it, this explains why the Restriction is in place. - */ - String getGeneralRestrictionExplanation(); - - /** - * @return the set of all specific Restrictions that are placed on this extension. - */ - Set<Restriction> getRestrictions(); -} diff --git a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoader.java b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoader.java index 12f02ac..cdc531a 100644 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoader.java +++ b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoader.java @@ -34,7 +34,9 @@ public class ExtensionClassLoader extends URLClassLoader { this.urls = urls; this.narArtifact = narArtifact; this.allArtifacts = new ArrayList<>(otherArtifacts); - allArtifacts.add(narArtifact); + if (narArtifact != null) { + allArtifacts.add(narArtifact); + } } public ExtensionClassLoader(final URL[] urls, final Artifact narArtifact, final Collection<Artifact> otherArtifacts) { @@ -42,7 +44,9 @@ public class ExtensionClassLoader extends URLClassLoader { this.urls = urls; this.narArtifact = narArtifact; this.allArtifacts = new ArrayList<>(otherArtifacts); - allArtifacts.add(narArtifact); + if (narArtifact != null) { + allArtifacts.add(narArtifact); + } } public String getNiFiApiVersion() { @@ -55,7 +59,7 @@ public class ExtensionClassLoader extends URLClassLoader { final ClassLoader parent = getParent(); if (parent instanceof ExtensionClassLoader) { - ((ExtensionClassLoader) parent).getNiFiApiVersion(); + return ((ExtensionClassLoader) parent).getNiFiApiVersion(); } return null; diff --git a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoaderFactory.java b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoaderFactory.java index 7b2e5f7..1147698 100644 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoaderFactory.java +++ b/src/main/java/org/apache/nifi/extension/definition/extraction/ExtensionClassLoaderFactory.java @@ -42,13 +42,14 @@ import org.eclipse.aether.RepositorySystemSession; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.TreeSet; public class ExtensionClassLoaderFactory { private final Log log; @@ -56,7 +57,6 @@ public class ExtensionClassLoaderFactory { private final RepositorySystemSession repoSession; private final ProjectBuilder projectBuilder; private final ArtifactRepository localRepo; - private final List<ArtifactRepository> remoteRepos; private final DependencyTreeBuilder dependencyTreeBuilder; private final ArtifactResolver artifactResolver; private final ArtifactHandlerManager artifactHandlerManager; @@ -67,7 +67,6 @@ public class ExtensionClassLoaderFactory { this.repoSession = builder.repositorySession; this.projectBuilder = builder.projectBuilder; this.localRepo = builder.localRepo; - this.remoteRepos = new ArrayList<>(builder.remoteRepos); this.dependencyTreeBuilder = builder.dependencyTreeBuilder; this.artifactResolver = builder.artifactResolver; this.artifactHandlerManager = builder.artifactHandlerManager; @@ -77,25 +76,18 @@ public class ExtensionClassLoaderFactory { return log; } - public ExtensionClassLoader createExtensionClassLoader() throws MojoExecutionException { - final Set<Artifact> artifacts = new HashSet<>(); - gatherArtifacts(project, artifacts); - - getLog().debug("Project artifacts: "); - artifacts.forEach(artifact -> getLog().debug(artifact.toString())); - + public ExtensionClassLoader createExtensionClassLoader() throws MojoExecutionException, ProjectBuildingException { final Artifact narArtifact = project.getArtifact(); + final Set<Artifact> narArtifacts = getNarDependencies(narArtifact); - final VersionLookup versionLookup = (group, artifact) -> { - try { - return determineProvidedEntityVersion(artifacts, group, artifact); - } catch (final Exception e) { - throw new RuntimeException("Failed to determine provided version of NiFi dependencies", e); - } - }; + final ArtifactsHolder artifactsHolder = new ArtifactsHolder(); + artifactsHolder.addArtifacts(narArtifacts); + + getLog().debug("Project artifacts: "); + narArtifacts.forEach(artifact -> getLog().debug(artifact.getArtifactId())); - final ClassLoader parentClassLoader = createClassLoader(artifacts, versionLookup); - final ExtensionClassLoader classLoader = createClassLoader(artifacts, parentClassLoader, narArtifact); + final ExtensionClassLoader parentClassLoader = createClassLoader(narArtifacts, artifactsHolder); + final ExtensionClassLoader classLoader = createClassLoader(narArtifacts, parentClassLoader, narArtifact); if (getLog().isDebugEnabled()) { getLog().debug("Full ClassLoader is:\n" + classLoader.toTree()); @@ -104,15 +96,19 @@ public class ExtensionClassLoaderFactory { return classLoader; } - private ClassLoader createClassLoader(final Set<Artifact> artifacts, final VersionLookup versionLookup) throws MojoExecutionException { + private ExtensionClassLoader createClassLoader(final Set<Artifact> artifacts, final ArtifactsHolder artifactsHolder) + throws MojoExecutionException, ProjectBuildingException { + final Artifact nar = removeNarArtifact(artifacts); if (nar == null) { - final ClassLoader providedEntityClassLoader = createProvidedEntitiesClassLoader(versionLookup); - return createUrlClassLoader(artifacts, providedEntityClassLoader); + final ExtensionClassLoader providedEntityClassLoader = createProvidedEntitiesClassLoader(artifactsHolder); + return createClassLoader(artifacts, providedEntityClassLoader, null); } final Set<Artifact> narDependencies = getNarDependencies(nar); - return createClassLoader(narDependencies, createClassLoader(narDependencies, versionLookup), nar); + artifactsHolder.addArtifacts(narDependencies); + + return createClassLoader(narDependencies, createClassLoader(narDependencies, artifactsHolder), nar); } @@ -141,7 +137,7 @@ public class ExtensionClassLoaderFactory { narRequest.setRepositorySession(repoSession); narRequest.setSystemProperties(System.getProperties()); - final Set<Artifact> narDependencies = new HashSet<>(); + final Set<Artifact> narDependencies = new TreeSet<>(); try { final ProjectBuildingResult narResult = projectBuilder.build(narArtifact, narRequest); @@ -213,7 +209,6 @@ public class ExtensionClassLoaderFactory { final ArtifactResolutionRequest request = new ArtifactResolutionRequest(); request.setLocalRepository(localRepo); - request.setRemoteRepositories(remoteRepos); request.setArtifact(artifact); final ArtifactResolutionResult result = artifactResolver.resolve(request); @@ -241,15 +236,17 @@ public class ExtensionClassLoaderFactory { return sorted.get(0); } - private ClassLoader createProvidedEntitiesClassLoader(final VersionLookup versionLookup) throws MojoExecutionException { - final String nifiApiVersion = versionLookup.getVersion("org.apache.nifi", "nifi-api"); + private ExtensionClassLoader createProvidedEntitiesClassLoader(final ArtifactsHolder artifactsHolder) + throws MojoExecutionException, ProjectBuildingException { + + final String nifiApiVersion = determineProvidedEntityVersion(artifactsHolder.getAllArtifacts(), "org.apache.nifi", "nifi-api"); if (nifiApiVersion == null) { throw new MojoExecutionException("Could not find any dependency, provided or otherwise, on [org.apache.nifi:nifi-api]"); } else { getLog().info("Found a dependency on version " + nifiApiVersion + " of NiFi API"); } - final String slf4jApiVersion = versionLookup.getVersion("org.slf4j", "slf4j-api"); + final String slf4jApiVersion = determineProvidedEntityVersion(artifactsHolder.getAllArtifacts(),"org.slf4j", "slf4j-api"); final Artifact nifiApiArtifact = getProvidedArtifact("org.apache.nifi", "nifi-api", nifiApiVersion); final Artifact nifiFrameworkApiArtifact = getProvidedArtifact("org.apache.nifi", "nifi-framework-api", nifiApiArtifact.getVersion()); @@ -262,23 +259,10 @@ public class ExtensionClassLoaderFactory { providedArtifacts.add(slf4jArtifact); getLog().debug("Creating Provided Entities Class Loader with artifacts: " + providedArtifacts); - return createUrlClassLoader(providedArtifacts, null); + return createClassLoader(providedArtifacts, null, null); } - private ClassLoader createUrlClassLoader(final Set<Artifact> artifacts, final ClassLoader parent) throws MojoExecutionException { - final Set<URL> urls = new HashSet<>(); - for (final Artifact artifact : artifacts) { - final Set<URL> artifactUrls = toURLs(artifact); - urls.addAll(artifactUrls); - } - - getLog().debug("Creating class loader with following dependencies: " + urls); - - final URL[] urlArray = urls.toArray(new URL[0]); - return new URLClassLoader(urlArray, parent); - } - - private ExtensionClassLoader createClassLoader(final Set<Artifact> artifacts, final ClassLoader parent, final Artifact narArtifact) throws MojoExecutionException { + private ExtensionClassLoader createClassLoader(final Set<Artifact> artifacts, final ExtensionClassLoader parent, final Artifact narArtifact) throws MojoExecutionException { final Set<URL> urls = new HashSet<>(); for (final Artifact artifact : artifacts) { final Set<URL> artifactUrls = toURLs(artifact); @@ -330,7 +314,6 @@ public class ExtensionClassLoaderFactory { final ArtifactResolutionRequest request = new ArtifactResolutionRequest(); request.setLocalRepository(localRepo); - request.setRemoteRepositories(remoteRepos); request.setArtifact(artifact); final ArtifactResolutionResult result = artifactResolver.resolve(request); @@ -338,7 +321,7 @@ public class ExtensionClassLoaderFactory { throw new MojoExecutionException("Could not resolve local dependency " + artifact); } - getLog().info("Resolved Artifact " + artifact + " to " + result.getArtifacts()); + getLog().debug("Resolved Artifact " + artifact + " to " + result.getArtifacts()); for (final Artifact resolved : result.getArtifacts()) { urls.addAll(toURLs(resolved)); @@ -362,7 +345,6 @@ public class ExtensionClassLoaderFactory { private Log log; private MavenProject project; private ArtifactRepository localRepo; - private List<ArtifactRepository> remoteRepos; private DependencyTreeBuilder dependencyTreeBuilder; private ArtifactResolver artifactResolver; private ProjectBuilder projectBuilder; @@ -389,11 +371,6 @@ public class ExtensionClassLoaderFactory { return this; } - public Builder remoteRepositories(final List<ArtifactRepository> remoteRepos) { - this.remoteRepos = remoteRepos; - return this; - } - public Builder dependencyTreeBuilder(final DependencyTreeBuilder dependencyTreeBuilder) { this.dependencyTreeBuilder = dependencyTreeBuilder; return this; @@ -419,8 +396,18 @@ public class ExtensionClassLoaderFactory { } } + private static class ArtifactsHolder { - private interface VersionLookup { - String getVersion(String groupId, String artifactId); + private Set<Artifact> allArtifacts = new TreeSet<>(); + + public void addArtifacts(final Set<Artifact> artifacts) { + if (artifacts != null) { + allArtifacts.addAll(artifacts); + } + } + + public Set<Artifact> getAllArtifacts() { + return allArtifacts; + } } } 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 d0aee68..6203493 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 @@ -17,11 +17,8 @@ package org.apache.nifi.extension.definition.extraction; import org.apache.maven.artifact.Artifact; -import org.apache.maven.plugin.MojoExecutionException; import org.apache.nifi.extension.definition.ExtensionDefinition; import org.apache.nifi.extension.definition.ExtensionType; -import org.apache.nifi.extension.definition.Restriction; -import org.apache.nifi.extension.definition.Restrictions; import org.apache.nifi.extension.definition.ServiceAPIDefinition; import java.io.BufferedReader; @@ -29,9 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.lang.annotation.Annotation; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.URL; import java.util.Collections; import java.util.Enumeration; @@ -39,8 +33,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class ExtensionDefinitionFactory { private static final String SERVICES_DIRECTORY = "META-INF/services/"; @@ -78,17 +70,10 @@ public class ExtensionDefinitionFactory { return definitions; } - private ExtensionDefinition createExtensionDefinition(final ExtensionType extensionType, final String className) throws ClassNotFoundException, - IllegalAccessException, NoSuchMethodException, InvocationTargetException { - + private ExtensionDefinition createExtensionDefinition(final ExtensionType extensionType, final String className) throws ClassNotFoundException { final Class<?> extensionClass = Class.forName(className, false, extensionClassLoader); - - final String capabilityDescription = getCapabilityDescription(extensionClass); - final Set<String> tags = getTags(extensionClass); - final Restrictions restrictions = getRestrictions(extensionClass); final Set<ServiceAPIDefinition> serviceApis = getProvidedServiceAPIs(extensionType, extensionClass); - - return new StandardExtensionDefinition(extensionType, className, capabilityDescription, tags, restrictions, serviceApis); + return new StandardExtensionDefinition(extensionType, className, serviceApis); } private Set<ServiceAPIDefinition> getProvidedServiceAPIs(final ExtensionType extensionType, final Class<?> extensionClass) throws ClassNotFoundException { @@ -116,99 +101,6 @@ public class ExtensionDefinitionFactory { return serviceApis; } - private Restrictions getRestrictions(final Class<?> extensionClass) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { - final String restrictedDescription = getRestrictedDescription(extensionClass); - final Map<String, String> specificRestrictions = getSpecificRestrictions(extensionClass); - - final boolean hasRestriction = restrictedDescription != null || !specificRestrictions.isEmpty(); - final Restrictions restrictions; - if (!hasRestriction) { - return null; - } - - final Set<Restriction> restrictionSet = new HashSet<>(); - for (final Map.Entry<String, String> specificRestriction : specificRestrictions.entrySet()) { - restrictionSet.add(new StandardRestriction(specificRestriction.getKey(), specificRestriction.getValue())); - } - - return new StandardRestrictions(restrictedDescription, restrictionSet); - } - - - private String getCapabilityDescription(final Class<?> extensionClass) throws InvocationTargetException, - IllegalAccessException, NoSuchMethodException, ClassNotFoundException { - - final Class capabilityDescriptionClass = Class.forName("org.apache.nifi.annotation.documentation.CapabilityDescription", false, extensionClass.getClassLoader()); - final Method valueMethod = capabilityDescriptionClass.getMethod("value"); - - final Annotation capabilityDescriptionAnnotation = extensionClass.getAnnotation(capabilityDescriptionClass); - if (capabilityDescriptionAnnotation == null) { - return null; - } - - final String capabilityDescriptionText = (String) valueMethod.invoke(capabilityDescriptionAnnotation); - return capabilityDescriptionText; - } - - - private Set<String> getTags(final Class<?> extensionClass) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { - final Class tagsClass = Class.forName("org.apache.nifi.annotation.documentation.Tags", false, extensionClass.getClassLoader()); - final Method valueMethod = tagsClass.getMethod("value"); - - final Annotation tagsAnnotation = extensionClass.getAnnotation(tagsClass); - if (tagsAnnotation == null) { - return Collections.emptySet(); - } - - final String[] tags = (String[]) valueMethod.invoke(tagsAnnotation); - return Stream.of(tags).collect(Collectors.<String>toSet()); - } - - - private Map<String, String> getSpecificRestrictions(final Class<?> extensionClass) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { - final Class restrictedClass = Class.forName("org.apache.nifi.annotation.behavior.Restricted", false, extensionClass.getClassLoader()); - final Class restrictionClass = Class.forName("org.apache.nifi.annotation.behavior.Restriction", false, extensionClass.getClassLoader()); - final Class requiredPermissionClass = Class.forName("org.apache.nifi.components.RequiredPermission", false, extensionClass.getClassLoader()); - - final Method restrictionsMethod = restrictedClass.getMethod("restrictions"); - final Method explanationMethod = restrictionClass.getMethod("explanation"); - final Method requiredPermissionMethod = restrictionClass.getMethod("requiredPermission"); - final Method getPermissionIdentifierMethod = requiredPermissionClass.getMethod("getPermissionIdentifier"); - - final Annotation restrictionAnnotation = restrictedClass.getAnnotation(restrictedClass); - if (restrictionAnnotation == null) { - return edu.emory.mathcs.backport.java.util.Collections.emptyMap(); - } - - final Object[] restrictionsArray = (Object[]) restrictionsMethod.invoke(restrictionAnnotation); - - final Map<String, String> restrictions = new HashMap<>(); - for (final Object restriction : restrictionsArray) { - final String explanation = (String) explanationMethod.invoke(restriction); - - final Object requiredPermission = requiredPermissionMethod.invoke(restriction); - final String requiredPermissionId = (String) getPermissionIdentifierMethod.invoke(requiredPermission); - - restrictions.put(requiredPermissionId, explanation); - } - - return restrictions; - } - - private String getRestrictedDescription(final Class<?> extensionClass) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { - final Class restrictedClass = Class.forName("org.apache.nifi.annotation.behavior.Restricted", false, extensionClass.getClassLoader()); - final Method valueMethod = restrictedClass.getMethod("value"); - - final Annotation restrictedAnnotation = extensionClass.getAnnotation(restrictedClass); - if (restrictedAnnotation == null) { - return null; - } - - return (String) valueMethod.invoke(restrictedAnnotation); - } - - - 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/StandardExtensionDefinition.java b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardExtensionDefinition.java index dadb747..fe19757 100644 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardExtensionDefinition.java +++ b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardExtensionDefinition.java @@ -18,45 +18,23 @@ package org.apache.nifi.extension.definition.extraction; import org.apache.nifi.extension.definition.ExtensionDefinition; import org.apache.nifi.extension.definition.ExtensionType; -import org.apache.nifi.extension.definition.Restrictions; import org.apache.nifi.extension.definition.ServiceAPIDefinition; import java.util.Set; public class StandardExtensionDefinition implements ExtensionDefinition { - private final String capabilityDescription; - private final Set<String> tags; - private final Restrictions restrictions; + private final ExtensionType extensionType; private final String extensionName; private final Set<ServiceAPIDefinition> providedServiceApis; - public StandardExtensionDefinition(final ExtensionType extensionType, final String extensionName, final String capabilityDescription, final Set<String> tags, final Restrictions restrictions, - final Set<ServiceAPIDefinition> providedServiceApis) { + public StandardExtensionDefinition(final ExtensionType extensionType, final String extensionName, final Set<ServiceAPIDefinition> providedServiceApis) { this.extensionType = extensionType; this.extensionName = extensionName; - this.capabilityDescription = capabilityDescription; - this.tags = tags; - this.restrictions = restrictions; this.providedServiceApis = providedServiceApis; } @Override - public String getCapabilityDescription() { - return capabilityDescription; - } - - @Override - public Set<String> getTags() { - return tags; - } - - @Override - public Restrictions getRestrictions() { - return restrictions; - } - - @Override public ExtensionType getExtensionType() { return extensionType; } diff --git a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestriction.java b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestriction.java deleted file mode 100644 index 6825d5b..0000000 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestriction.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.extension.definition.extraction; - -import org.apache.nifi.extension.definition.Restriction; - -public class StandardRestriction implements Restriction { - private final String identifier; - private final String explanation; - - public StandardRestriction(final String identifier, final String explanation) { - this.identifier = identifier; - this.explanation = explanation; - } - - @Override - public String getIdentifier() { - return identifier; - } - - @Override - public String getExplanation() { - return explanation; - } -} diff --git a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestrictions.java b/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestrictions.java deleted file mode 100644 index 97fa9ba..0000000 --- a/src/main/java/org/apache/nifi/extension/definition/extraction/StandardRestrictions.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.nifi.extension.definition.extraction; - -import org.apache.nifi.extension.definition.Restriction; -import org.apache.nifi.extension.definition.Restrictions; - -import java.util.Set; - -public class StandardRestrictions implements Restrictions { - private final String generalRestrictionExplanation; - private final Set<Restriction> restrictions; - - public StandardRestrictions(final String generalRestrictionExplanation, final Set<Restriction> restrictions) { - this.generalRestrictionExplanation = generalRestrictionExplanation; - this.restrictions = restrictions; - } - - @Override - public String getGeneralRestrictionExplanation() { - return generalRestrictionExplanation; - } - - @Override - public Set<Restriction> getRestrictions() { - return restrictions; - } -}
