in src/main/java/org/apache/nifi/NarMojo.java [519:630]
private void generateDocumentation() throws MojoExecutionException {
getLog().info("Generating documentation for NiFi extensions in the NAR...");
// Create the ClassLoader for the NAR
final ExtensionClassLoaderFactory classLoaderFactory = createClassLoaderFactory();
final ExtensionClassLoader extensionClassLoader;
try {
extensionClassLoader = classLoaderFactory.createExtensionClassLoader();
} catch (final Exception e) {
if (enforceDocGeneration) {
throw new MojoExecutionException("Failed to create Extension Documentation", e);
} else {
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;
}
}
final File docsFile = getExtensionsDocumentationFile();
createDirectory(docsFile.getParentFile());
final File additionalDetailsDir = new File(docsFile.getParentFile(), "additional-details");
createDirectory(additionalDetailsDir);
try (final OutputStream out = new FileOutputStream(docsFile)) {
final XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(out, "UTF-8");
try {
xmlWriter.writeStartElement("extensionManifest");
// Write current NAR information
writeXmlTag(xmlWriter, "groupId", narGroup);
writeXmlTag(xmlWriter, "artifactId", narId);
writeXmlTag(xmlWriter, "version", narVersion);
// Write parent NAR information
final NarDependency narDependency = getNarDependency();
if (narDependency != null) {
xmlWriter.writeStartElement("parentNar");
writeXmlTag(xmlWriter, "groupId", notEmpty(this.narDependencyGroup) ? this.narDependencyGroup : narDependency.getGroupId());
writeXmlTag(xmlWriter, "artifactId", notEmpty(this.narDependencyId) ? this.narDependencyId : narDependency.getArtifactId());
writeXmlTag(xmlWriter, "version", notEmpty(this.narDependencyVersion) ? this.narDependencyVersion : narDependency.getVersion());
xmlWriter.writeEndElement();
}
// Write system API version
final String nifiApiVersion = extensionClassLoader.getNiFiApiVersion();
xmlWriter.writeStartElement("systemApiVersion");
xmlWriter.writeCharacters(nifiApiVersion);
xmlWriter.writeEndElement();
// Write build info
xmlWriter.writeStartElement("buildInfo");
if (notEmpty(buildTag)) {
writeXmlTag(xmlWriter, "tag", buildTag);
}
if (notEmpty(buildBranch)) {
writeXmlTag(xmlWriter, "branch", buildBranch);
}
if (notEmpty(buildRevision)) {
writeXmlTag(xmlWriter, "revision", buildRevision);
}
xmlWriter.writeEndElement();
// Write extensions
xmlWriter.writeStartElement("extensions");
final Class<?> docWriterClass;
try {
docWriterClass = Class.forName(DOCUMENTATION_WRITER_CLASS_NAME, false, extensionClassLoader);
} catch (ClassNotFoundException e) {
getLog().warn("Cannot locate class " + DOCUMENTATION_WRITER_CLASS_NAME + ", so no documentation will be generated for the extensions in this NAR");
return;
}
getLog().debug("Creating Extension Definition Factory for NiFi API version " + nifiApiVersion);
final ExtensionDefinitionFactory extensionDefinitionFactory = new ExtensionDefinitionFactory(extensionClassLoader);
final ClassLoader currentContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(extensionClassLoader);
final Set<ExtensionDefinition> processorDefinitions = extensionDefinitionFactory.discoverExtensions(ExtensionType.PROCESSOR);
writeDocumentation(processorDefinitions, extensionClassLoader, docWriterClass, xmlWriter, additionalDetailsDir);
final Set<ExtensionDefinition> controllerServiceDefinitions = extensionDefinitionFactory.discoverExtensions(ExtensionType.CONTROLLER_SERVICE);
writeDocumentation(controllerServiceDefinitions, extensionClassLoader, docWriterClass, xmlWriter, additionalDetailsDir);
final Set<ExtensionDefinition> reportingTaskDefinitions = extensionDefinitionFactory.discoverExtensions(ExtensionType.REPORTING_TASK);
writeDocumentation(reportingTaskDefinitions, extensionClassLoader, docWriterClass, xmlWriter, additionalDetailsDir);
} finally {
if (currentContextClassLoader != null) {
Thread.currentThread().setContextClassLoader(currentContextClassLoader);
}
}
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
} finally {
xmlWriter.close();
}
} catch (final Exception ioe) {
throw new MojoExecutionException("Failed to create Extension Documentation", ioe);
}
}