You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by jo...@apache.org on 2015/03/21 22:00:45 UTC
[15/29] incubator-nifi git commit: NIFI-309 - Adding DynamicProperty
support
NIFI-309 - Adding DynamicProperty support
Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/bae2b406
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/bae2b406
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/bae2b406
Branch: refs/heads/develop
Commit: bae2b4069b38e32b4b9243e314597f48633c704d
Parents: 72153c9
Author: danbress <db...@onyxconsults.com>
Authored: Wed Mar 18 13:41:57 2015 -0400
Committer: danbress <db...@onyxconsults.com>
Committed: Fri Mar 20 09:49:31 2015 -0400
----------------------------------------------------------------------
.../annotation/behavior/DynamicProperties.java | 26 ++++++++
.../annotation/behavior/DynamicProperty.java | 45 +++++++++++++
.../html/HtmlDocumentationWriter.java | 70 ++++++++++++++++++++
.../example/FullyDocumentedProcessor.java | 2 +
4 files changed, 143 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/bae2b406/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperties.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperties.java b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperties.java
new file mode 100644
index 0000000..4fdfd08
--- /dev/null
+++ b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperties.java
@@ -0,0 +1,26 @@
+package org.apache.nifi.annotation.behavior;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that a component has more than one dynamic property
+ *
+ * @author
+ *
+ */
+@Documented
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface DynamicProperties {
+ /**
+ * A list of the dynamic properties supported by a component
+ * @return A list of the dynamic properties supported by a component
+ */
+ public DynamicProperty[] value();
+}
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/bae2b406/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperty.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperty.java b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperty.java
new file mode 100644
index 0000000..7b2150d
--- /dev/null
+++ b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/behavior/DynamicProperty.java
@@ -0,0 +1,45 @@
+package org.apache.nifi.annotation.behavior;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.nifi.components.ConfigurableComponent;
+
+/**
+ * An annotation that may be placed on a {@link ConfigurableComponent} to
+ * indicate that it supports a dynamic property.
+ *
+ * @author
+ *
+ */
+@Documented
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface DynamicProperty {
+ /**
+ * A description of what the name of the dynamic property may be
+ *
+ * @return A description of what the name of the dynamic property may be
+ */
+ public String name();
+
+ /**
+ * Indicates whether or not the dynamic property supports expression
+ * language
+ *
+ * @return whether or not the dynamic property supports expression
+ * language
+ */
+ public boolean supportsExpressionLanguage() default false;
+
+ /**
+ * Provides a description of what the meaning of the property is, and what the expected values are
+ * @return a description of what the meaning of the property is, and what the expected values are
+ */
+ public String description();
+}
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/bae2b406/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlDocumentationWriter.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlDocumentationWriter.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlDocumentationWriter.java
index 9856c5d..7def25c 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlDocumentationWriter.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlDocumentationWriter.java
@@ -18,6 +18,7 @@ package org.apache.nifi.documentation.html;
import java.io.IOException;
import java.io.OutputStream;
+import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.FactoryConfigurationError;
@@ -26,6 +27,8 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.annotation.behavior.DynamicProperties;
+import org.apache.nifi.annotation.behavior.DynamicProperty;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.SeeAlso;
import org.apache.nifi.annotation.documentation.Tags;
@@ -126,6 +129,7 @@ public class HtmlDocumentationWriter implements DocumentationWriter {
writeDescription(configurableComponent, xmlStreamWriter, hasAdditionalDetails);
writeTags(configurableComponent, xmlStreamWriter);
writeProperties(configurableComponent, xmlStreamWriter);
+ writeDynamicProperties(configurableComponent, xmlStreamWriter);
writeAdditionalBodyInfo(configurableComponent, xmlStreamWriter);
writeSeeAlso(configurableComponent, xmlStreamWriter);
xmlStreamWriter.writeEndElement();
@@ -350,7 +354,73 @@ public class HtmlDocumentationWriter implements DocumentationWriter {
writeSimpleElement(xmlStreamWriter, "p", "This component has no required or optional properties.");
}
}
+
+ /**
+ * Writes a list of the dynamic properties that a processor supports
+ * @param configurableComponent
+ * @param xmlStreamWriter
+ * @throws XMLStreamException
+ */
+ private void writeDynamicProperties(final ConfigurableComponent configurableComponent,
+ final XMLStreamWriter xmlStreamWriter) throws XMLStreamException {
+
+ final List<DynamicProperty> dynamicProperties = getDynamicProperties(configurableComponent);
+
+ if (dynamicProperties != null && dynamicProperties.size() > 0) {
+ writeSimpleElement(xmlStreamWriter, "h3", "Dynamic Properties: ");
+ xmlStreamWriter.writeStartElement("p");
+ xmlStreamWriter
+ .writeCharacters("Dynamic Properties allow the user to specify both the name and value of a property.");
+ xmlStreamWriter.writeStartElement("table");
+ xmlStreamWriter.writeStartElement("tr");
+ writeSimpleElement(xmlStreamWriter, "th", "Name");
+ writeSimpleElement(xmlStreamWriter, "th", "Description");
+ xmlStreamWriter.writeEndElement();
+ for (final DynamicProperty dynamicProperty : dynamicProperties) {
+ xmlStreamWriter.writeStartElement("tr");
+ writeSimpleElement(xmlStreamWriter, "td", dynamicProperty.name());
+ xmlStreamWriter.writeStartElement("td");
+ xmlStreamWriter.writeCharacters(dynamicProperty.description());
+ if (dynamicProperty.supportsExpressionLanguage()) {
+ xmlStreamWriter.writeEmptyElement("br");
+ writeSimpleElement(xmlStreamWriter, "strong", "Supports Expression Language: true");
+ }
+ xmlStreamWriter.writeEndElement();
+ xmlStreamWriter.writeEndElement();
+ }
+
+ xmlStreamWriter.writeEndElement();
+ xmlStreamWriter.writeEndElement();
+ }
+ }
+ /**
+ * Gets the dynamic properties for a configurable component
+ * @param configurableComponent
+ * @return
+ */
+ private List<DynamicProperty> getDynamicProperties(ConfigurableComponent configurableComponent) {
+ final List<DynamicProperty> dynamicProperties = new ArrayList<>();
+ final DynamicProperties dynProps = configurableComponent.getClass().getAnnotation(DynamicProperties.class);
+ if (dynProps != null) {
+ for (final DynamicProperty dynProp : dynProps.value()) {
+ dynamicProperties.add(dynProp);
+ }
+ }
+
+ final DynamicProperty dynProp = configurableComponent.getClass().getAnnotation(DynamicProperty.class);
+ dynamicProperties.add(dynProp);
+
+ return dynamicProperties;
+ }
+
+ /**
+ * Writes an info icon with a description.
+ *
+ * @param xmlStreamWriter
+ * @param description the description of the item
+ * @throws XMLStreamException
+ */
private void writeValidValueDescription(XMLStreamWriter xmlStreamWriter, String description)
throws XMLStreamException {
xmlStreamWriter.writeCharacters(" ");
http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/bae2b406/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/example/FullyDocumentedProcessor.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/example/FullyDocumentedProcessor.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/example/FullyDocumentedProcessor.java
index 84dc88f..1814f51 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/example/FullyDocumentedProcessor.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/test/java/org/apache/nifi/documentation/example/FullyDocumentedProcessor.java
@@ -22,6 +22,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import org.apache.nifi.annotation.behavior.DynamicProperty;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.ReadsAttribute;
import org.apache.nifi.annotation.documentation.SeeAlso;
@@ -43,6 +44,7 @@ import org.apache.nifi.processor.util.StandardValidators;
@WritesAttributes({@WritesAttribute(attribute="first", description="this is the first attribute i write"), @WritesAttribute(attribute="second")})
@ReadsAttribute(attribute = "incoming", description="this specifies the format of the thing")
@SeeAlso(value={FullyDocumentedControllerService.class, FullyDocumentedReportingTask.class}, classNames={"org.apache.nifi.processor.ExampleProcessor"})
+@DynamicProperty(name="the relationship to route to", supportsExpressionLanguage=true, description="some XPath")
public class FullyDocumentedProcessor extends AbstractProcessor {
public static final PropertyDescriptor DIRECTORY = new PropertyDescriptor.Builder().name("Input Directory")