You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by js...@apache.org on 2006/04/05 20:44:47 UTC

svn commit: r391705 - in /incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view: ./ DotViewEndpointListener.java EndpointViewRenderer.java

Author: jstrachan
Date: Wed Apr  5 11:44:46 2006
New Revision: 391705

URL: http://svn.apache.org/viewcvs?rev=391705&view=rev
Log:
added a simple DOT visualiser which renders a graph of components and endpoints available in servicemix

Added:
    incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/
    incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java   (with props)
    incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java   (with props)

Added: 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=391705&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java Wed Apr  5 11:44:46 2006
@@ -0,0 +1,161 @@
+/**
+ *
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.container.ContainerAware;
+import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.framework.ComponentMBeanImpl;
+import org.apache.servicemix.jbi.framework.Endpoint;
+import org.apache.servicemix.jbi.framework.Registry;
+
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Creates a <a href="http://www.graphviz.org/">DOT</a> file showing the various components
+ * and endpoints within ServiceMix
+
+ * @org.apache.xbean.XBean 
+ * description="Generates DOT visualisations of the components and endpoints available inside ServiceMix"
+ * 
+ * @version $Revision$
+ */
+public class DotViewEndpointListener extends EndpointViewRenderer implements ContainerAware {
+
+    private static final Log log = LogFactory.getLog(DotViewEndpointListener.class);
+
+    private JBIContainer container;
+    private String file = "ServiceMixComponents.dot";
+    
+
+    public JBIContainer getContainer() {
+        return container;
+    }
+
+    public void setContainer(JBIContainer container) {
+        System.out.println("####Êregistering container: " + container);
+        this.container = container;
+    }
+
+    public String getFile() {
+        return file;
+    }
+
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+
+    protected void doRender() throws Exception {
+        if (log.isDebugEnabled()) {
+            log.debug("Creating DOT file at: " + file);
+        }
+        System.out.println("####Êcreating: " + file);
+        PrintWriter writer = new PrintWriter(new FileWriter(file));
+        try {
+            generateFile(writer);
+        }
+        finally {
+            writer.close();
+        }
+    }
+
+    protected void generateFile(PrintWriter writer) throws Exception {
+        writer.println("digraph \"Apache ServiceMix\" {");
+        writer.println();
+        writer.println("node [style = \"rounded,filled\", fillcolor = yellow, fontname=\"Helvetica-Oblique\"];");
+        writer.println();
+        writer.println("jbi [label=\"Apache ServiceMix: " + container.getName() + "\"];");
+        writer.println();
+        writer.println("node [fillcolor = green];");
+        writer.println();
+
+        List brokerLinks = new ArrayList();
+        Registry registry = container.getRegistry();
+        Collection components = registry.getComponents();
+        for (Iterator iter = components.iterator(); iter.hasNext();) {
+            ComponentMBeanImpl component = (ComponentMBeanImpl) iter.next();
+            String name = component.getName();
+            String id = encode(name);
+
+            writer.print(id);
+            writer.print(" [ label=\"");
+            writer.print(name);
+            writer.println("\" ];");
+
+            brokerLinks.add("jbi -> " + id);
+        }
+        writer.println();
+        generateLinks(writer, brokerLinks);
+
+        writer.println("node [fillcolor = red];");
+        writer.println();
+
+        List componentEndpointLinks = new ArrayList();
+        Collection endpointMBeans = registry.getEndpointRegistry().getEndpointMBeans();
+        for (Iterator iter = endpointMBeans.iterator(); iter.hasNext();) {
+            Endpoint endpoint = (Endpoint) iter.next();
+            String name = endpoint.getEndpointName();
+            String componentName = encode(endpoint.getComponentName());
+            String id = encode(name);
+            writer.print(id);
+            writer.print(" [ label=\"");
+            writer.print(name);
+            writer.println("\" ];");
+            
+            componentEndpointLinks.add(componentName + " -> " + id);
+        }
+        generateLinks(writer, componentEndpointLinks);
+        
+        writer.println("}");
+    }
+
+    protected void generateLinks(PrintWriter writer, List lines) {
+        for (Iterator iter = lines.iterator(); iter.hasNext();) {
+            writer.print(iter.next().toString());
+            writer.println(";");
+        }
+        writer.println();
+    }
+
+    /**
+     * Lets strip out any non supported characters
+     */
+    protected String encode(String name) {
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0, size = name.length(); i < size; i++) {
+            char ch = name.charAt(i);
+            if (Character.isLetterOrDigit(ch) || ch == '_') {
+                buffer.append(ch);
+            }
+            else {
+                buffer.append('_');
+            }
+        }
+        return buffer.toString();
+    }
+
+
+}

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/DotViewEndpointListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java?rev=391705&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java (added)
+++ incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java Wed Apr  5 11:44:46 2006
@@ -0,0 +1,106 @@
+/**
+ *
+ * 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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.servicemix.jbi.event.EndpointEvent;
+import org.apache.servicemix.jbi.event.EndpointListener;
+
+import javax.jbi.servicedesc.ServiceEndpoint;
+
+/**
+ * A base class for renderings of endpoints which can re-render whenever something
+ * changes or mark things as dirty so that they can be re-rendered on demand or in a time based way
+ * 
+ * @version $Revision$
+ */
+public abstract class EndpointViewRenderer implements EndpointListener {
+
+    private static final Log log = LogFactory.getLog(EndpointViewRenderer.class);
+    
+    private boolean dirty;
+    private boolean rerenderOnChange = true;
+
+    public void render() throws Exception {
+        doRender();
+        dirty = false;
+    }
+
+    public void internalEndpointRegistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void internalEndpointUnregistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void externalEndpointRegistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void externalEndpointUnregistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void linkedEndpointRegistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void linkedEndpointUnregistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void remoteEndpointRegistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    public void remoteEndpointUnregistered(EndpointEvent event) {
+        viewIsDirty(event.getEndpoint());
+    }
+
+    // Properties
+    // -------------------------------------------------------------------------
+    public boolean isRerenderOnChange() {
+        return rerenderOnChange;
+    }
+
+    public void setRerenderOnChange(boolean rerenderOnChange) {
+        this.rerenderOnChange = rerenderOnChange;
+    }
+
+    public boolean isDirty() {
+        return dirty;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+    protected abstract void doRender() throws Exception;
+
+    protected void viewIsDirty(ServiceEndpoint endpoint) {
+        dirty = true;
+        if (rerenderOnChange) {
+            try {
+                render();
+            }
+            catch (Exception e) {
+                log.warn("Failed to render view: " + e, e);
+            }
+        }
+    }
+
+}

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/jbi/view/EndpointViewRenderer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain