NIFI-5859 Modifications to extension manifest generation to better support unmarshalling XML into pojos

- Fixing doc generation for providedServiceAPIs

This closes #3338.

Signed-off-by: Kevin Doran <kdoran@apache.org>
This commit is contained in:
Bryan Bende 2019-02-26 16:37:48 -05:00 committed by Kevin Doran
parent 32bd7ed8b4
commit 5249a85030
No known key found for this signature in database
GPG Key ID: 5621A6244B77AC02
5 changed files with 103 additions and 43 deletions

View File

@ -48,6 +48,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@ -67,25 +68,7 @@ import java.util.Set;
public abstract class AbstractDocumentationWriter implements ExtensionDocumentationWriter {
@Override
public final void write(final ConfigurableComponent component) throws IOException {
write(component, null);
}
@Override
public final void write(final ConfigurableComponent component, final Collection<ProvidedServiceAPI> providedServices) throws IOException {
initialize(component);
writeHeader(component);
writeBody(component);
if (providedServices != null && component instanceof ControllerService) {
writeProvidedServices(providedServices);
}
writeFooter(component);
}
private void initialize(final ConfigurableComponent component) {
public void initialize(final ConfigurableComponent component) {
try {
if (component instanceof Processor) {
initialize((Processor) component);
@ -111,13 +94,30 @@ public abstract class AbstractDocumentationWriter implements ExtensionDocumentat
reportingTask.initialize(new DocumentationReportingInitializationContext());
}
protected void writeBody(final ConfigurableComponent component) throws IOException {
@Override
public final void write(final ConfigurableComponent component) throws IOException {
write(component, null, null);
}
@Override
public final void write(final ConfigurableComponent component, final Collection<ServiceAPI> providedServices, Map<String,ServiceAPI> propertyServices) throws IOException {
writeHeader(component);
writeBody(component, propertyServices);
if (providedServices != null && component instanceof ControllerService) {
writeProvidedServices(providedServices);
}
writeFooter(component);
}
protected void writeBody(final ConfigurableComponent component, Map<String,ServiceAPI> propertyServices) throws IOException {
writeExtensionName(component.getClass().getName());
writeExtensionType(getExtensionType(component));
writeDeprecationNotice(component.getClass().getAnnotation(DeprecationNotice.class));
writeDescription(getDescription(component));
writeTags(getTags(component));
writeProperties(component.getPropertyDescriptors());
writeProperties(component.getPropertyDescriptors(), propertyServices);
writeDynamicProperties(getDynamicProperties(component));
if (component instanceof Processor) {
@ -251,7 +251,7 @@ public abstract class AbstractDocumentationWriter implements ExtensionDocumentat
protected abstract void writeTags(List<String> tags) throws IOException;
protected abstract void writeProperties(List<PropertyDescriptor> properties) throws IOException;
protected abstract void writeProperties(List<PropertyDescriptor> properties, Map<String,ServiceAPI> propertyServices) throws IOException;
protected abstract void writeDynamicProperties(List<DynamicProperty> dynamicProperties) throws IOException;
@ -278,7 +278,7 @@ public abstract class AbstractDocumentationWriter implements ExtensionDocumentat
// ControllerService-specific methods
protected abstract void writeProvidedServices(Collection<ProvidedServiceAPI> providedServices) throws IOException;
protected abstract void writeProvidedServices(Collection<ServiceAPI> providedServices) throws IOException;
protected abstract void writeFooter(ConfigurableComponent component) throws IOException;

View File

@ -20,6 +20,7 @@ import org.apache.nifi.components.ConfigurableComponent;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
/**
* Generates documentation for an instance of a ConfigurableComponent.
@ -35,8 +36,29 @@ import java.util.Collection;
*/
public interface ExtensionDocumentationWriter {
/**
* Calls initialize on the component. Must be called before calling any write methods.
*
* @param component the component to initialize
*/
void initialize(final ConfigurableComponent component);
/**
* Write the documentation for the given component.
*
* @param component the component to document
* @throws IOException if an error occurs writing the documentation
*/
void write(ConfigurableComponent component) throws IOException;
void write(ConfigurableComponent component, Collection<ProvidedServiceAPI> provideServices) throws IOException;
/**
* Writes the documentation for the given component.
*
* @param component the component to document
* @param provideServices the service APIs implemented by the component
* @param propertyServiceAPIs the service APIs required by the property descriptors of the component
* @throws IOException if an error occurs writing the documentation
*/
void write(ConfigurableComponent component, Collection<ServiceAPI> provideServices, Map<String,ServiceAPI> propertyServiceAPIs) throws IOException;
}

View File

@ -28,7 +28,7 @@ package org.apache.nifi.documentation;
* <b>NOTE WELL:</b> At this time, while this class is part of nifi-api, it is still evolving and may change in a non-backward-compatible manner or even be
* removed from one incremental release to the next. Use at your own risk!
*/
public interface ProvidedServiceAPI {
public interface ServiceAPI {
/**
* @return the fully qualified class name of the interface implemented by the Controller Service
*/

View File

@ -16,13 +16,13 @@
*/
package org.apache.nifi.documentation;
public class StandardProvidedServiceAPI implements ProvidedServiceAPI {
public class StandardServiceAPI implements ServiceAPI {
private final String className;
private final String groupId;
private final String artifactId;
private final String version;
public StandardProvidedServiceAPI(final String className, final String groupId, final String artifactId, final String version) {
public StandardServiceAPI(final String className, final String groupId, final String artifactId, final String version) {
this.className = className;
this.groupId = groupId;
this.artifactId = artifactId;

View File

@ -33,7 +33,7 @@ import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.RequiredPermission;
import org.apache.nifi.documentation.AbstractDocumentationWriter;
import org.apache.nifi.documentation.ExtensionType;
import org.apache.nifi.documentation.ProvidedServiceAPI;
import org.apache.nifi.documentation.ServiceAPI;
import org.apache.nifi.processor.Relationship;
import javax.xml.stream.XMLOutputFactory;
@ -46,6 +46,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@ -132,19 +133,44 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
}
@Override
protected void writeProperties(final List<PropertyDescriptor> properties) throws IOException {
writeArray("properties", properties, this::writeProperty);
protected void writeProperties(final List<PropertyDescriptor> properties, Map<String,ServiceAPI> propertyServices) throws IOException {
writeStartElement("properties");
if (properties != null) {
for (final PropertyDescriptor property : properties) {
writeProperty(property, propertyServices);
}
}
writeEndElement();
}
private void writeProperty(final PropertyDescriptor property) throws IOException {
private void writeProperty(final PropertyDescriptor property, Map<String,ServiceAPI> propertyServices) throws IOException {
writeStartElement("property");
writeTextElement("name", property.getName());
writeTextElement("displayName", property.getDisplayName());
writeTextElement("description", property.getDescription());
writeTextElement("defaultValue", property.getDefaultValue());
writeTextElement("controllerServiceDefinition", property.getControllerServiceDefinition() == null ? null : property.getControllerServiceDefinition().getName());
writeTextArray("allowableValues", "allowableValue", property.getAllowableValues(), AllowableValue::getDisplayName);
if (property.getControllerServiceDefinition() != null) {
writeStartElement("controllerServiceDefinition");
final ServiceAPI serviceAPI = propertyServices.get(property.getName());
if (serviceAPI != null) {
writeTextElement("className", serviceAPI.getClassName());
writeTextElement("groupId", serviceAPI.getGroupId());
writeTextElement("artifactId", serviceAPI.getArtifactId());
writeTextElement("version", serviceAPI.getVersion());
} else {
writeTextElement("className", property.getControllerServiceDefinition().getName());
writeTextElement("groupId", "unknown");
writeTextElement("artifactId", "unknown");
writeTextElement("version", "unknown");
}
writeEndElement();
}
writeArray("allowableValues", property.getAllowableValues(), this::writeAllowableValue);
writeBooleanElement("required", property.isRequired());
writeBooleanElement("sensitive", property.isSensitive());
writeBooleanElement("expressionLanguageSupported", property.isExpressionLanguageSupported());
@ -155,9 +181,17 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
writeEndElement();
}
private void writeAllowableValue(final AllowableValue allowableValue) throws IOException {
writeStartElement("allowableValue");
writeTextElement("displayName", allowableValue.getDisplayName());
writeTextElement("value", allowableValue.getValue());
writeTextElement("description", allowableValue.getDescription());
writeEndElement();
}
@Override
protected void writeDynamicProperties(final List<DynamicProperty> dynamicProperties) throws IOException {
writeArray("dynamicProperty", dynamicProperties, this::writeDynamicProperty);
writeArray("dynamicProperties", dynamicProperties, this::writeDynamicProperty);
}
private void writeDynamicProperty(final DynamicProperty property) throws IOException {
@ -189,7 +223,9 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
writeStartElement("restricted");
if (restricted != null) {
writeTextElement("generalRestrictionExplanation", restricted.value());
if (restricted.value() != null && !restricted.value().isEmpty()) {
writeTextElement("generalRestrictionExplanation", restricted.value());
}
final Restriction[] restrictions = restricted.restrictions();
if (restrictions != null) {
@ -222,7 +258,7 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
}
private void writeSystemResourceConsideration(final SystemResourceConsideration consideration) throws IOException {
writeStartElement("consideration");
writeStartElement("systemResourceConsideration");
writeTextElement("resource", consideration.resource() == null ? null : consideration.resource().name());
writeTextElement("description", consideration.description());
@ -285,7 +321,7 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
}
private void writeReadsAttribute(final ReadsAttribute attribute) throws IOException {
writeStartElement("attribute");
writeStartElement("readsAttribute");
writeTextElement("name", attribute.attribute());
writeTextElement("description", attribute.description());
writeEndElement();
@ -297,7 +333,7 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
}
private void writeWritesAttribute(final WritesAttribute attribute) throws IOException {
writeStartElement("attribute");
writeStartElement("writesAttribute");
writeTextElement("name", attribute.attribute());
writeTextElement("description", attribute.description());
writeEndElement();
@ -309,17 +345,19 @@ public class XmlDocumentationWriter extends AbstractDocumentationWriter {
}
@Override
protected void writeProvidedServices(final Collection<ProvidedServiceAPI> providedServices) throws IOException {
writeStartElement("providedServiceAPIs");
writeArray("service", providedServices, this::writeProvidedService);
writeEndElement();
protected void writeProvidedServices(final Collection<ServiceAPI> providedServices) throws IOException {
writeArray("providedServiceAPIs", providedServices, this::writeProvidedService);
}
private void writeProvidedService(final ProvidedServiceAPI service) throws IOException {
private void writeProvidedService(final ServiceAPI service) throws IOException {
writeStartElement("providedServiceAPI");
writeTextElement("className",service.getClassName());
writeTextElement("groupId",service.getGroupId());
writeTextElement("artifactId",service.getArtifactId());
writeTextElement("version",service.getVersion());
writeEndElement();
}
private <T> void writeArray(final String tagName, final Collection<T> values, final ElementWriter<T> writer) throws IOException {