You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/08/15 11:21:03 UTC

svn commit: r566074 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/model/language/ExpressionType.java main/java/org/apache/camel/view/RouteDotGenerator.java test/java/org/apache/camel/view/DotViewTest.java

Author: jstrachan
Date: Wed Aug 15 02:21:02 2007
New Revision: 566074

URL: http://svn.apache.org/viewvc?view=rev&rev=566074
Log:
improved DOT file format that lays things out nicely

Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/view/RouteDotGenerator.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java?view=diff&rev=566074&r1=566073&r2=566074
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/language/ExpressionType.java Wed Aug 15 02:21:02 2007
@@ -125,4 +125,8 @@
     public Predicate getPredicate() {
         return predicate;
     }
+
+    public Expression getExpressionValue() {
+        return expressionValue;
+    }
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/view/RouteDotGenerator.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/view/RouteDotGenerator.java?view=diff&rev=566074&r1=566073&r2=566074
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/view/RouteDotGenerator.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/view/RouteDotGenerator.java Wed Aug 15 02:21:02 2007
@@ -17,11 +17,13 @@
 package org.apache.camel.view;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
 import org.apache.camel.model.*;
 import org.apache.camel.model.language.ExpressionType;
 import org.apache.camel.util.CollectionStringBuffer;
 import org.apache.camel.util.ObjectHelper;
+import static org.apache.camel.util.ObjectHelper.isNotNullAndNonEmpty;
 import static org.apache.camel.util.ObjectHelper.isNullOrBlank;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -43,7 +45,7 @@
     private static final transient Log LOG = LogFactory.getLog(RouteDotGenerator.class);
     private String file = "CamelRoutes.dot";
     private String imagePrefix = "http://www.enterpriseintegrationpatterns.com/img/";
-    private Map<Object, String> idMap = new HashMap<Object, String>();
+    private Map<Object, NodeData> nodeMap = new HashMap<Object, NodeData>();
 
     public String getFile() {
         return file;
@@ -91,16 +93,12 @@
     }
 
     protected void printRoute(PrintWriter writer, RouteType route, FromType input) {
-        String ref = input.getRef();
-        if (isNullOrBlank(ref)) {
-            ref = input.getUri();
-        }
-        String fromID = getID(ref);
+        NodeData nodeData = getNodeData(input);
 
         writer.println();
-        writer.print(fromID);
+        writer.print(nodeData.id);
         writer.println(" [");
-        writer.println("label = \"" + ref + "\"");
+        writer.println("label = \"" + nodeData.label + "\"");
         writer.println("];");
         writer.println();
 
@@ -108,59 +106,73 @@
 
         List<ProcessorType> outputs = route.getOutputs();
         for (ProcessorType output : outputs) {
-            printNode(writer, fromID, output);
+            printNode(writer, nodeData, output);
         }
     }
 
-    protected String printNode(PrintWriter writer, String fromID, ProcessorType node) {
-        String toID = getID(node);
+    protected NodeData printNode(PrintWriter writer, NodeData fromData, ProcessorType node) {
+        NodeData toData = getNodeData(node);
 
         writer.println();
-        writer.print(toID);
+        writer.print(toData.id);
         writer.println(" [");
-        printNodeAttributes(writer, node, fromID);
+        RouteDotGenerator.NodeData nodeData = printNodeAttributes(writer, fromData, toData);
         writer.println("];");
         writer.println();
 
-        writer.print(fromID);
+        writer.print(fromData.id);
         writer.print(" -> ");
-        writer.print(toID);
+        writer.print(toData.id);
         writer.println(" [");
-        // TODO customize the line!
+
+        String label = fromData.edgeLabel;
+        if (isNotNullAndNonEmpty(label)) {
+            writer.println("label = \"" + label + "\"");
+        }
         writer.println("];");
 
         // now lets write any children
         List<ProcessorType> outputs = node.getOutputs();
         for (ProcessorType output : outputs) {
-            printNode(writer, toID, output);
+            NodeData newData = printNode(writer, toData, output);
+            if (!(node instanceof MulticastType)) {
+                toData = newData;
+            }
         }
-        return toID;
+        return toData;
     }
 
     protected class NodeData {
+        public String id;
         public String image;
         public String label;
+        public String edgeLabel;
+        public String tooltop;
+        public String nodeType;
     }
 
-    protected void printNodeAttributes(PrintWriter writer, ProcessorType node, String id) {
-        NodeData nodeData = new NodeData();
-        configureNodeData(node, nodeData);
-
-        String label = nodeData.label;
-        if (label == null) {
-            label = node.toString();
-        }
-        writer.println("label = \"" + label + "\"");
+    protected NodeData printNodeAttributes(PrintWriter writer, NodeData fromData, NodeData nodeData) {
+        writer.println("label = \"" + nodeData.label + "\"");
+        writer.println("tooltip = \"" + nodeData.tooltop + "\"");
 
         String image = nodeData.image;
         if (image != null) {
             writer.println("shapefile = \"" + image + "\"");
             writer.println("shape = custom");
+            writer.println("peripheries=0");
         }
+        return nodeData;
     }
 
-    protected void configureNodeData(ProcessorType node, NodeData nodeData) {
-        if (node instanceof ToType) {
+    protected void configureNodeData(Object node, NodeData nodeData) {
+        if (node instanceof FromType) {
+            FromType fromType = (FromType) node;
+            nodeData.label = fromType.getRef();
+            if (isNullOrBlank(nodeData.label)) {
+                nodeData.label = fromType.getUri();
+            }
+        }
+        else if (node instanceof ToType) {
             ToType toType = (ToType) node;
             String ref = toType.getRef();
             if (isNullOrBlank(ref)) {
@@ -171,7 +183,8 @@
         else if (node instanceof FilterType) {
             FilterType filterType = (FilterType) node;
             nodeData.image = imagePrefix + "MessageFilterIcon.gif";
-            nodeData.label = getLabel(filterType.getExpression());
+            nodeData.edgeLabel = getLabel(filterType.getExpression());
+            nodeData.nodeType = "Message Filter";
         }
         else if (node instanceof ChoiceType) {
             ChoiceType choiceType = (ChoiceType) node;
@@ -181,27 +194,51 @@
             for (WhenType whenType : list) {
                 buffer.append(getLabel(whenType.getExpression()));
             }
-            nodeData.label = buffer.toString();
+            nodeData.edgeLabel = buffer.toString();
+            nodeData.nodeType = "Content Based Router";
         }
         else if (node instanceof RecipientListType) {
             RecipientListType recipientListType = (RecipientListType) node;
             nodeData.image = imagePrefix + "RecipientListIcon.gif";
-            nodeData.label = getLabel(recipientListType.getExpression());
+            nodeData.edgeLabel = getLabel(recipientListType.getExpression());
+            nodeData.nodeType = "Recipient List";
         }
         else if (node instanceof SplitterType) {
             SplitterType splitterType = (SplitterType) node;
             nodeData.image = imagePrefix + "SplitterIcon.gif";
-            nodeData.label = getLabel(splitterType.getExpression());
+            nodeData.edgeLabel = getLabel(splitterType.getExpression());
+            nodeData.nodeType = "Splitter";
         }
         else if (node instanceof AggregatorType) {
             AggregatorType aggregatorType = (AggregatorType) node;
             nodeData.image = imagePrefix + "AggregatorIcon.gif";
-            nodeData.label = getLabel(aggregatorType.getExpression());
+            nodeData.edgeLabel = getLabel(aggregatorType.getExpression());
+            nodeData.nodeType = "Aggregator";
         }
         else if (node instanceof ResequencerType) {
             ResequencerType resequencerType = (ResequencerType) node;
             nodeData.image = imagePrefix + "ResequencerIcon.gif";
-            nodeData.label = getLabel(resequencerType.getExpressions());
+            nodeData.edgeLabel = getLabel(resequencerType.getExpressions());
+            nodeData.nodeType = "Resequencer";
+        }
+
+        // lets auto-default as many values as we can
+        if (nodeData.label == null) {
+            if (isNotNullAndNonEmpty(nodeData.edgeLabel)) {
+                nodeData.label = "";
+            }
+            else {
+                nodeData.label = node.toString();
+            }
+        }
+        if (isNullOrBlank(nodeData.tooltop)) {
+            if (isNotNullAndNonEmpty(nodeData.nodeType)) {
+                String description = isNotNullAndNonEmpty(nodeData.edgeLabel) ? nodeData.edgeLabel : nodeData.label;
+                nodeData.tooltop = nodeData.nodeType + ": " + description;
+            }
+            else {
+                nodeData.tooltop = nodeData.label;
+            }
         }
     }
 
@@ -221,6 +258,10 @@
                 if (predicate != null) {
                     return predicate.toString();
                 }
+                Expression expressionValue = expression.getExpressionValue();
+                if (expressionValue != null) {
+                    return expressionValue.toString();
+                }
             }
             else {
                 return language;
@@ -229,11 +270,13 @@
         return "";
     }
 
-    protected String getID(Object node) {
-        String answer = idMap.get(node);
+    protected NodeData getNodeData(Object node) {
+        NodeData answer = nodeMap.get(node);
         if (answer == null) {
-            answer = "node" + (idMap.size() + 1);
-            idMap.put(node, answer);
+            answer = new NodeData();
+            answer.id = "node" + (nodeMap.size() + 1);
+            configureNodeData(node, answer);
+            nodeMap.put(node, answer);
         }
         return answer;
     }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java?view=diff&rev=566074&r1=566073&r2=566074
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java Wed Aug 15 02:21:02 2007
@@ -18,6 +18,7 @@
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.builder.xml.XPathBuilder;
 
 import java.io.File;
 
@@ -37,7 +38,15 @@
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("direct:start").filter(header("foo").isEqualTo("bar")).to("mock:result");
+                from("direct:simpleFilterRoute").
+                        filter(header("foo").isEqualTo("bar")).
+                        to("mock:result");
+
+                from("direct:filterAndRecipientList").
+                        filter(header("foo").isEqualTo("bar")).
+                        recipientList(header("bar")).
+                        splitter(XPathBuilder.xpath("/invoice/lineItems")).
+                        to("mock:result");
             }
         };
     }