From dd4799a9809cd2ffaa2e9598a8c1408405e25202 Mon Sep 17 00:00:00 2001 From: rfeng Date: Mon, 19 Sep 2011 22:55:55 +0000 Subject: Add the support to generate the SCA diagram for a given node configuration git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1172882 13f79535-47bb-0310-9956-ffa450edef68 --- .../tuscany/sca/diagram/artifacts/Artifact.java | 36 ++++++++++++++ .../sca/diagram/generator/DiagramGenerator.java | 11 +++-- .../apache/tuscany/sca/diagram/layout/Entity.java | 7 +++ .../tuscany/sca/diagram/layout/EntityBuilder.java | 16 +++---- .../layout/TuscanyCompositeEntityBuilder.java | 50 ++++++++++++++----- .../org/apache/tuscany/sca/diagram/main/Main.java | 56 +++++++++++++++++++--- 6 files changed, 143 insertions(+), 33 deletions(-) (limited to 'sca-java-2.x/trunk/modules/composite-diagram/src/main/java') diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/artifacts/Artifact.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/artifacts/Artifact.java index 0a16a797c2..4751cff023 100644 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/artifacts/Artifact.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/artifacts/Artifact.java @@ -117,4 +117,40 @@ public abstract class Artifact { return containerName; } + /** + * Parse the component/service|reference/binding names + * @param compoundName + * @return An array of names + */ + public static String[] parseNames(String compoundName) { + String[] names = new String[] {"", "", ""}; + if (compoundName != null) { + String[] parts = compoundName.split("/"); + for (int i = 0; i < parts.length; i++) { + names[i] = parts[i]; + } + } + return names; + } + + public static boolean matches(String compoundName, String... parts) { + String names[] = parseNames(compoundName); + if (parts.length > names.length) { + return false; + } + for (int i = 0; i < parts.length; i++) { + if (parts[i].length() > 0 && names[i].length() > 0 && !names[i].equals(parts[i])) { + return false; + } + } + return true; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Artifact [containerName=").append(containerName).append(", name=").append(name).append("]"); + return builder.toString(); + } + } diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/generator/DiagramGenerator.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/generator/DiagramGenerator.java index b7ff1b47e7..9b72d7d25a 100755 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/generator/DiagramGenerator.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/generator/DiagramGenerator.java @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.Map.Entry; import org.apache.batik.dom.svg.SVGDOMImplementation; +import org.apache.tuscany.sca.diagram.artifacts.Artifact; import org.apache.tuscany.sca.diagram.artifacts.ComponentArtifact; import org.apache.tuscany.sca.diagram.artifacts.CompositeArtifact; import org.apache.tuscany.sca.diagram.artifacts.Constant; @@ -154,7 +155,7 @@ public class DiagramGenerator { String compositeRef = entry.getKey(); ArrayList componentRef = entry.getValue(); - ReferenceArtifact r1 = getRef(compositeRef); + ReferenceArtifact r1 = getRef(comp.getName() + "/" + compositeRef); for (String ref : componentRef) { @@ -175,7 +176,7 @@ public class DiagramGenerator { String compositeSer = entry.getKey(); String componentSer = entry.getValue(); - ServiceArtifact s1 = getSer(compositeSer); + ServiceArtifact s1 = getSer(comp.getName() + "/" + compositeSer); ServiceArtifact s2 = getSer(componentSer); if (s1 != null && s2 != null) { @@ -238,7 +239,7 @@ public class DiagramGenerator { String ref = entry.getKey(); String ser = entry.getValue(); - ReferenceArtifact r = getRef(ref); + ReferenceArtifact r = getRef(ent.getName() + "/" + ref); ServiceArtifact s = getSer(ser); if (r != null && s != null) { @@ -292,7 +293,7 @@ public class DiagramGenerator { private ServiceArtifact getSer(String ser) { for (ServiceArtifact s : sers) { - if (s.getContainerName().equals(ser) || s.getName().equals(ser)) { + if (Artifact.matches(ser, s.getContainerName(), s.getName())) { return s; } } @@ -303,7 +304,7 @@ public class DiagramGenerator { for (ReferenceArtifact r : refs) { - if (r.getContainerName().equals(ref) || r.getName().equals(ref)) { + if (Artifact.matches(ref, r.getContainerName(), r.getName())) { return r; } } diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/Entity.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/Entity.java index 1736cbf3b7..469c59cf4f 100755 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/Entity.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/Entity.java @@ -284,5 +284,12 @@ public abstract class Entity { this.implementation = implementation; } + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Entity [id=").append(id).append(", name=").append(name).append("]"); + return builder.toString(); + } + } diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/EntityBuilder.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/EntityBuilder.java index 70171e484c..64ac2db409 100755 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/EntityBuilder.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/EntityBuilder.java @@ -121,7 +121,7 @@ public class EntityBuilder { if (service == null) { composite.addToPromoteAService(compositeSer, serviceComp); } else { - composite.addToPromoteAService(compositeSer, service); + composite.addToPromoteAService(compositeSer, serviceComp + "/" + service); } } @@ -157,7 +157,7 @@ public class EntityBuilder { if (reference == null) { composite.addToPromoteAReference(compositeRef, referenceComp); } else { - composite.addToPromoteAReference(compositeRef, reference); + composite.addToPromoteAReference(compositeRef, referenceComp + "/" + reference); } } @@ -504,12 +504,12 @@ public class EntityBuilder { if (reference != null && service != null) { - ent.addToRefToSerMap(reference, service); + ent.addToRefToSerMap(reference, serviceComp + "/" + service); ent.addAnAdjacentEntity(serviceComp); addToConnectedEntities(referenceComp, serviceComp); addToConnectedEntities(serviceComp, referenceComp); } else if (reference == null && service != null) { - ent.addToRefToSerMap(referenceComp, service); + ent.addToRefToSerMap(referenceComp, serviceComp + "/" + service); ent.addAnAdjacentEntity(serviceComp); addToConnectedEntities(referenceComp, serviceComp); addToConnectedEntities(serviceComp, referenceComp); @@ -708,13 +708,13 @@ public class EntityBuilder { } } } - - private String extractClassName(String classAttr){ - if(classAttr==null) { + + private String extractClassName(String classAttr) { + if (classAttr == null) { return ""; } else { int index = classAttr.lastIndexOf('.'); - return classAttr.substring(index+1); + return classAttr.substring(index + 1); } } diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/TuscanyCompositeEntityBuilder.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/TuscanyCompositeEntityBuilder.java index 1a9b59e486..82a8e2a32a 100755 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/TuscanyCompositeEntityBuilder.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/layout/TuscanyCompositeEntityBuilder.java @@ -30,10 +30,13 @@ import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.Composite; import org.apache.tuscany.sca.assembly.CompositeReference; import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference; import org.apache.tuscany.sca.assembly.Property; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.assembly.Wire; +import org.apache.tuscany.sca.diagram.artifacts.Artifact; public class TuscanyCompositeEntityBuilder { @@ -61,15 +64,16 @@ public class TuscanyCompositeEntityBuilder { ComponentEntity[] comps = buildComponentEntities(); + buildTargets(comps); buildWires(tuscanyComp.getWires(), comps); composite = new CompositeEntity(compositeName); setParent(comps); - System.out.println("ComponentEntity " + comps[0].getId()); + // System.out.println("ComponentEntity " + comps[0].getId()); int[][] conns = buildConnectionMatrix(comps); - System.out.println("ComponentEntity " + conns[0][0]); + // System.out.println("ComponentEntity " + conns[0][0]); composite.setComponentList(comps); composite.setConnections(conns); @@ -77,7 +81,7 @@ public class TuscanyCompositeEntityBuilder { LayoutBuilder buildLayout = new LayoutBuilder(comps, conns); buildLayout.placeEntities(); - System.out.println("conns " + conns[0][0]); + // System.out.println("conns " + conns[0][0]); buildCompositeService(); buildCompositeReference(); @@ -173,20 +177,24 @@ public class TuscanyCompositeEntityBuilder { } private String extractComp(ComponentEntity[] elts, String str, boolean isReference) { - + String[] names = Artifact.parseNames(str); if (isReference) { for (ComponentEntity elt : elts) { - for (String ref : elt.getReferences()) { - if (ref.equals(str)) { - return elt.getName(); + if (elt.getName().equals(names[0])) { + for (String ref : elt.getReferences()) { + if (ref.equals(names[1])) { + return elt.getName(); + } } } } } else { for (ComponentEntity elt : elts) { - for (String ser : elt.getServices()) { - if (ser.equals(str)) { - return elt.getName(); + if (elt.getName().equals(names[0])) { + for (String ser : elt.getServices()) { + if (ser.equals(names[1])) { + return elt.getName(); + } } } } @@ -233,6 +241,22 @@ public class TuscanyCompositeEntityBuilder { } + private void buildTargets(ComponentEntity[] components) { + + for (Component c : tuscanyComp.getComponents()) { + ComponentEntity sourceComponent = findEntity(components, c.getName()); + for (ComponentReference ref : c.getReferences()) { + for (EndpointReference epr : ref.getEndpointReferences()) { + Endpoint ep = epr.getTargetEndpoint(); + if (ep != null && ep.getComponent() != null && ep.getService() != null) { + createConnection(sourceComponent, ref.getName(), ep.getComponent().getName(), ep.getService() + .getName()); + } + } + } + } + } + private void buildWires(List wires, ComponentEntity[] elts) { for (int i = 0; i < wires.size(); i++) { @@ -281,12 +305,12 @@ public class TuscanyCompositeEntityBuilder { if (reference != null && service != null) { - ent.addToRefToSerMap(reference, service); + ent.addToRefToSerMap(reference, serviceComp + "/" + service); ent.addAnAdjacentEntity(serviceComp); addToConnectedEntities(referenceComp, serviceComp); addToConnectedEntities(serviceComp, referenceComp); } else if (reference == null && service != null) { - ent.addToRefToSerMap(referenceComp, service); + ent.addToRefToSerMap(referenceComp, serviceComp + "/" + service); ent.addAnAdjacentEntity(serviceComp); addToConnectedEntities(referenceComp, serviceComp); addToConnectedEntities(serviceComp, referenceComp); @@ -319,7 +343,7 @@ public class TuscanyCompositeEntityBuilder { } private void addToConnectedEntities(String ent1, String ent2) { - System.err.println(ent1 + " : " + ent2); + // System.err.println(ent1 + " : " + ent2); ArrayList list; if (connectedEntities.containsKey(ent1)) { list = connectedEntities.get(ent1); diff --git a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/main/Main.java b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/main/Main.java index 10f0b26713..033c1a6d00 100755 --- a/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/main/Main.java +++ b/sca-java-2.x/trunk/modules/composite-diagram/src/main/java/org/apache/tuscany/sca/diagram/main/Main.java @@ -29,6 +29,7 @@ import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; @@ -51,6 +52,10 @@ import org.apache.tuscany.sca.diagram.generator.DiagramGenerator; import org.apache.tuscany.sca.diagram.html.HTMLWrapper; import org.apache.tuscany.sca.diagram.layout.CompositeEntity; import org.apache.tuscany.sca.diagram.layout.EntityBuilder; +import org.apache.tuscany.sca.diagram.layout.TuscanyCompositeEntityBuilder; +import org.apache.tuscany.sca.node.NodeFactory; +import org.apache.tuscany.sca.node.configuration.NodeConfiguration; +import org.apache.tuscany.sca.node.extensibility.NodeExtension; import org.w3c.dom.Document; public class Main { @@ -183,22 +188,29 @@ public class Main { } private static String extractSvg(Document svg) throws Exception { - - // Set up the output transformer - TransformerFactory transfac = TransformerFactory.newInstance(); - Transformer trans = transfac.newTransformer(); - // Print the DOM node StringWriter sw = new StringWriter(); StreamResult result = new StreamResult(sw); - DOMSource source = new DOMSource(svg); - trans.transform(source, result); + + transform(svg, result); String svgString = sw.toString(); return svgString; } + private static void transform(Document svg, StreamResult result) throws Exception { + // Set up the output transformer + TransformerFactory transfac = TransformerFactory.newInstance(); + + Transformer trans = transfac.newTransformer(); + trans.setOutputProperty(OutputKeys.INDENT, "yes"); + trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + + DOMSource source = new DOMSource(svg); + trans.transform(source, result); + } + public static void svgToJPEG(File svg, File jpeg) throws IOException, TranscoderException { // Create the transcoder input. TranscoderInput input = new TranscoderInput(svg.toURI().toString()); @@ -280,4 +292,34 @@ public class Main { png.close(); } + /** + * Generate the SVG diagram from + * @param configuration + * @param classLoader + * @return The XML string for the SVG + * @throws Exception + */ + public static String generateDiagram(NodeConfiguration configuration, ClassLoader classLoader, String baseURL) + throws Exception { + ClassLoader currentTCCL = null; + if (classLoader != null) { + currentTCCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + } + + try { + NodeFactory factory = NodeFactory.getInstance(); + NodeExtension node = factory.loadNode(configuration); + TuscanyCompositeEntityBuilder builder = new TuscanyCompositeEntityBuilder(node.getDomainComposite()); + CompositeEntity compositeEntity = builder.buildCompositeEntity(); + DiagramGenerator generator = new DiagramGenerator(compositeEntity, false, baseURL); + Document doc = generator.buildSVGDocument(); + return extractSvg(doc); + } finally { + if (currentTCCL != null) { + Thread.currentThread().setContextClassLoader(currentTCCL); + } + } + } + } -- cgit v1.2.3