diff options
Diffstat (limited to 'collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src')
12 files changed, 1470 insertions, 202 deletions
diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/DashedWire.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/DashedWire.java new file mode 100755 index 0000000000..c9381c9d50 --- /dev/null +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/DashedWire.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.tuscany.sca.impl.artifacts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class DashedWire extends Wire{ + + + public Element addElement(Document document, String svgNs, + Reference aReference1, Reference aReference2){ + + Element polyline = document.createElementNS(svgNs, "polyline"); + int x1=aReference1.getxCoordinate()+aReference1.getHeight()*3/2; + int y1=aReference1.getyCoordinate()+aReference1.getHeight()/2; + + int x2=aReference2.getxCoordinate()+aReference2.getHeight()/2; + int y2=aReference2.getyCoordinate()+aReference2.getHeight()/2; + //polyline.setAttributeNS(null,"class", "Connect"); + polyline.setAttributeNS(null, "points", x1+","+ + y1+" "+x2+","+y2 + ); + polyline.setAttributeNS(null, "stroke", "black"); + polyline.setAttributeNS(null, "stroke-dasharray", "3 3"); + polyline.setAttributeNS(null, "stroke-width", "2"); + + return polyline; + } + + public Element addElement(Document document, String svgNs, + Service aService1, Service aService2){ + + Element polyline = document.createElementNS(svgNs, "polyline"); + int x1=aService1.getxCoordinate()+aService1.getHeight()*3/2; + int y1=aService1.getyCoordinate()+aService1.getHeight()/2; + + int x2=aService2.getxCoordinate()+aService2.getHeight()/2; + int y2=aService2.getyCoordinate()+aService2.getHeight()/2; + //polyline.setAttributeNS(null,"class", "Connect"); + polyline.setAttributeNS(null, "points", x1+","+ + y1+" "+x2+","+y2 + ); + polyline.setAttributeNS(null, "stroke", "black"); + polyline.setAttributeNS(null, "stroke-dasharray", "3 3"); + polyline.setAttributeNS(null, "stroke-width", "2"); + + return polyline; + } + + + @Override + public Element addElement(Document document, String svgNs, + Reference aReference, Service aService) { + // TODO Auto-generated method stub + return null; + } + + +} diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Layer.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Layer.java new file mode 100755 index 0000000000..36d3d29f20 --- /dev/null +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Layer.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.tuscany.sca.impl.artifacts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Structure of a "Composite" element in SCA, as a SVG element + * + */ +public class Layer extends Artifact{ + + + public Element addElement(Document document, String svgNs, int x, int y, + int height, int width) { + + this.setHeight(height); + this.setWidth(width); + this.setxCoordinate(x); + this.setyCoordinate(y); + + Element rectangle = document.createElementNS(svgNs, "rect"); + rectangle.setAttributeNS(null, "x", x+""); + rectangle.setAttributeNS(null, "y", y+""); + rectangle.setAttributeNS(null, "rx", getRoundCorner()); + rectangle.setAttributeNS(null, "ry", getRoundCorner()); + rectangle.setAttributeNS(null, "width", width+""); + rectangle.setAttributeNS(null, "height", height+""); + rectangle.setAttributeNS(null, "fill", "#E5E5D0"); + rectangle.setAttributeNS(null, "stroke", "#919191"); + rectangle.setAttributeNS(null, "alignment-baseline", "central"); + + return rectangle; + } + + //OBSOLETE + public Element addElement(Document document, String svgNs, int x, int y) { + return null; + } + +} diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/NormalWire.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/NormalWire.java new file mode 100755 index 0000000000..5ceece65bc --- /dev/null +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/NormalWire.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.tuscany.sca.impl.artifacts; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class NormalWire extends Wire{ + + + public Element addElement(Document document, String svgNs, + Reference aReference, Service aService){ + + Element polyline = document.createElementNS(svgNs, "polyline"); + int x1=aReference.getxCoordinate()+aReference.getHeight()*3/2; + int y1=aReference.getyCoordinate()+aReference.getHeight()/2; + + int x2=aService.getxCoordinate()+aService.getHeight()/2; + int y2=aService.getyCoordinate()+aService.getHeight()/2; + //polyline.setAttributeNS(null,"class", "Connect"); + polyline.setAttributeNS(null, "points", x1+","+ + y1+" "+x2+","+y2 + ); + polyline.setAttributeNS(null, "stroke", "black"); + polyline.setAttributeNS(null, "stroke-width", "2"); + + return polyline; + } + + +} diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Text.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Text.java index fabbf40873..7457084eb6 100644 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Text.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Text.java @@ -31,7 +31,7 @@ public class Text { text.setAttributeNS(null, "y", y+""); text.setAttributeNS(null, "text-anchor", "middle"); text.setAttributeNS(null, "dominant-baseline", "mathematical"); - text.setAttributeNS(null, "font-size", "10"); + text.setAttributeNS(null, "font-size", "20"); text.setTextContent(content); return text; diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Wire.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Wire.java index 59ef48895a..9c91ccc361 100644 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Wire.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/artifacts/Wire.java @@ -22,27 +22,27 @@ package org.apache.tuscany.sca.impl.artifacts; import org.w3c.dom.Document; import org.w3c.dom.Element; -public class Wire { +public abstract class Wire { - public Element addElement(Document document, String svgNs, - Reference aReference, Service aService){ + public abstract Element addElement(Document document, String svgNs, + Reference aReference, Service aService); //{ - Element polyline = document.createElementNS(svgNs, "polyline"); - int x1=aReference.getxCoordinate()+aReference.getHeight()*3/2; - int y1=aReference.getyCoordinate()+aReference.getHeight()/2; - - int x2=aService.getxCoordinate()+aService.getHeight()/2; - int y2=aService.getyCoordinate()+aService.getHeight()/2; - //polyline.setAttributeNS(null,"class", "Connect"); - polyline.setAttributeNS(null, "points", x1+","+ - y1+" "+x2+","+y2 - ); - polyline.setAttributeNS(null, "stroke", "black"); - polyline.setAttributeNS(null, "stroke-width", "2"); - - return polyline; - } +// Element polyline = document.createElementNS(svgNs, "polyline"); +// int x1=aReference.getxCoordinate()+aReference.getHeight()*3/2; +// int y1=aReference.getyCoordinate()+aReference.getHeight()/2; +// +// int x2=aService.getxCoordinate()+aService.getHeight()/2; +// int y2=aService.getyCoordinate()+aService.getHeight()/2; +// //polyline.setAttributeNS(null,"class", "Connect"); +// polyline.setAttributeNS(null, "points", x1+","+ +// y1+" "+x2+","+y2 +// ); +// polyline.setAttributeNS(null, "stroke", "black"); +// polyline.setAttributeNS(null, "stroke-width", "2"); +// +// return polyline; +// } } diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java index 031ff25e95..742575f501 100755 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java @@ -26,12 +26,16 @@ import java.util.Map.Entry; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.apache.tuscany.sca.impl.artifacts.Component; import org.apache.tuscany.sca.impl.artifacts.Composite; +import org.apache.tuscany.sca.impl.artifacts.DashedWire; +import org.apache.tuscany.sca.impl.artifacts.Layer; +import org.apache.tuscany.sca.impl.artifacts.NormalWire; import org.apache.tuscany.sca.impl.artifacts.Property; import org.apache.tuscany.sca.impl.artifacts.Reference; import org.apache.tuscany.sca.impl.artifacts.Service; import org.apache.tuscany.sca.impl.artifacts.Text; import org.apache.tuscany.sca.impl.artifacts.Wire; import org.apache.tuscany.sca.impl.layout.ComponentEntity; +import org.apache.tuscany.sca.impl.layout.CompositeEntity; import org.apache.tuscany.sca.impl.layout.Entity; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; @@ -39,10 +43,11 @@ import org.w3c.dom.Element; public class DiagramGenerator { - private Entity[] entities; - private int height, width; + private CompositeEntity comp; +// private Entity[] entities; +// private int height, width; private Document doc; - private String compositeName; +// private String compositeName; private String svgNS ; private Element svgRoot; private ArrayList<Reference> refs= new ArrayList<Reference>(); @@ -52,17 +57,20 @@ public class DiagramGenerator { * Constructor to generate a SVG diagram for compositeName * with a given height and a width and consisting of entities. */ - public DiagramGenerator(Entity[] entities, int height, int width, String compositeName) { - this.entities = entities; - this.height = height; - this.width = width; - this.compositeName = compositeName; + public DiagramGenerator(CompositeEntity comp) { + this.comp = comp; +// this.entities = comp.getComponentList(); +// this.height = comp.getHeight(); +// this.width = comp.getWidth(); +// this.compositeName = comp.getName(); +// comp.getServices(); } /** * Draws the diagram. */ public Document buildSVGDocument(){ + DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; doc = impl.createDocument(svgNS, "svg", null); @@ -70,26 +78,82 @@ public class DiagramGenerator { // Get the root element (the 'svg' element). svgRoot = doc.getDocumentElement(); +// svgRoot.setAttributeNS(null, "width", ""+(width+400)); +// svgRoot.setAttributeNS(null, "height", ""+(height+200)); + + addLayer(); addComposite(); - for(Entity ent: entities){ + + for(Entity ent: comp.getComponentList()){ + addComponent(ent); addService(ent); addReference(ent); addProperties(ent); } - addConnections(); + addCompositeService(comp); + addCompositeReference(comp); + addCompositeProperties(comp); + + addComponentConnections(); + addReferencePromotion(); + addServicePromotion(); return doc; } + + + private void addLayer() { + + Layer outerLayer = new Layer(); + Element layerElt = outerLayer.addElement(doc, svgNS, 0, 0, comp.getHeight()+200, comp.getWidth()+400); + svgRoot.appendChild(layerElt); + } + + private void addReferencePromotion() { + + for(Iterator it= comp.getPromoteAReference().entrySet().iterator(); + it.hasNext();){ + Entry entry = (Entry) it.next(); + String compositeRef = (String)entry.getKey(); + String componentRef = (String)entry.getValue(); + + Reference r1 = getRef(compositeRef); + Reference r2 = getRef(componentRef); + + if(r1 != null && r2 != null){ + addWire(r2, r1); + } + } + } + + private void addServicePromotion() { + + for(Iterator it= comp.getPromoteAService().entrySet().iterator(); + it.hasNext();){ + Entry entry = (Entry) it.next(); + String compositeSer = (String)entry.getKey(); + String componentSer = (String)entry.getValue(); + + Service s1 = getSer(compositeSer); + Service s2 = getSer(componentSer); + + if(s1 != null && s2 != null){ + addWire(s1, s2); + } + } + } + + /** * Connects references to services. */ - private void addConnections() { + private void addComponentConnections() { - for(Entity ent: entities){ + for(Entity ent: comp.getComponentList()){ if(ent instanceof ComponentEntity){ for(Iterator it= ((ComponentEntity)ent).getReferenceToServiceMap().entrySet().iterator(); @@ -111,10 +175,24 @@ public class DiagramGenerator { private void addWire(Reference r, Service s) { - Wire edge = new Wire(); + Wire edge = new NormalWire(); Element wire = edge.addElement(doc, svgNS, r, s); svgRoot.appendChild(wire); } + + private void addWire(Service s1, Service s2) { + + DashedWire edge = new DashedWire(); + Element wire = edge.addElement(doc, svgNS, s1, s2); + svgRoot.appendChild(wire); + } + + private void addWire(Reference r1, Reference r2) { + + DashedWire edge = new DashedWire(); + Element wire = edge.addElement(doc, svgNS, r1, r2); + svgRoot.appendChild(wire); + } private Service getSer(String ser) { @@ -204,7 +282,7 @@ public class DiagramGenerator { } for(String eName: e.getAdjacentEntities()){ - for(Entity ent: entities){ + for(Entity ent: comp.getComponentList()){ if(ent.getName().equals(eName)){ for(String s : sers){ @@ -240,6 +318,19 @@ public class DiagramGenerator { } } + //adding references which are not connected to any service + for(String ref : refs){ + for(int i=0; i<orderedRefs.length ; i++){ + if(ref.equals(orderedRefs[i])){ + break; + } + else if(orderedRefs[i] == null){ + orderedRefs[i] = ref; + break; + } + } + } + return orderedRefs; } @@ -269,10 +360,83 @@ public class DiagramGenerator { sers.add(serve); } } + + private void addCompositeService(CompositeEntity comp) { + + int serHeight = comp.getSerHeight(); + int x= comp.getX()-(serHeight*2/3); + int y= comp.getY() + Service.SPACING_FOR_COMPOSITE; + System.err.println(serHeight); + System.out.println("''''''"+((CompositeEntity)comp).getName() +" '''''' "+ comp.getServices().size()); + for(String ser: comp.getServices()){ + + Service serve= new Service(); + Element polygon = serve.addElement(doc, svgNS, x, y, serHeight); + Element text; + if(!ser.endsWith("Impl")) + text = Text.addTextElement(doc, svgNS, x, y+serHeight/2, ser); + else + text = Text.addTextElement(doc, svgNS, x, y+serHeight/2, ""); + + svgRoot.appendChild(polygon); + svgRoot.appendChild(text); + + y += (serHeight + Service.SPACING_FOR_COMPOSITE); + + serve.setName(ser); + serve.setContainerName(comp.getName()); + sers.add(serve); + } + } + + private void addCompositeReference(CompositeEntity comp) { + + int refHeight = comp.getRefHeight(); + int x=(comp.getX()+comp.getWidth())-(refHeight*2/3); + int y=comp.getY() + Reference.SPACING_FOR_COMPOSITE; + + for(String ref: comp.getReferences()){ + Reference refer= new Reference(); + Element polygon = refer.addElement(doc, svgNS, x, y, refHeight); + Element text = Text.addTextElement(doc, svgNS, x, y+refHeight/2, ref); + svgRoot.appendChild(polygon); + svgRoot.appendChild(text); + + y += (refHeight + Reference.SPACING_FOR_COMPOSITE); + + refer.setName(ref); + refer.setContainerName(comp.getName()); + refs.add(refer); + + } + + } + + private void addCompositeProperties(CompositeEntity comp) { + int propLen = comp.getPropLength(); + int x= comp.getX() + Property.SPACING_FOR_COMPOSITE; + int y= comp.getY()-propLen/2; + + for(String prop: comp.getProperties()){ + Property pro = new Property(); + Element property = pro.addElement(doc, svgNS, x, y, propLen); + Element text = Text.addTextElement(doc, svgNS, x, y, prop); + + svgRoot.appendChild(property); + svgRoot.appendChild(text); + + x += (propLen + Property.SPACING_FOR_COMPOSITE); + + pro.setName(prop); + pro.setContainerName(comp.getName()); + } + } + private void addComponent(Entity ent) { Component comp = new Component(); + System.err.println(ent.getX()); Element com = comp.addElement(doc, svgNS, ent.getX(), ent.getY(), ent.getHeight(), ent.getWidth()); Element text = Text.addTextElement(doc, svgNS, ent.getX()+(ent.getWidth()/4), @@ -287,13 +451,14 @@ public class DiagramGenerator { private void addComposite() { Composite composite = new Composite(); - Element composi = composite.addElement(doc, svgNS, 0, 0, height, width); - Element text = Text.addTextElement(doc, svgNS, width/2, 20, compositeName); + + Element composi = composite.addElement(doc, svgNS, comp.getX(), comp.getY(), comp.getHeight(), comp.getWidth()); + Element text = Text.addTextElement(doc, svgNS, comp.getX() +comp.getWidth()/2, comp.getY() +20, comp.getName()); svgRoot.appendChild(composi); svgRoot.appendChild(text); - composite.setName(compositeName); + composite.setName(comp.getName()); } diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/ComponentEntity.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/ComponentEntity.java index 4feaaff635..f85a83bdb7 100755 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/ComponentEntity.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/ComponentEntity.java @@ -48,6 +48,7 @@ public class ComponentEntity extends Entity{ public ComponentEntity(){ + super.setStartPosition(200); setHeight(Component.DEFAULT_HEIGHT); setWidth(Component.DEFAULT_WIDTH); diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/CompositeEntity.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/CompositeEntity.java new file mode 100755 index 0000000000..0adffcc44e --- /dev/null +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/CompositeEntity.java @@ -0,0 +1,373 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.tuscany.sca.impl.layout; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +import org.apache.tuscany.sca.impl.artifacts.Component; +import org.apache.tuscany.sca.impl.artifacts.Composite; +import org.apache.tuscany.sca.impl.artifacts.Property; +import org.apache.tuscany.sca.impl.artifacts.Reference; +import org.apache.tuscany.sca.impl.artifacts.Service; + +/** + * Represents an unit (a component including its references, services, properties + * and adjacent units) in the diagram. + * + */ +public class CompositeEntity extends Entity{ + +// private String componentName; +// private int X, Y, level=-1, lane=-1, refHeight, serHeight, propLength; +// private final int height= Component.DEFAULT_HEIGHT, width= Component.DEFAULT_WIDTH; +// public static final int defaultNoOfSers= Component.DEFAULT_HEIGHT / (Service.MAXIMUM_HEIGHT+Service.SPACING); +// public static final int defaultNoOfRefs= Component.DEFAULT_HEIGHT / (Reference.MAXIMUM_HEIGHT+Reference.SPACING); //same value for defaultNoOfSers +// public static final int defaultNoOfProps= Component.DEFAULT_WIDTH / (Property.MAXIMUM_HEIGHT+Property.SPACING); + + private int maxInternalLevel=0; + private int maxInternalLane=0; + private ComponentEntity[] componentList; + private int[][] connections; + private HashMap<String, String> promoteAService = new HashMap<String, String>(); + private HashMap<String, String> promoteAReference = new HashMap<String, String>(); + //private HashSet<String> connectedEntities = new HashSet<String>(); + + + public CompositeEntity(String name){ + + setStartPosition(200); + setLevel(0); + setLane(0); + + setX(getStartPosition()); + setY(getStartPosition()/2); + + setName(name); + //componentList = comps; + //setConnections(conns); + + + + } + + public void referenceHeight(){ + System.err.println(getDefaultNoOfRefs() + " kkkkkkk "+getNoOfRefs()); + + if(getDefaultNoOfRefs() < getNoOfRefs()){ + + setRefHeight((getHeight() / getNoOfRefs()) - Reference.SPACING_FOR_COMPOSITE); + } + else + setRefHeight(Reference.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE); + } + + public void serviceHeight(){ + if(getDefaultNoOfSers() < getNoOfSers()){ + setSerHeight((getHeight() / getNoOfSers()) - Service.SPACING_FOR_COMPOSITE); + } + else + setSerHeight(Service.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE); + } + + public void propertyLength(){ + if(getDefaultNoOfProps() < getNoOfProps()){ + + setPropLength((getWidth() / getNoOfProps()) - Property.SPACING_FOR_COMPOSITE); + } + else + setPropLength(Property.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE); + } + +// /** +// * Put a value to referenceToServiceMap +// * @param ref +// * @param ser +// * @return successfully added or not +// */ +// //assumption there can not be two services for the same reference +// public boolean addToRefToSerMap(String ref, String ser){ +// //ref = ref.toLowerCase(); +// //ser = ser.toLowerCase(); +// +// if (referenceToServiceMap.containsKey(ref)) +// return false; +// +// referenceToServiceMap.put(ref, ser); +// return true; +// } +// +// /** +// * Retrieve a service name for a given reference +// * @param ref +// * @return service name +// */ +// public String getSerOfRef(String ref){ +// //ref = ref.toLowerCase(); +// +// if (!referenceToServiceMap.containsKey(ref)) +// return null; +// +// return referenceToServiceMap.get(ref); +// } +// +// public HashMap<String, String> getReferenceToServiceMap() { +// return referenceToServiceMap; +// } +// +// public void setReferenceToServiceMap( +// HashMap<String, String> referenceToServiceMap) { +// this.referenceToServiceMap = referenceToServiceMap; +// } + + public void calcHeight(int initPoint) { + setHeight((Component.DEFAULT_HEIGHT * getSpaceFactor()) * (maxInternalLevel + 1) + initPoint); + } + + public void calcWidth(int initPoint) { + System.err.println("maxInternalLane "+maxInternalLane); + setWidth((Component.DEFAULT_WIDTH * getSpaceFactor()) * (maxInternalLane + 1) + initPoint); + } + + private int max(int a, int b){ + if(a>=b) + return a; + return b; + } + + public void setMaxInternalProperties() { + + for(ComponentEntity ent: componentList){ + + maxInternalLevel = max(maxInternalLevel, ent.getLevel()); + maxInternalLane = max(maxInternalLane, ent.getLane()); + + } + System.out.println("++++++ "+maxInternalLevel+" +++++ "+maxInternalLane); + } + + public int getMaxInternalLevel() { + return maxInternalLevel; + } + + public int getMaxInternalLane() { + return maxInternalLane; + } + + public boolean addToPromoteAService(String compositeSer, String componentSer){ + //ref = ref.toLowerCase(); + //ser = ser.toLowerCase(); + + if (promoteAService.containsKey(compositeSer)) + return false; + + promoteAService.put(compositeSer, componentSer); + return true; + } + + public void setPromoteAService(HashMap<String, String> promoteAService) { + this.promoteAService = promoteAService; + } + + public HashMap<String, String> getPromoteAService() { + return promoteAService; + } + + public boolean addToPromoteAReference(String compositeRef, String componentRef){ + //ref = ref.toLowerCase(); + //ser = ser.toLowerCase(); + + if (promoteAReference.containsKey(compositeRef)) + return false; + + promoteAReference.put(compositeRef, componentRef); + return true; + } + + public void setPromoteAReference(HashMap<String, String> promoteAReference) { + this.promoteAReference = promoteAReference; + } + + public HashMap<String, String> getPromoteAReference() { + return promoteAReference; + } + + public ComponentEntity[] getComponentList() { + return componentList; + } + + public void setComponentList(ComponentEntity[] componentList) { + this.componentList = componentList; + } + + public void setConnections(int[][] connections) { + this.connections = connections; + } + + public int[][] getConnections() { + return connections; + } + + public void setAttributes() { + + setMaxInternalProperties(); + + + //System.out.println("++++++ "+this.maxInternalLevel); + + calcHeight(getY()); + calcWidth(getX()); + + setDefaultNoOfSers( + getHeight()/ + (Service.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE+Service.SPACING_FOR_COMPOSITE)); + setDefaultNoOfRefs( + getHeight()/ + (Reference.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE+Reference.SPACING_FOR_COMPOSITE)); + setDefaultNoOfProps( + getWidth()/ + (Property.DEFAULT_MAXIMUM_HEIGHT_FOR_COMPOSITE+Property.SPACING_FOR_COMPOSITE)); + + referenceHeight(); + serviceHeight(); + propertyLength(); + } + + + +// public int getNoOfRefs(){ +// return references.size(); +// } +// +// public int getNoOfSers(){ +// return services.size(); +// } +// +// public int getNoOfProps(){ +// return properties.size(); +// } +// +// public int getNoOfAdjacentUnits(){ +// return adjacentEntities.size(); +// } +// +// /** +// * Put a value to referenceToServiceMap +// * @param ref +// * @param ser +// * @return successfully added or not +// */ +// //assumption there can not be two services for the same reference +// public boolean addToRefToSerMap(String ref, String ser){ +// //ref = ref.toLowerCase(); +// //ser = ser.toLowerCase(); +// +// if (referenceToServiceMap.containsKey(ref)) +// return false; +// +// referenceToServiceMap.put(ref, ser); +// return true; +// } +// +// /** +// * Retrieve a service name for a given reference +// * @param ref +// * @return service name +// */ +// public String getSerOfRef(String ref){ +// //ref = ref.toLowerCase(); +// +// if (!referenceToServiceMap.containsKey(ref)) +// return null; +// +// return referenceToServiceMap.get(ref); +// } +// +// public void addAService(String serName){ +// //serName = serName.toLowerCase(); +// services.add(serName); +// +// } +// +// public void addAReference(String refName){ +// //refName = refName.toLowerCase(); +// references.add(refName); +// +// } +// +// public void addAProperty(String propName){ +// //propName = propName.toLowerCase(); +// properties.add(propName); +// +// } +// +// public void addAnAdjacentEntity(String x){ +//// System.out.println("eee "+x); +// adjacentEntities.add(x); +// +// } +// +// public void addAnConnectedEntity(String x){ +//// System.out.println("eee "+x); +// adjacentEntities.add(x); +// +// } +// +// public HashMap<String, String> getReferenceToServiceMap() { +// return referenceToServiceMap; +// } +// public void setReferenceToServiceMap( +// HashMap<String, String> referenceToServiceMap) { +// this.referenceToServiceMap = referenceToServiceMap; +// } +// public ArrayList<String> getProperties() { +// return properties; +// } +// public void setProperties(ArrayList<String> properties) { +// this.properties = properties; +// } +// public HashSet<String> getAdjacentEntities() { +// return adjacentEntities; +// } +// public void setAdjacentEntities(HashSet<String> adjacentEntities) { +// this.adjacentEntities = adjacentEntities; +// } +// public void setServices(ArrayList<String> services) { +// this.services = services; +// } +// +// public ArrayList<String> getServices() { +// return services; +// } +// +// public ArrayList<String> getReferences() { +// return references; +// } + +// public void setConnectedEntities(HashSet<String> connectedEntities) { +// this.connectedEntities = connectedEntities; +// } +// +// public HashSet<String> getConnectedEntities() { +// return connectedEntities; +// } + +} diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/Entity.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/Entity.java index 711a5b5394..b9a38a0deb 100755 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/Entity.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/Entity.java @@ -6,11 +6,14 @@ import java.util.HashSet; public abstract class Entity { + private int id=-1; //a unique integer id (0..n) private String name; // a unique name + private int spaceFactor = 2; //which determines the free space surrounded by this private int x; // x coordinate private int y; // y coordinate private int level=-1; // corresponding row which this entity is placed private int lane=-1; // corresponding column which this entity is placed + private boolean isPossitionSet = false; private int height; // height of the entity private int width; // width of the entity private int refHeight; // height of a reference element @@ -19,6 +22,9 @@ public abstract class Entity { private int defaultNoOfSers; // default # of service elements private int defaultNoOfRefs; // default # of reference elements private int defaultNoOfProps; // default # of property elements + private int startPosition=0; + private Entity parent = null; + private ArrayList<String> references = new ArrayList<String>(); @@ -41,14 +47,14 @@ public abstract class Entity { public int getX() { return x; } - public void setX(int x) { - this.x = x; + public void setX(int init) { + this.x = init + width * spaceFactor * lane; } public int getY() { return y; } - public void setY(int y) { - this.y = y; + public void setY(int init) { + this.y = init + height * spaceFactor * level; } public int getLevel() { return level; @@ -183,6 +189,36 @@ public abstract class Entity { public ArrayList<String> getReferences() { return references; } + public void setId(int id) { + this.id = id; + } + public int getId() { + return id; + } + public void setPossitionSet(boolean isPossitionSet) { + this.isPossitionSet = isPossitionSet; + } + public boolean isPossitionSet() { + return isPossitionSet; + } + public int getSpaceFactor() { + return spaceFactor; + } + public void setSpaceFactor(int spaceFactor) { + this.spaceFactor = spaceFactor; + } + public void setStartPosition(int startPosition) { + this.startPosition = startPosition; + } + public int getStartPosition() { + return startPosition; + } + public void setParent(Entity parent) { + this.parent = parent; + } + public Entity getParent() { + return parent; + } } diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/EntityBuilder.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/EntityBuilder.java index e8c7bf76e8..4157f93409 100755 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/EntityBuilder.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/EntityBuilder.java @@ -38,8 +38,9 @@ public class EntityBuilder { private int totalWidth=0; private int totalHeight=0; private ComponentEntity startEnt = null; - private String compositeName; - ComponentEntity[] elts = null; + //private String compositeName; + + CompositeEntity composite = null; /** * Constructor which initiates the DOM document @@ -49,6 +50,263 @@ public class EntityBuilder { dom = aDom; } + public CompositeEntity buildCompositeEntity(){ + + //get the root element + Element docEle = dom.getDocumentElement(); + + String compositeName; + compositeName = docEle.getAttribute("name"); + //System.out.println("compositeName "+compositeName); + + ComponentEntity[] comps = buildComponentEntities(docEle); + + composite = new CompositeEntity(compositeName); + + setParent(comps, composite); + + //System.out.println("ComponentEntity "+comps[0].getLevel()); + int[][] conns = buildConnectionMatrix(comps); + + composite.setComponentList(comps); + composite.setConnections(conns); + + LayoutBuilder buildLayout = new LayoutBuilder(comps , conns); + buildLayout.buildEntities(); + + + System.out.println("conns "+conns[0][0]); + + + buildCompositeService(docEle, composite); + buildCompositeReference(docEle, composite); + buildCompositeProperty(docEle, composite); + + composite.setAttributes(); + + return composite; + } + +// private void assignCoordinates() { +// +// for(Entity ent: elts){ +// ent.setX(ent.getParent().getX() + ent.getStartPosition()); +// ent.setY(ent.getParent().getY() + ent.getStartPosition()/2); +// } +// } + + private void setParent(ComponentEntity[] comps, Entity parent) { + + for(ComponentEntity comp: comps){ + comp.setParent(parent); + } + } + + private void buildCompositeService(Element docEle, + CompositeEntity composite) { + + NodeList nl = docEle.getElementsByTagName("service"); + System.err.println("^^^^^^^^^ "+nl.getLength()); + if(nl != null && nl.getLength() > 0 ) { + + for(int i = 0 ; i < nl.getLength();i++) { + + Element elt = (Element)nl.item(i); + + if(elt.getParentNode().getNodeName().equals("composite")){ + String compositeSer = elt.getAttribute("name"); + composite.addAService(compositeSer); + + String target = elt.getAttribute("promote"); + + String service, serviceComp; + String[] arr1 = extractComp(target); + serviceComp = arr1[0]; + service = arr1[1]; + + if(service == null){ + composite.addToPromoteAService(compositeSer, serviceComp); + } + else{ + composite.addToPromoteAService(compositeSer, service); + } + } + + } + } + } + + private void buildCompositeReference(Element docEle, + CompositeEntity composite) { + + NodeList nl = docEle.getElementsByTagName("reference"); + //System.out.println("^^^^^^^^^ "+nl.getLength()); + if(nl != null && nl.getLength() > 0 ) { + + for(int i = 0 ; i < nl.getLength();i++) { + + Element elt = (Element)nl.item(i); + + if(elt.getParentNode().getNodeName().equals("composite")){ + String compositeRef = elt.getAttribute("name"); + composite.addAReference(compositeRef); + + String target = elt.getAttribute("promote"); + + String reference, referenceComp; + String[] arr1 = extractComp(target); + referenceComp = arr1[0]; + reference = arr1[1]; + + if(reference == null){ + composite.addToPromoteAReference(compositeRef, referenceComp); + } + else{ + composite.addToPromoteAReference(compositeRef, reference); + } + + } + } + } + } + + private void buildCompositeProperty(Element docEle, + CompositeEntity composite) { + + NodeList nl = docEle.getElementsByTagName("property"); + //System.out.println("^^^^^^^^^ "+nl.getLength()); + if(nl != null && nl.getLength() > 0 ) { + + for(int i = 0 ; i < nl.getLength();i++) { + + Element elt = (Element)nl.item(i); + + if(elt.getParentNode().getNodeName().equals("composite")){ + String compositeProp = elt.getAttribute("name"); + composite.addAProperty(compositeProp); + } + } + } + } + + private int[][] buildConnectionMatrix(ComponentEntity[] comps) { + + int[][] connections = new int[comps.length][comps.length]; + connections = initConnections(connections); + +// //sec. 5.4 in the spec +// NodeList nl = docEle.getElementsByTagName("wire"); +// //System.out.println("^^^^^^^^^ "+nl.getLength()); +// if(nl != null && nl.getLength() > 0 ) { +// +// for(int i = 0 ; i < nl.getLength();i++) { +// +// Element elt = (Element)nl.item(i); +// +// String source = elt.getAttribute("source"); +// String target = elt.getAttribute("target"); +// +// String service, serviceComp, reference, referenceComp; +// +// String[] arr1 = extractComp(target); +// serviceComp = arr1[0]; +// service = arr1[1]; +// +// String[] arr2 = extractComp(source); +// referenceComp = arr2[0]; +// reference = arr2[1]; + +// //System.out.println("^^^^^^^^^ "+source+" ::: "+target); +// if(target.contains("/")){ +// String[] arr = target.split("/"); +// serviceComp = arr[0]; +// service = arr[1]; +// } +// else{ +// serviceComp = target; +// service = null; +// } +// +// if(source.contains("/")){ +// String[] arr = source.split("/"); +// referenceComp = arr[0]; +// reference = arr[1]; +// } +// else{ +// referenceComp = source; +// reference = null; +// } +// //sec. 5.4 in the spec +// NodeList nl = docEle.getElementsByTagName("wire"); +// //System.out.println("^^^^^^^^^ "+nl.getLength()); +// if(nl != null && nl.getLength() > 0 ) { +// +// for(int i = 0 ; i < nl.getLength();i++) { +// +// Element elt = (Element)nl.item(i); +// +// String source = elt.getAttribute("source"); +// String target = elt.getAttribute("target"); +// +// String service, serviceComp, reference, referenceComp; +// +// String[] arr1 = extractComp(target); +// serviceComp = arr1[0]; +// service = arr1[1]; +// +// String[] arr2 = extractComp(source); +// referenceComp = arr2[0]; +// reference = arr2[1]; + + for(Entity ent: comps){ + for(String name: ent.getAdjacentEntities()){ + ComponentEntity e2 = findEntity(comps, name); + if(ent != null && e2 != null){ + System.out.println("^^^^^^^^^ "+e2.getName()); + connections[ent.getId()][e2.getId()] = 1; + } + } + + } +// ComponentEntity e1 = findEntity(comps, referenceComp); +// ComponentEntity e2 = findEntity(comps, serviceComp); +// +// System.out.println("^^^^^^^^^ "+e1.getName()); +// if(e1 != null && e2 != null){ +// System.out.println("^^^^^^^^^ "+e1.getId()); +// connections[e1.getId()][e2.getId()] = 1; +// createConnection(e1, reference, serviceComp, service); +// } +// } +// } +// + return connections; + } + + private String[] extractComp(String str) { + + String[] arr = new String[2]; + + if(str.contains("/")){ + arr = str.split("/"); + } + else{ + arr[0] = str; + arr[1] = null; + } + return arr; + } + + private int[][] initConnections(int[][] connections) { + + for(int i=0; i<connections.length ; i++){ + for(int j=0; j<connections.length ; j++){ + connections[i][j] =0; + } + } + return connections; + } + /** * Layout Building Algorithm * ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -76,79 +334,146 @@ public class EntityBuilder { * * @return */ - public ComponentEntity[] buildEntities(){ + public ComponentEntity[] buildComponentEntities(Element docEle){ - //get the root element - Element docEle = dom.getDocumentElement(); - compositeName = docEle.getAttribute("name"); - System.out.println("compositeName "+compositeName); + ComponentEntity[] elts = null; + +// //get the root element +// Element docEle = dom.getDocumentElement(); +// compositeName = docEle.getAttribute("name"); +// System.out.println("compositeName "+compositeName); //get a nodelist of elements NodeList nl = docEle.getElementsByTagName("component"); if(nl != null && nl.getLength() > 0 ) { elts = new ComponentEntity[nl.getLength()]; + for(int i = 0 ; i < nl.getLength();i++) { elts[i] = new ComponentEntity(); Element nVal = (Element)nl.item(i); //System.out.println(nVal.hasAttribute("name")); + elts[i].setId(i); elts[i].setName(nVal.getAttribute("name")); + setServices(nVal, elts[i]); setReferences(nVal, elts[i]); setProperties(nVal, elts[i]); + elts[i].referenceHeight(); elts[i].serviceHeight(); elts[i].propertyLength(); } } + + buildWires(docEle, elts); +// //sec. 5.4 in the spec +// nl = docEle.getElementsByTagName("wire"); +// System.out.println("^^^^^^^^^ "+nl.getLength()); +// if(nl != null && nl.getLength() > 0 ) { +// for(int i = 0 ; i < nl.getLength();i++) { +// Element elt = (Element)nl.item(i); +// String source = elt.getAttribute("source"); +// String target = elt.getAttribute("target"); +// String service, serviceComp, reference, referenceComp; +// +// System.out.println("^^^^^^^^^ "+source+" ::: "+target); +// if(target.contains("/")){ +// String[] arr = target.split("/"); +// serviceComp = arr[0]; +// service = arr[1]; +// } +// else{ +// serviceComp = target; +// service = null; +// } +// +// if(source.contains("/")){ +// String[] arr = source.split("/"); +// referenceComp = arr[0]; +// reference = arr[1]; +// } +// else{ +// referenceComp = source; +// reference = null; +// } +// +// ComponentEntity e = findEntity(referenceComp); +// System.out.println("^^^^^^^^^ "+e.getName()); +// if(e != null){ +// createConnection(e, reference, serviceComp, service); +// } +// } +// } +// +// positionEntities(elts); +// +// calculateProperties(elts); + // print(elts); + + return elts; + + } + + private void buildWires(Element docEle, ComponentEntity[] elts) { + //sec. 5.4 in the spec - nl = docEle.getElementsByTagName("wire"); - System.out.println("^^^^^^^^^ "+nl.getLength()); + NodeList nl = docEle.getElementsByTagName("wire"); + //System.out.println("^^^^^^^^^ "+nl.getLength()); if(nl != null && nl.getLength() > 0 ) { + for(int i = 0 ; i < nl.getLength();i++) { + Element elt = (Element)nl.item(i); + String source = elt.getAttribute("source"); String target = elt.getAttribute("target"); + String service, serviceComp, reference, referenceComp; - System.out.println("^^^^^^^^^ "+source+" ::: "+target); - if(target.contains("/")){ - String[] arr = target.split("/"); - serviceComp = arr[0]; - service = arr[1]; - } - else{ - serviceComp = target; - service = null; - } + String[] arr1 = extractComp(target); + serviceComp = arr1[0]; + service = arr1[1]; - if(source.contains("/")){ - String[] arr = source.split("/"); - referenceComp = arr[0]; - reference = arr[1]; - } - else{ - referenceComp = source; - reference = null; - } + String[] arr2 = extractComp(source); + referenceComp = arr2[0]; + reference = arr2[1]; + +// //System.out.println("^^^^^^^^^ "+source+" ::: "+target); +// if(target.contains("/")){ +// String[] arr = target.split("/"); +// serviceComp = arr[0]; +// service = arr[1]; +// } +// else{ +// serviceComp = target; +// service = null; +// } +// +// if(source.contains("/")){ +// String[] arr = source.split("/"); +// referenceComp = arr[0]; +// reference = arr[1]; +// } +// else{ +// referenceComp = source; +// reference = null; +// } +// + ComponentEntity e1 = findEntity(elts, referenceComp); + //ComponentEntity e2 = findEntity(comps, serviceComp); - ComponentEntity e = findEntity(referenceComp); - System.out.println("^^^^^^^^^ "+e.getName()); - if(e != null){ - createConnection(e, reference, serviceComp, service); + System.out.println("^^^^^^^^^ "+e1.getName()); + if(e1 != null){ + System.out.println("^^^^^^^^^ "+e1.getId()); + //connections[e1.getId()][e2.getId()] = 1; + createConnection(e1, reference, serviceComp, service); } } } - positionEntities(elts); - - calculateProperties(elts); - print(elts); - - return elts; - } - - private ComponentEntity findEntity(String componentName) { + + private ComponentEntity findEntity(ComponentEntity[] elts, String componentName) { for(ComponentEntity e: elts){ if(e.getName().equals(componentName)){ @@ -192,13 +517,13 @@ public class EntityBuilder { String serviceComp, String service) { String referenceComp = ent.getName(); - + if(reference != null && service != null){ - - ent.addToRefToSerMap(reference, service); - ent.addAnAdjacentEntity(serviceComp); - addToConnectedEntities(referenceComp, serviceComp); - addToConnectedEntities(serviceComp, referenceComp); + + ent.addToRefToSerMap(reference, service); + ent.addAnAdjacentEntity(serviceComp); + addToConnectedEntities(referenceComp, serviceComp); + addToConnectedEntities(serviceComp, referenceComp); } else if(reference == null && service != null){ ent.addToRefToSerMap(referenceComp, service); @@ -220,25 +545,25 @@ public class EntityBuilder { } } - private void calculateProperties(ComponentEntity[] elts) { - int level=0, lane=0; - - for(ComponentEntity ent: elts){ - level = max(level, ent.getLevel()); - lane = max(lane, ent.getLane()); - - } - totalHeight += spaceY*(level+1) + initPoint; - totalWidth += spaceX*(lane+1) + initPoint; - - System.err.println(totalHeight + " :: "+totalWidth); - } +// private void calculateProperties(ComponentEntity[] elts) { +// int level=0, lane=0; +// +// for(ComponentEntity ent: elts){ +// level = max(level, ent.getLevel()); +// lane = max(lane, ent.getLane()); +// +// } +// totalHeight += spaceY*(level+1) + initPoint; +// totalWidth += spaceX*(lane+1) + initPoint; +// +// System.err.println(totalHeight + " :: "+totalWidth); +// } - private int max(int a, int b){ - if(a>=b) - return a; - return b; - } +// private int max(int a, int b){ +// if(a>=b) +// return a; +// return b; +// } private void print(ComponentEntity[] elts) { @@ -249,91 +574,91 @@ public class EntityBuilder { } } - private void positionEntities(ComponentEntity[] ents){ - - for(ComponentEntity ent: ents){ - if(ent.getAdjacentEntities().size() != 0 || ents.length==1){ - setPosition(ent, initPoint, initPoint, 0, 0); - levelCount.add(0, 1); - startEnt = ent; - System.err.println(ent.getName()); - break; - } - } - - - if(startEnt != null) - assignPositions(ents, startEnt); - - } - - private void assignPositions(ComponentEntity[] ents, ComponentEntity ent){ - int i=0; - if(ent.getAdjacentEntities().size()>0){ - - System.out.println(ent.getName()); - for(String name: ent.getAdjacentEntities()){ - //System.out.println("eee "+name); - for(ComponentEntity aEnt: ents){ - i++; - if(name.equalsIgnoreCase(aEnt.getName())){ - int lane = ent.getLane()+1; - if(levelCount.size()<= lane){ - levelCount.add(lane, 1); - setPosition(aEnt, ent.getX()+spaceX, ent.getY(), 0, lane); - } - else{ - int level = levelCount.get(lane); - levelCount.add(lane, level+1); - setPosition(aEnt, ent.getX()+spaceX, ent.getY()+spaceY*level, level, lane); - } - if(i<ents.length) - assignPositions(ents, aEnt); -// else -// System.out.println(i+ " <<<<< "+ents.length); - break; - } - - } - } - } - - - else{ - ArrayList<String> conns = connectedEntities.get(ent.getName()); - System.err.println(conns.size()); - if(conns.size()>0){ - - for(String conn: conns){ - System.err.println("conn "+conn +" : "+ent.getName()); - for(ComponentEntity e: ents){ - if(e.getLane() == -1 && e.getName().equals(conn)){ - - int lane = ent.getLane()-1; - System.err.println(lane); - int level = levelCount.get(lane); - levelCount.add(lane, level+1); - setPosition(e, ent.getX()-spaceX, ent.getY()+spaceY*level, level, lane); - - break; - } - } - } - } - } - } - - private void setPosition(ComponentEntity ent, int x, int y, int level, int lane){ - ent.setX(x); - ent.setY(y); - ent.setLevel(level); - ent.setLane(lane); - } - - - private String[] splitValues(String str){ - return str.split("/"); - } +// private void positionEntities(ComponentEntity[] ents){ +// +// for(ComponentEntity ent: ents){ +// if(ent.getAdjacentEntities().size() != 0 || ents.length==1){ +// setPosition(ent, initPoint, initPoint, 0, 0); +// levelCount.add(0, 1); +// startEnt = ent; +// System.err.println(ent.getName()); +// break; +// } +// } +// +// +// if(startEnt != null) +// assignPositions(ents, startEnt); +// +// } +// +// private void assignPositions(ComponentEntity[] ents, ComponentEntity ent){ +// int i=0; +// if(ent.getAdjacentEntities().size()>0){ +// +// System.out.println(ent.getName()); +// for(String name: ent.getAdjacentEntities()){ +// //System.out.println("eee "+name); +// for(ComponentEntity aEnt: ents){ +// i++; +// if(name.equalsIgnoreCase(aEnt.getName())){ +// int lane = ent.getLane()+1; +// if(levelCount.size()<= lane){ +// levelCount.add(lane, 1); +// setPosition(aEnt, ent.getX()+spaceX, ent.getY(), 0, lane); +// } +// else{ +// int level = levelCount.get(lane); +// levelCount.add(lane, level+1); +// setPosition(aEnt, ent.getX()+spaceX, ent.getY()+spaceY*level, level, lane); +// } +// if(i<ents.length) +// assignPositions(ents, aEnt); +//// else +//// System.out.println(i+ " <<<<< "+ents.length); +// break; +// } +// +// } +// } +// } +// +// +// else{ +// ArrayList<String> conns = connectedEntities.get(ent.getName()); +// System.err.println(conns.size()); +// if(conns.size()>0){ +// +// for(String conn: conns){ +// System.err.println("conn "+conn +" : "+ent.getName()); +// for(ComponentEntity e: ents){ +// if(e.getLane() == -1 && e.getName().equals(conn)){ +// +// int lane = ent.getLane()-1; +// System.err.println(lane); +// int level = levelCount.get(lane); +// levelCount.add(lane, level+1); +// setPosition(e, ent.getX()-spaceX, ent.getY()+spaceY*level, level, lane); +// +// break; +// } +// } +// } +// } +// } +// } +// +// private void setPosition(ComponentEntity ent, int x, int y, int level, int lane){ +// ent.setX(x); +// ent.setY(y); +// ent.setLevel(level); +// ent.setLane(lane); +// } +// +// +// private String[] splitValues(String str){ +// return str.split("/"); +// } @@ -368,7 +693,7 @@ public class EntityBuilder { for(int i = 0 ; i < nl1.getLength();i++) { Element elt = (Element)nl1.item(i); System.out.println(elt.getAttribute("class")); - String serName = elt.getAttribute("class").split("\\.")[1]; + String serName = extractServiceName(elt.getAttribute("class")); ent.addAService(serName); } } @@ -377,6 +702,26 @@ public class EntityBuilder { } + /** + * + * This will extract the service name part from the class attribute of + * implementation.java element. + * eg: if class = "NirmalServiceImpl", returning service name would be "NirmalService" + */ + private String extractServiceName(String classAttr) { + if(classAttr != null){ + String[] x=classAttr.split("\\."); + String name = x[x.length-1]; + if(name.endsWith("Impl")){ + return name.substring(0, name.length()-4); + } + else{ + return name; + } + } + return ""; + } + private void setProperties(Element nVal, ComponentEntity ent) { NodeList nl = nVal.getElementsByTagName("property"); @@ -388,13 +733,13 @@ public class EntityBuilder { } } - public void setCompositeName(String compositeName) { - this.compositeName = compositeName; - } - - public String getCompositeName() { - return compositeName; - } +// public void setCompositeName(String compositeName) { +// this.compositeName = compositeName; +// } +// +// public String getCompositeName() { +// return compositeName; +// } public int getTotalWidth() { return totalWidth; diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/LayoutBuilder.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/LayoutBuilder.java new file mode 100755 index 0000000000..07f432d6a3 --- /dev/null +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout/LayoutBuilder.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.tuscany.sca.impl.layout; + +public class LayoutBuilder { + + private Entity[] elts = null; + private int[][] conns = null; + private Entity startEnt = null; + private int currentMaxLevel= 0; + private int startPosition = 250; + + /** + * Constructor which takes set of entities and their connection matrix + */ + public LayoutBuilder(Entity[] entities, int[][] connections){ + elts = entities; + conns = connections; + } + + /** + * Layout Building Algorithm + * ~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * Here we position (i.e. assigning a level and a lane) all Entities + * in a unique cell of a grid. + * + * lane0 lane1 lane2 lane3 .... + * _______________________________ + * level0 | | | | | + * |_______|_______|_______|_______| + * level1 | | | | | + * |_______|_______|_______|_______| + * level2 | | | | | + * + * 1) Determining the Entity at level0, lane0 (starting entity) + * -First Entity in the list of Entities which has one or more adjacent Entities + * -If there is only one Entity it will eventually chosen + * + * 2) Get connected Entities of starting Entity. + * * If there are connected entities; + * *For each connected Entity; + * *We assign a corresponding level and a lane + * *Then recurse the procedure for connections of the assigned Entity + * + * + */ + public Entity[] buildEntities(){ + + /** + * Finding the starting entity + */ + for(int i = 0 ; i < elts.length; i++) { + + Entity ent = elts[i]; + if( isConnected(ent.getId()) ){ + setPosition(ent, 0, 0); + startEnt = ent; + System.out.println("startEnt "+ent.getName()); + break; + } + + } + + assignPositions(startEnt); + assignCoordinates(); + + return elts; + + } + + private void assignCoordinates() { + + for(Entity ent: elts){ + ent.setX(ent.getParent().getX() + ent.getStartPosition()); + ent.setY(ent.getParent().getY() + ent.getStartPosition()/2); + } + } + + private void assignPositions(Entity ent) { + int id = ent.getId(); + int[] entConns = conns[id]; + + for(int i=0; i<entConns.length; i++){ + if( entConns[i] == 1 ){ + Entity nextEnt = findEntity(i); + + if(nextEnt.isPossitionSet()){ + currentMaxLevel = nextEnt.getLevel()+1; // for diagram clearness purpose + } + else if(nextEnt != null){ + setPosition(nextEnt, currentMaxLevel, ent.getLane()+1); + assignPositions(nextEnt); + } + } + + } + currentMaxLevel = ent.getLevel()+1; + } + + private Entity findEntity(int i) { + + for(Entity ent: elts){ + if(ent.getId() == i){ + return ent; + } + } + return null; + } + + /** + * If there's at least 1 connection, this will return true + */ + private boolean isConnected(int id) { + int[] entConns = conns[id]; + + System.out.println("entConns "+entConns.length); + for(int i=0; i<entConns.length; i++){ + + if(entConns[i] == 1){ + return true; + } + + } + + return false; + } + + private void setPosition(Entity ent, int level, int lane){ + ent.setLevel(level); + ent.setLane(lane); + ent.setPossitionSet(true); + } + +} diff --git a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/main/Main.java b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/main/Main.java index dd5762bc5e..0ab086b92a 100755 --- a/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/main/Main.java +++ b/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/main/Main.java @@ -25,7 +25,9 @@ import org.apache.tuscany.sca.impl.diagram.DiagramGenerator; import org.apache.tuscany.sca.impl.io.XMLReader; import org.apache.tuscany.sca.impl.io.XMLWriter; import org.apache.tuscany.sca.impl.layout.ComponentEntity; +import org.apache.tuscany.sca.impl.layout.CompositeEntity; import org.apache.tuscany.sca.impl.layout.EntityBuilder; +import org.apache.tuscany.sca.impl.layout.LayoutBuilder; import org.w3c.dom.Document; public class Main { @@ -38,12 +40,22 @@ public class Main { public static void main(String[] args) throws Exception { XMLReader reader = new XMLReader(); - Document doc =reader.parseXMLFile(System.getProperty("user.dir")+"/input/composite.xml"); + Document doc =reader.parseXMLFile(System.getProperty("user.dir")+"/input/composite_with_compositeService.xml");//composite1.xml composite_with_compositeService.xml"); EntityBuilder eb = new EntityBuilder(doc); - ComponentEntity[] ents =eb.buildEntities(); - DiagramGenerator dg = new DiagramGenerator(ents, eb.getTotalHeight(), eb.getTotalWidth(), eb.getCompositeName()); + CompositeEntity comp =eb.buildCompositeEntity(); + System.out.println("comp "+comp.getName()); + +// ComponentEntity[] ents = comp.getComponentList(); +// int[][] conns = comp.getConnections(); +// System.out.println("entConns "+conns.length); +// LayoutBuilder buildLayout = new LayoutBuilder(ents , conns); +// buildLayout.buildEntities(); + + //DiagramGenerator dg = new DiagramGenerator(ents, eb.getTotalHeight(), eb.getTotalWidth(), eb.getCompositeName()); + DiagramGenerator dg = new DiagramGenerator(comp); Document svg =dg.buildSVGDocument(); - File outFile = new File(outFileDir+eb.getCompositeName()+"_diagram.svg"); + + File outFile = new File(outFileDir+comp.getName()+"_diagram.svg"); XMLWriter writer = new XMLWriter(); writer.fileWriter(svg, outFile); } |