private void generateDocumentation()

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