summaryrefslogtreecommitdiffstats
path: root/collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java')
-rwxr-xr-xcollaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/diagram/DiagramGenerator.java306
1 files changed, 190 insertions, 116 deletions
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 742575f501..57b9ffea40 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
@@ -20,6 +20,7 @@
package org.apache.tuscany.sca.impl.diagram;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.Map.Entry;
@@ -28,6 +29,7 @@ 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.Link;
import org.apache.tuscany.sca.impl.artifacts.NormalWire;
import org.apache.tuscany.sca.impl.artifacts.Property;
import org.apache.tuscany.sca.impl.artifacts.Reference;
@@ -42,69 +44,77 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DiagramGenerator {
-
+
private CompositeEntity comp;
-// private Entity[] entities;
-// private int height, width;
private Document doc;
-// private String compositeName;
private String svgNS ;
private Element svgRoot;
private ArrayList<Reference> refs= new ArrayList<Reference>();
private ArrayList<Service> sers= new ArrayList<Service>();
+
+ private int lastUsedChangingFactor = 0;
+ enum changingFactor{a(20), b(25), c(30), d(35), e(40), f(15);
+
+ private final int val;
+
+ private changingFactor(int x){
+ val = x;
+ }
+
+ public int getVal(){
+ return val;
+ }
+
+ };
+
+ enum color {black}//, violet, red, green};
+ private int previousWireColor = 0;
/**
- * Constructor to generate a SVG diagram for compositeName
- * with a given height and a width and consisting of entities.
+ * Constructor to generate a SVG diagram for a given CompositeEntity
+ * Object.
*/
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);
// 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: comp.getComponentList()){
-
+
+ for(ComponentEntity ent: comp.getComponentList()){
+
addComponent(ent);
- addService(ent);
- addReference(ent);
- addProperties(ent);
+ addComponentService(ent);
+ addComponentReference(ent);
+ addComponentProperties(ent);
}
-
- addCompositeService(comp);
- addCompositeReference(comp);
- addCompositeProperties(comp);
-
+
+ addCompositeService();
+ addCompositeReference();
+ addCompositeProperties();
+
addComponentConnections();
addReferencePromotion();
addServicePromotion();
+ addInclusions();
+
return doc;
}
-
-
private void addLayer() {
@@ -112,7 +122,7 @@ public class DiagramGenerator {
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();
@@ -120,10 +130,10 @@ public class DiagramGenerator {
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);
}
@@ -137,27 +147,54 @@ public class DiagramGenerator {
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);
}
}
}
-
+ private void addInclusions() {
+ Layer inclusionLayer = new Layer();
+ int constant = 5;
+ int x0 = comp.getX()+constant;
+ int y0 = comp.getY()+comp.getHeight()-(Component.DEFAULT_HEIGHT/2+constant);
+ int height = Component.DEFAULT_HEIGHT/2;
+ int width = comp.getWidth()-constant*2;
+
+ Element layerElt = inclusionLayer.addElement(doc, svgNS, x0, y0, height,
+ width , "#E5E5C0");
+
+ Element text = Text.addTextElement(doc, svgNS, x0+constant, y0+constant*2, "Included Composites");
+
+ svgRoot.appendChild(layerElt);
+ svgRoot.appendChild(text);
+
+ text = Text.addTextElement(doc, svgNS, x0+constant, y0+constant*7, "");
+
+ for(String includedComposite : comp.getIncludedComposites()){
+
+ Link link = new Link();
+ Element aLink = link.addElement(doc, svgNS, includedComposite+comp.getFileNameSuffix(), includedComposite);
+ text.appendChild(aLink);
+
+ }
+ svgRoot.appendChild(text);
+ }
+
/**
* Connects references to services.
*/
private void addComponentConnections() {
for(Entity ent: comp.getComponentList()){
- if(ent instanceof ComponentEntity){
-
+ //if(ent instanceof ComponentEntity){
+
for(Iterator it= ((ComponentEntity)ent).getReferenceToServiceMap().entrySet().iterator();
- it.hasNext();){
+ it.hasNext();){
Entry entry = (Entry) it.next();
String ref = (String)entry.getKey();
String ser = (String)entry.getValue();
@@ -169,28 +206,48 @@ public class DiagramGenerator {
addWire(r,s);
}
}
- }
+ //}
}
}
- private void addWire(Reference r, Service s) {
+ /**
+ * This is to remove overlapping of wire elements
+ */
+ private String getColor() {
+ previousWireColor =previousWireColor % color.values().length;
+ return color.values()[previousWireColor++].toString();
+ }
+
+
+ /**
+ * This is to remove overlapping of wire elements
+ */
+ private int getChangingFactor() {
+
+ lastUsedChangingFactor = lastUsedChangingFactor % changingFactor.values().length;
+ return changingFactor.values()[lastUsedChangingFactor++].getVal();
+
+ }
+
+ private void addWire(Reference r, Service s) {
+
Wire edge = new NormalWire();
- Element wire = edge.addElement(doc, svgNS, r, s);
+ Element wire = edge.addElement(doc, svgNS, r, s, getChangingFactor(), getColor());
svgRoot.appendChild(wire);
}
-
+
private void addWire(Service s1, Service s2) {
DashedWire edge = new DashedWire();
- Element wire = edge.addElement(doc, svgNS, s1, s2);
+ Element wire = edge.addElement(doc, svgNS, s1, s2, getChangingFactor(), getColor());
svgRoot.appendChild(wire);
}
-
+
private void addWire(Reference r1, Reference r2) {
DashedWire edge = new DashedWire();
- Element wire = edge.addElement(doc, svgNS, r1, r2);
+ Element wire = edge.addElement(doc, svgNS, r1, r2, getChangingFactor(), getColor());
svgRoot.appendChild(wire);
}
@@ -207,7 +264,7 @@ public class DiagramGenerator {
private Reference getRef(String ref) {
for(Reference r: refs){
-
+
if(r.getContainerName().equals(ref) || r.getName().equals(ref)){
return r;
}
@@ -215,7 +272,7 @@ public class DiagramGenerator {
return null;
}
- private void addProperties(Entity ent) {
+ private void addComponentProperties(ComponentEntity ent) {
int propLen = ent.getPropLength();
int x= ent.getX() + Property.SPACING_FOR_COMPONENT;
int y= ent.getY()-propLen/2;
@@ -224,18 +281,19 @@ public class DiagramGenerator {
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_COMPONENT);
-
+
pro.setName(prop);
pro.setContainerName(ent.getName());
}
}
- private void addReference(Entity ent) {
+ private void addComponentReference(ComponentEntity ent) {
+
int refHeight = ent.getRefHeight();
int x=(ent.getX()+ent.getWidth())-(refHeight*2/3);
int y=ent.getY() + Reference.SPACING_FOR_COMPONENT;
@@ -246,40 +304,30 @@ public class DiagramGenerator {
Element text = Text.addTextElement(doc, svgNS, x, y+refHeight/2, ref);
svgRoot.appendChild(polygon);
svgRoot.appendChild(text);
-
+
y += (refHeight + Reference.SPACING_FOR_COMPONENT);
-
+
refer.setName(ref);
refer.setContainerName(ent.getName());
refs.add(refer);
-
+
}
}
- private String[] setRefOrder(Entity e){
-
+ /**
+ * This method is used to organize the Component References,
+ * in a manner where they are stay approximately in-line with the
+ * connecting Service. This would enhance the clearness of the diagram.
+ */
+ private String[] setRefOrder(ComponentEntity e){
+
ArrayList<String> refs = e.getReferences();
ArrayList<String> sers = new ArrayList<String>();
String[] orderedRefs = new String[refs.size()];
- for(int i=0;i<refs.size();i++){
- sers.add(i, "");
- }
-
- if(e instanceof ComponentEntity){
- for(Iterator it= ((ComponentEntity)e).getReferenceToServiceMap().entrySet().iterator();it.hasNext();){
- Entry entry = (Entry) it.next();
- String ref = (String)entry.getKey();
- String ser = (String)entry.getValue();
- System.out.println("---------"+ref);
- int idx= refs.indexOf(ref);
- System.out.println("---------"+sers.get(idx));
- sers.remove(idx);
- sers.add(idx ,ser);
- System.out.println(refs.get(idx)+"---"+sers.get(idx));
+ //sers = new ArrayList<String>(e.getReferenceToServiceMap().values());
- }
- }
+ sers = buildReferenceToMappingServiceList(refs, e);
for(String eName: e.getAdjacentEntities()){
for(Entity ent: comp.getComponentList()){
@@ -289,11 +337,11 @@ public class DiagramGenerator {
for(String s1: ent.getServices()){
//System.err.println("XXXXX "+ s1 +" ::: "+s);
if(s1.equals(s) || s.equals(ent.getName())){
- System.err.println("|||||||| "+ sers.size()+ " ||| " + refs.size()+"|| "+orderedRefs.length);
+ //System.err.println("|||||||| "+ sers.size()+ " ||| " + refs.size()+"|| "+orderedRefs.length);
if(orderedRefs[ent.getLevel()] == null){
//System.err.println("XXXXX "+ sers.get(1)+ " ::::::: "+refs.get(1));
-// System.err.println("XXXXX "+ sers.get(2)+ " ::::::: "+refs.get(2));
-// System.err.println("XXXXX "+ sers.get(3)+ " ::::::: "+refs.get(3));
+ // System.err.println("XXXXX "+ sers.get(2)+ " ::::::: "+refs.get(2));
+ // System.err.println("XXXXX "+ sers.get(3)+ " ::::::: "+refs.get(3));
System.err.println("XXXXX "+ refs.get(sers.indexOf(s))+" ::: "+ent.getLevel()+" ::: "+ent.getName());
orderedRefs[ent.getLevel()] = refs.get(sers.indexOf(s));
break;
@@ -301,7 +349,7 @@ public class DiagramGenerator {
else{
for(int i=ent.getLevel();i<orderedRefs.length;i++){
if(orderedRefs[i]== null){
-
+
orderedRefs[i] = refs.get(sers.indexOf(s));
break;
}
@@ -317,7 +365,7 @@ public class DiagramGenerator {
}
}
}
-
+
//adding references which are not connected to any service
for(String ref : refs){
for(int i=0; i<orderedRefs.length ; i++){
@@ -330,18 +378,44 @@ public class DiagramGenerator {
}
}
}
-
+
return orderedRefs;
}
-
- private void addService(Entity ent) {
+
+ private ArrayList<String> buildReferenceToMappingServiceList(ArrayList<String> refs, ComponentEntity e) {
+
+ ArrayList<String> sers = new ArrayList<String>();
+
+ for(int i=0;i<refs.size();i++){
+ sers.add(i, "");
+ }
+
+ for(Iterator it= e.getReferenceToServiceMap().entrySet().iterator();
+ it.hasNext();){
+
+ Entry entry = (Entry) it.next();
+ String ref = (String)entry.getKey();
+ String ser = (String)entry.getValue();
+ //System.out.println("---------"+ref);
+ int idx= refs.indexOf(ref);
+ //System.out.println("---------"+sers.get(idx));
+ sers.remove(idx);
+ sers.add(idx ,ser);
+ //System.out.println(refs.get(idx)+"---"+sers.get(idx));
+
+ }
+
+ return sers;
+ }
+
+ private void addComponentService(ComponentEntity ent) {
int serHeight = ent.getSerHeight();
int x= ent.getX()-(serHeight*2/3);
int y= ent.getY() + Service.SPACING_FOR_COMPONENT;
System.out.println("''''''"+ent.getName() +" '''''' "+ ent.getServices().size());
for(String ser: ent.getServices()){
-
+
Service serve= new Service();
Element polygon = serve.addElement(doc, svgNS, x, y, serHeight);
Element text;
@@ -349,20 +423,20 @@ public class DiagramGenerator {
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_COMPONENT);
-
+
serve.setName(ser);
serve.setContainerName(ent.getName());
sers.add(serve);
}
}
-
- private void addCompositeService(CompositeEntity comp) {
-
+
+ private void addCompositeService() {
+
int serHeight = comp.getSerHeight();
int x= comp.getX()-(serHeight*2/3);
int y= comp.getY() + Service.SPACING_FOR_COMPOSITE;
@@ -370,7 +444,7 @@ public class DiagramGenerator {
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;
@@ -378,20 +452,20 @@ public class DiagramGenerator {
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) {
-
+ private void addCompositeReference() {
+
int refHeight = comp.getRefHeight();
int x=(comp.getX()+comp.getWidth())-(refHeight*2/3);
int y=comp.getY() + Reference.SPACING_FOR_COMPOSITE;
@@ -402,18 +476,18 @@ public class DiagramGenerator {
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) {
+
+ private void addCompositeProperties() {
int propLen = comp.getPropLength();
int x= comp.getX() + Property.SPACING_FOR_COMPOSITE;
int y= comp.getY()-propLen/2;
@@ -422,47 +496,47 @@ public class DiagramGenerator {
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),
+ Element text = Text.addTextElement(doc, svgNS, ent.getX(),
ent.getY()+(ent.getHeight()+Component.TEXT_SPACING), ent.getName());
-
+
svgRoot.appendChild(com);
svgRoot.appendChild(text);
-
+
comp.setName(ent.getName());
}
private void addComposite() {
Composite composite = new Composite();
-
+
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(comp.getName());
-
-
+
+
}
-
-
+
+
}