class DocGenerator {

    public static void generate(final NiFiProperties properties) {
        @SuppressWarnings("rawtypes")
        final Set<Class> extensionClasses = new HashSet<>();
        extensionClasses.addAll(ExtensionManager.getExtensions(Processor.class));
        extensionClasses.addAll(ExtensionManager.getExtensions(ControllerService.class));
        extensionClasses.addAll(ExtensionManager.getExtensions(ReportingTask.class));

        final File explodedNiFiDocsDir = properties.getComponentDocumentationWorkingDirectory();

        logger.debug("Generating documentation for: " + extensionClasses.size() + " components in: "
                + explodedNiFiDocsDir);

        for (final Class<?> extensionClass : extensionClasses) {
            if (ConfigurableComponent.class.isAssignableFrom(extensionClass)) {
                final Class<? extends ConfigurableComponent> componentClass = extensionClass.asSubclass(ConfigurableComponent.class);
                try {
                    logger.debug("Documenting: " + componentClass);
                    document(explodedNiFiDocsDir, componentClass);
                } catch (Exception e) {
                    logger.warn("Unable to document: " + componentClass, e);
                }
            }
        }
    }

}