NIFI-309 supporting DynamicRelationships

Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/cce69a2f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/cce69a2f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/cce69a2f

Branch: refs/heads/develop
Commit: cce69a2f947cd66d16fcb154692f9d411dd4c815
Parents: bae2b40
Author: danbress <[email protected]>
Authored: Wed Mar 18 13:59:13 2015 -0400
Committer: danbress <[email protected]>
Committed: Fri Mar 20 09:49:32 2015 -0400

----------------------------------------------------------------------
 .../documentation/DynamicRelationships.java     | 40 +++++++++++++++++
 .../html/HtmlProcessorDocumentationWriter.java  | 46 +++++++++++++++++++-
 .../example/FullyDocumentedProcessor.java       |  2 +
 3 files changed, 86 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/cce69a2f/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/documentation/DynamicRelationships.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/documentation/DynamicRelationships.java
 
b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/documentation/DynamicRelationships.java
new file mode 100644
index 0000000..0047cb1
--- /dev/null
+++ 
b/nifi/nifi-api/src/main/java/org/apache/nifi/annotation/documentation/DynamicRelationships.java
@@ -0,0 +1,40 @@
+package org.apache.nifi.annotation.documentation;
+
+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.PropertyDescriptor;
+import org.apache.nifi.processor.Processor;
+import org.apache.nifi.processor.Relationship;
+
+/**
+ * Annotation to indicate that a {@link Processor} supports dynamic
+ * relationship. A dynamic {@link Relationship} is one where the relationship 
is
+ * generated based on a user defined {@link PropertyDescriptor}
+ * 
+ * @author
+ *
+ */
+@Documented
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface DynamicRelationships {
+    /**
+     * Describes the name(s) of the dynamic relationship(s)
+     * 
+     * @return a description of the name(s) of the dynamic relationship(s)
+     */
+    public String name();
+
+    /**
+     * Describes the data that should be routed to the dynamic relationship(s)
+     * 
+     * @return a description the data that should be routed to the dynamic 
relationship(s)
+     */
+    public String description();
+}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/cce69a2f/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlProcessorDocumentationWriter.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlProcessorDocumentationWriter.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlProcessorDocumentationWriter.java
index af218d8..6eed4dc 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlProcessorDocumentationWriter.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-documentation/src/main/java/org/apache/nifi/documentation/html/HtmlProcessorDocumentationWriter.java
@@ -23,6 +23,7 @@ import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.annotation.documentation.DynamicRelationships;
 import org.apache.nifi.annotation.documentation.ReadsAttribute;
 import org.apache.nifi.annotation.documentation.ReadsAttributes;
 import org.apache.nifi.annotation.documentation.WritesAttribute;
@@ -42,8 +43,9 @@ public class HtmlProcessorDocumentationWriter extends 
HtmlDocumentationWriter {
     @Override
     protected void writeAdditionalBodyInfo(final ConfigurableComponent 
configurableComponent,
             final XMLStreamWriter xmlStreamWriter) throws XMLStreamException {
-        final Processor processor = (Processor) configurableComponent;
+        final Processor processor = (Processor) configurableComponent;
         writeRelationships(processor, xmlStreamWriter);
+        writeDynamicRelationships(processor, xmlStreamWriter);
         writeAttributeInfo(processor, xmlStreamWriter);
     }
 
@@ -199,7 +201,7 @@ public class HtmlProcessorDocumentationWriter extends 
HtmlDocumentationWriter {
      */
     private void writeRelationships(final Processor processor, final 
XMLStreamWriter xmlStreamWriter)
             throws XMLStreamException {
-
+
         writeSimpleElement(xmlStreamWriter, "h3", "Relationships: ");
 
         if (processor.getRelationships().size() > 0) {
@@ -220,4 +222,44 @@ public class HtmlProcessorDocumentationWriter extends 
HtmlDocumentationWriter {
             xmlStreamWriter.writeCharacters("This processor has no 
relationships.");
         }
     }
+
+    /**
+     * Writes dynamic relationship information
+     * 
+     * @param processor
+     * @param xmlStreamWriter
+     * @throws XMLStreamException 
+     */
+    private void writeDynamicRelationships(final Processor processor, final 
XMLStreamWriter xmlStreamWriter) throws XMLStreamException {
+        
+        List<DynamicRelationships> dynamicRelationships = 
getDynamicRelationships(processor);
+
+        if (dynamicRelationships.size() > 0) {
+            writeSimpleElement(xmlStreamWriter, "h3", "Dynamic Relationships: 
");
+            xmlStreamWriter.writeStartElement("table");
+            xmlStreamWriter.writeStartElement("tr");
+            writeSimpleElement(xmlStreamWriter, "th", "Name");
+            writeSimpleElement(xmlStreamWriter, "th", "Description");
+            xmlStreamWriter.writeEndElement();
+
+            for (DynamicRelationships dynamicRelationship : 
dynamicRelationships) {
+                xmlStreamWriter.writeStartElement("tr");
+                writeSimpleElement(xmlStreamWriter, "td", 
dynamicRelationship.name());
+                writeSimpleElement(xmlStreamWriter, "td", 
dynamicRelationship.description());
+                xmlStreamWriter.writeEndElement();
+            }
+            xmlStreamWriter.writeEndElement();
+        }
+    }
+
+    private List<DynamicRelationships> getDynamicRelationships(Processor 
processor) {
+        List<DynamicRelationships> results = new ArrayList<>();
+        
+        DynamicRelationships dynamicRelationships = 
processor.getClass().getAnnotation(DynamicRelationships.class);
+        if (dynamicRelationships != null) {
+            results.add(dynamicRelationships);
+        }
+        
+        return results;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/cce69a2f/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 1814f51..782d305 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
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import org.apache.nifi.annotation.behavior.DynamicProperty;
 import org.apache.nifi.annotation.documentation.CapabilityDescription;
+import org.apache.nifi.annotation.documentation.DynamicRelationships;
 import org.apache.nifi.annotation.documentation.ReadsAttribute;
 import org.apache.nifi.annotation.documentation.SeeAlso;
 import org.apache.nifi.annotation.documentation.Tags;
@@ -45,6 +46,7 @@ import org.apache.nifi.processor.util.StandardValidators;
 @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")
+@DynamicRelationships(name="name from dynamic property", description="all 
files that match the properties XPath")
 public class FullyDocumentedProcessor extends AbstractProcessor {
 
        public static final PropertyDescriptor DIRECTORY = new 
PropertyDescriptor.Builder().name("Input Directory")

Reply via email to