You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/04/17 07:36:51 UTC

svn commit: r394610 - in /incubator/servicemix/trunk: servicemix-core/src/main/java/org/apache/servicemix/jbi/view/ servicemix-eip/src/test/java/org/apache/servicemix/eip/ servicemix-eip/src/test/resources/org/apache/servicemix/eip/

Author: gnodet
Date: Sun Apr 16 22:36:49 2006
New Revision: 394610

URL: http://svn.apache.org/viewcvs?rev=394610&view=rev
Log:
Add a visualization listener drawing message exchange flows.

Added:
    incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewFlowListener.java
Modified:
    incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java
    incubator/servicemix/trunk/servicemix-eip/src/test/java/org/apache/servicemix/eip/SpringConfigurationTest.java
    incubator/servicemix/trunk/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml

Modified: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java?rev=394610&r1=394609&r2=394610&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java (original)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java Sun Apr 16 22:36:49 2006
@@ -130,12 +130,19 @@
         writer.println("}");
     }
 
-    protected void generateLinks(PrintWriter writer, List lines) {
+    protected void generateLinks(PrintWriter writer, Collection lines, String style) {
         for (Iterator iter = lines.iterator(); iter.hasNext();) {
             writer.print(iter.next().toString());
+            if (style != null) {
+                writer.print(" [" + style + "]");
+            }
             writer.println(";");
         }
         writer.println();
+    }
+
+    protected void generateLinks(PrintWriter writer, Collection lines) {
+        generateLinks(writer, lines, null);
     }
 
     /**

Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewFlowListener.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewFlowListener.java?rev=394610&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewFlowListener.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewFlowListener.java Sun Apr 16 22:36:49 2006
@@ -0,0 +1,174 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.jbi.view;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.servicedesc.ServiceEndpoint;
+
+import org.apache.servicemix.JbiConstants;
+import org.apache.servicemix.jbi.event.ComponentEvent;
+import org.apache.servicemix.jbi.event.ComponentListener;
+import org.apache.servicemix.jbi.event.EndpointEvent;
+import org.apache.servicemix.jbi.event.ExchangeEvent;
+import org.apache.servicemix.jbi.event.ExchangeListener;
+import org.apache.servicemix.jbi.framework.ComponentMBeanImpl;
+import org.apache.servicemix.jbi.framework.Registry;
+import org.apache.servicemix.jbi.messaging.MessageExchangeImpl;
+import org.apache.servicemix.jbi.servicedesc.EndpointSupport;
+
+import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
+import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * Creates a <a href="http://www.graphviz.org/">DOT</a> file showing the JBI MessageExchange
+ * flow within the JBI Container.
+
+ * @org.apache.xbean.XBean 
+ * description="Generates DOT visualisations of the exchanges flow inside ServiceMix"
+ * 
+ * @version $Revision: 391707 $
+ */
+public class DotViewFlowListener extends DotViewEndpointListener 
+    implements ExchangeListener, ComponentListener {
+
+    private Map flow;
+    private Set flowLinks;
+    
+    public DotViewFlowListener() {
+        setFile("ServiceMixFlow.dot");
+        flow = new ConcurrentHashMap();
+        flowLinks = new CopyOnWriteArraySet();
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+
+    protected void generateFile(PrintWriter writer) throws Exception {
+        writer.println("digraph \"Apache ServiceMix\" {");
+        writer.println();
+        writer.println("label = \"Apache ServiceMix flow\";");
+        writer.println("node [style = \"rounded,filled\", fillcolor = yellow, fontname=\"Helvetica-Oblique\"];");
+        writer.println();
+
+        List brokerLinks = new ArrayList();
+        Registry registry = getContainer().getRegistry();
+        Collection components = registry.getComponents();
+        for (Iterator iter = components.iterator(); iter.hasNext();) {
+            ComponentMBeanImpl component = (ComponentMBeanImpl) iter.next();
+            ServiceEndpoint[] ses = registry.getEndpointsForComponent(component.getComponentNameSpace());
+
+            String name = component.getName();
+            String id = encode(name);
+
+            writer.println("subgraph cluster_" + id + " {");
+            writer.println("  label=\"" + name + "\";");
+            writer.println("  node [fillcolor = yellow];");
+            writer.println("  " + id + " [label=\"" + name + "\"];");
+            writer.println("  node [fillcolor = red];");
+            
+            for (int i = 0; i < ses.length; i++) {
+                String epname = EndpointSupport.getKey(ses[i]);
+                String epid = encode(epname);
+                writer.println("  " + epid + " [label=\"" + epname + "\"];");
+            }
+            
+            writer.println("}");
+        }
+        writer.println();
+        generateLinks(writer, brokerLinks);
+
+        writer.println();
+
+        generateLinks(writer, flowLinks);
+        
+        writer.println("}");
+        
+    }
+
+    public void exchangeSent(ExchangeEvent event) {
+        MessageExchange me = event.getExchange();
+        if (me.getEndpoint() != null &&
+            me instanceof MessageExchangeImpl) {
+            MessageExchangeImpl mei = (MessageExchangeImpl) me;
+            String source = (String) me.getProperty(JbiConstants.SENDER_ENDPOINT);
+            if (source == null) {
+                source = mei.getSourceId().getName();
+            }
+            String dest = EndpointSupport.getKey(mei.getEndpoint());
+            Map componentFlow = (Map) flow.get(source);
+            if (componentFlow.put(dest, Boolean.TRUE) == null) {
+                flowLinks.add(encode(source) + " -> " + encode(dest));
+                viewIsDirty(mei.getEndpoint());
+            }
+        }
+        
+    }
+    
+    protected void createSource(String name) {
+        synchronized (flow) {
+            Map componentFlow = (Map) flow.get(name);
+            if (componentFlow == null) {
+                componentFlow = new ConcurrentHashMap();
+                flow.put(name, componentFlow);
+            }
+        }
+    }
+
+    public void internalEndpointRegistered(EndpointEvent event) {
+        String key = EndpointSupport.getKey(event.getEndpoint());
+        createSource(key);
+        super.internalEndpointRegistered(event);
+    }
+    
+    public void externalEndpointRegistered(EndpointEvent event) {
+        String key = EndpointSupport.getKey(event.getEndpoint());
+        createSource(key);
+        super.externalEndpointRegistered(event);
+    }
+    
+    public void linkedEndpointRegistered(EndpointEvent event) {
+        String key = EndpointSupport.getKey(event.getEndpoint());
+        createSource(key);
+        super.linkedEndpointRegistered(event);
+    }
+    
+    public void componentInstalled(ComponentEvent event) {
+        createSource(event.getComponent().getName());
+    }
+
+    public void componentStarted(ComponentEvent event) {
+        createSource(event.getComponent().getName());
+    }
+
+    public void componentStopped(ComponentEvent event) {
+    }
+
+    public void componentShutDown(ComponentEvent event) {
+    }
+
+    public void componentUninstalled(ComponentEvent event) {
+    }
+
+}

Modified: incubator/servicemix/trunk/servicemix-eip/src/test/java/org/apache/servicemix/eip/SpringConfigurationTest.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-eip/src/test/java/org/apache/servicemix/eip/SpringConfigurationTest.java?rev=394610&r1=394609&r2=394610&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-eip/src/test/java/org/apache/servicemix/eip/SpringConfigurationTest.java (original)
+++ incubator/servicemix/trunk/servicemix-eip/src/test/java/org/apache/servicemix/eip/SpringConfigurationTest.java Sun Apr 16 22:36:49 2006
@@ -20,6 +20,7 @@
 
 import org.apache.servicemix.client.DefaultServiceMixClient;
 import org.apache.servicemix.client.ServiceMixClient;
+import org.apache.servicemix.jbi.container.ActivationSpec;
 import org.apache.servicemix.jbi.jaxp.StringSource;
 import org.apache.servicemix.tck.Receiver;
 import org.apache.servicemix.tck.SpringTestSupport;
@@ -29,7 +30,9 @@
 public class SpringConfigurationTest extends SpringTestSupport {
 
     public void testConfig() throws Exception {
-        ServiceMixClient client = new DefaultServiceMixClient(jbi);
+        ActivationSpec as = new ActivationSpec();
+        as.setComponentName("client");
+        ServiceMixClient client = new DefaultServiceMixClient(jbi, as);
         InOnly me = client.createInOnlyExchange();
         me.setService(new QName("http://test", "wireTap"));
         me.getInMessage().setContent(new StringSource("<test><echo/><world/></test>"));

Modified: incubator/servicemix/trunk/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml?rev=394610&r1=394609&r2=394610&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml (original)
+++ incubator/servicemix/trunk/servicemix-eip/src/test/resources/org/apache/servicemix/eip/spring.xml Sun Apr 16 22:36:49 2006
@@ -3,11 +3,16 @@
   xmlns:eip="http://servicemix.apache.org/eip/1.0" xmlns:test="http://test">
 
   <!-- the JBI container -->
-  <sm:container id="jbi" embedded="true">
+  <sm:container id="jbi" embedded="true">
+    
+    <sm:listeners>
+      <bean class="org.apache.servicemix.jbi.view.DotViewFlowListener" />
+    </sm:listeners>
+    
     <sm:activationSpecs>
 
       <!-- output using a POJO -->
-      <sm:activationSpec>
+      <sm:activationSpec id="servicemix-eip">
         <sm:component>
           <eip:component>
             <eip:endpoints>