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.java1052
1 files changed, 527 insertions, 525 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 f2c0ca08eb..822e427026 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
@@ -45,556 +45,558 @@ import org.w3c.dom.Element;
public class DiagramGenerator {
- private CompositeEntity comp;
- private Document doc;
- private String svgNS ;
- private Element svgRoot;
- private ArrayList<ReferenceArtifact> refs= new ArrayList<ReferenceArtifact>();
- private ArrayList<ServiceArtifact> sers= new ArrayList<ServiceArtifact>();
- private int diagramHeight, diagramWidth;
-
- private boolean isHtml;
-
- 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 a given CompositeEntity
- * Object.
- */
- public DiagramGenerator(CompositeEntity comp, boolean isHtml) {
-
- this.comp = comp;
- this.isHtml = isHtml;
-
- }
-
- /**
- * 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();
-
- setDiagramHeight(comp.getHeight()+200);
- setDiagramWidth(comp.getWidth()+400);
-
- svgRoot.setAttributeNS(null, "viewBox", "0 0 "+getDiagramWidth()+" "+getDiagramHeight());
-
- addLayer();
- addComposite();
-
- for(ComponentEntity ent: comp.getComponentList()){
-
- addComponent(ent);
- addComponentProperties(ent);
- addComponentService(ent);
- addComponentReference(ent);
- }
-
- addCompositeProperties();
- addCompositeService();
- addCompositeReference();
-
- addComponentConnections();
- addReferencePromotion();
- addServicePromotion();
-
- addInclusions();
-
- return doc;
- }
-
- private void addLayer() {
-
- Layer outerLayer = new Layer();
- Element layerElt = outerLayer.addElement(doc, svgNS, 0, 0, getDiagramHeight(), getDiagramWidth() );
- 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();
- ArrayList<String> componentRef = (ArrayList<String>)entry.getValue();
-
- ReferenceArtifact r1 = getRef(compositeRef);
-
- for(String ref: componentRef){
-
- ReferenceArtifact r2 = getRef(ref);
-
- 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();
-
- ServiceArtifact s1 = getSer(compositeSer);
- ServiceArtifact s2 = getSer(componentSer);
-
- if(s1 != null && s2 != null){
- addWire(s1, s2);
- }
- }
- }
-
- private void addInclusions() {
-
- if(!comp.getIncludedComposites().isEmpty()){
-
- Layer inclusionLayer = new Layer();
- int constant = 5;
- int x0 = comp.getX()+constant;
- int y0 = comp.getY()+comp.getHeight()-(Constant.COMPONENT_DEFAULT_HEIGHT/2+constant);
- int height = Constant.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, "");
-
- String ext;
-
- if(isHtml){
- ext = ".html";
- }
- else{
- ext = ".svg";
- }
-
- for(String includedComposite : comp.getIncludedComposites()){
-
- Link link = new Link();
- Element aLink = link.addElement(doc, svgNS, includedComposite+comp.getFileNameSuffix()+ext, includedComposite);
- text.appendChild(aLink);
-
- }
- svgRoot.appendChild(text);
- }
- }
-
- /**
- * Connects references to services.
- */
- private void addComponentConnections() {
-
- for(Entity ent: comp.getComponentList()){
- //if(ent instanceof ComponentEntity){
-
- for(Iterator it= ((ComponentEntity)ent).getReferenceToServiceMap().entrySet().iterator();
- it.hasNext();){
- Entry entry = (Entry) it.next();
- String ref = (String)entry.getKey();
- String ser = (String)entry.getValue();
-
- ReferenceArtifact r = getRef(ref);
- ServiceArtifact s = getSer(ser);
-
- if(r != null && s != null){
- addWire(r,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(ReferenceArtifact r, ServiceArtifact s) {
-
- WireArtifact edge = new NormalWire();
- Element wire = edge.addElement(doc, svgNS, r, s, getChangingFactor(), getColor());
- svgRoot.appendChild(wire);
- }
-
- private void addWire(ServiceArtifact s1, ServiceArtifact s2) {
-
- DashedWire edge = new DashedWire();
- Element wire = edge.addElement(doc, svgNS, s1, s2, getChangingFactor(), getColor());
- svgRoot.appendChild(wire);
- }
-
- private void addWire(ReferenceArtifact r1, ReferenceArtifact r2) {
-
- DashedWire edge = new DashedWire();
- Element wire = edge.addElement(doc, svgNS, r1, r2, getChangingFactor(), getColor());
- svgRoot.appendChild(wire);
- }
-
- private ServiceArtifact getSer(String ser) {
-
- for(ServiceArtifact s: sers){
- if(s.getContainerName().equals(ser) || s.getName().equals(ser)){
- return s;
- }
- }
- return null;
- }
-
- private ReferenceArtifact getRef(String ref) {
-
- for(ReferenceArtifact r: refs){
-
- if(r.getContainerName().equals(ref) || r.getName().equals(ref)){
- return r;
- }
- }
- return null;
- }
-
- private void addComponentProperties(ComponentEntity ent) {
- int propLen = ent.getPropLength();
- int x= ent.getX() + Constant.SPACING_FOR_COMPONENT_OF_PROPERTY;
- int y= ent.getY()-propLen/2;
-
- for(String prop: ent.getProperties()){
- PropertyArtifact pro = new PropertyArtifact();
- Element property = pro.addElement(doc, svgNS, x, y, propLen);
- Element text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, prop);
-
- svgRoot.appendChild(property);
- svgRoot.appendChild(text);
-
- x += (propLen + Constant.SPACING_FOR_COMPONENT_OF_PROPERTY);
-
- pro.setName(prop);
- pro.setContainerName(ent.getName());
- }
- }
-
- private void addComponentReference(ComponentEntity ent) {
-
- int refHeight = ent.getRefHeight();
- int x=(ent.getX()+ent.getWidth())-(refHeight*2/3);
- int y=ent.getY() + Constant.SPACING_FOR_COMPONENT_OF_REFERENCE;
-
- for(String ref: setRefOrder(ent)){
- ReferenceArtifact refer= new ReferenceArtifact();
- Element polygon = refer.addElement(doc, svgNS, x, y, refHeight);
- Element text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, ref);
- svgRoot.appendChild(polygon);
- svgRoot.appendChild(text);
-
- y += (refHeight + Constant.SPACING_FOR_COMPONENT_OF_REFERENCE);
-
- refer.setName(ref);
- refer.setContainerName(ent.getName());
- refs.add(refer);
-
- }
- }
-
- /**
- * 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()];
-
- //sers = new ArrayList<String>(e.getReferenceToServiceMap().values());
-
- sers = buildReferenceToMappingServiceList(refs, e);
-
- for(String eName: e.getAdjacentEntities()){
- for(Entity ent: comp.getComponentList()){
-
- if(ent.getName().equals(eName)){
- for(String s : sers){
- 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);
- 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 "+ refs.get(sers.indexOf(s))+" ::: "+ent.getLevel()+" ::: "+ent.getName());
- orderedRefs[ent.getLevel()] = refs.get(sers.indexOf(s));
- break;
- }
- else{
- for(int i=ent.getLevel();i<orderedRefs.length;i++){
- if(orderedRefs[i]== null){
-
- orderedRefs[i] = refs.get(sers.indexOf(s));
- break;
- }
-// else{
-// if(i==orderedRefs.length)
-// System.out.println("GRRR");
-// }
- }
- }
- }
- }
- }
- }
- }
- }
-
- //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;
- }
-
- 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() + Constant.SPACING_FOR_COMPONENT_OF_SERVICE;
-
- //System.out.println("''''''"+ent.getName() +" '''''' "+ ent.getServices().size());
- for(String ser: ent.getServices()){
-
- ServiceArtifact serve= new ServiceArtifact();
- Element polygon = serve.addElement(doc, svgNS, x, y, serHeight);
- Element text;
- if(!ser.endsWith("Impl"))
- text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, ser);
- else
- text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, "");
-
- svgRoot.appendChild(polygon);
- svgRoot.appendChild(text);
-
- y += (serHeight + Constant.SPACING_FOR_COMPONENT_OF_SERVICE);
-
- serve.setName(ser);
- serve.setContainerName(ent.getName());
- sers.add(serve);
- }
- }
-
- private void addCompositeService() {
-
- int serHeight = comp.getSerHeight();
- int x= comp.getX()-(serHeight*2/3);
- int y= comp.getY() + getStartingPoint(comp.getHeight(), serHeight, Constant.SPACING_FOR_COMPOSITE_OF_SERVICE,
- comp.getServices().size());
-
- //int y= comp.getY() + Constant.SPACING_FOR_COMPOSITE_OF_SERVICE;
-
- //System.err.println(serHeight);
- //System.out.println("''''''"+((CompositeEntity)comp).getName() +" '''''' "+ comp.getServices().size());
- for(String ser: comp.getServices()){
-
- ServiceArtifact serve= new ServiceArtifact();
- Element polygon = serve.addElement(doc, svgNS, x, y, serHeight);
- Element text;
- if(!ser.endsWith("Impl"))
- text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, ser);
- else
- text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, "");
-
- svgRoot.appendChild(polygon);
- svgRoot.appendChild(text);
-
- y += (serHeight + Constant.SPACING_FOR_COMPOSITE_OF_SERVICE);
-
- serve.setName(ser);
- serve.setContainerName(comp.getName());
- sers.add(serve);
- }
- }
-
- private void addCompositeReference() {
-
- int refHeight = comp.getRefHeight();
-
- int x=(comp.getX()+comp.getWidth())-(refHeight*2/3);
- int y= comp.getY() + getStartingPoint(comp.getHeight(), refHeight, Constant.SPACING_FOR_COMPOSITE_OF_REFERENCE,
- comp.getReferences().size());
-
- for(String ref: comp.getReferences()){
- ReferenceArtifact refer= new ReferenceArtifact();
- Element polygon = refer.addElement(doc, svgNS, x, y, refHeight);
- Element text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, ref);
- svgRoot.appendChild(polygon);
- svgRoot.appendChild(text);
-
- y += (refHeight + Constant.SPACING_FOR_COMPOSITE_OF_REFERENCE);
-
- refer.setName(ref);
- refer.setContainerName(comp.getName());
- refs.add(refer);
+ private CompositeEntity comp;
+ private Document doc;
+ private String svgNS;
+ private Element svgRoot;
+ private ArrayList<ReferenceArtifact> refs = new ArrayList<ReferenceArtifact>();
+ private ArrayList<ServiceArtifact> sers = new ArrayList<ServiceArtifact>();
+ private int diagramHeight, diagramWidth;
- }
+ private boolean isHtml;
- }
+ private int lastUsedChangingFactor = 0;
- //Algorithm to position in center
- private int getStartingPoint(int compDim, int artifactDim, int gap, int artifactQty) {
+ enum changingFactor {
+ a(20), b(25), c(30), d(35), e(40), f(15);
- int x = (compDim - artifactQty * artifactDim - (artifactQty-1) * gap ) / 2;
- return x;
- }
+ private final int val;
- private void addCompositeProperties() {
- int propLen = comp.getPropLength();
-
- int x= comp.getX() + getStartingPoint(comp.getWidth(), propLen, Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY,
- comp.getProperties().size());
- //int x= comp.getX() + Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY;
- int y= comp.getY()-propLen/2;
+ private changingFactor(int x) {
+ val = x;
+ }
- for(String prop: comp.getProperties()){
- PropertyArtifact pro = new PropertyArtifact();
- Element property = pro.addElement(doc, svgNS, x, y, propLen);
- Element text = Text.addTextElement(doc, svgNS, x, y-Constant.SPACING_FOR_TEXT, prop);
+ public int getVal() {
+ return val;
+ }
- svgRoot.appendChild(property);
- svgRoot.appendChild(text);
+ };
- x += (propLen + Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY);
+ enum color {
+ black
+ }//, violet, red, green};
- pro.setName(prop);
- pro.setContainerName(comp.getName());
- }
- }
+ private int previousWireColor = 0;
- private void addComponent(Entity ent) {
+ /**
+ * Constructor to generate a SVG diagram for a given CompositeEntity
+ * Object.
+ */
+ public DiagramGenerator(CompositeEntity comp, boolean isHtml) {
- ComponentArtifact comp = new ComponentArtifact();
- //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.getY()+(ent.getHeight()+Constant.COMPONENT_TEXT_SPACING), ent.getName());
+ this.comp = comp;
+ this.isHtml = isHtml;
- svgRoot.appendChild(com);
- svgRoot.appendChild(text);
+ }
- comp.setName(ent.getName());
- }
+ /**
+ * Draws the diagram.
+ */
+ public Document buildSVGDocument() {
- private void addComposite() {
+ DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
+ svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
+ doc = impl.createDocument(svgNS, "svg", null);
- CompositeArtifact composite = new CompositeArtifact();
+ // Get the root element (the 'svg' element).
+ svgRoot = doc.getDocumentElement();
- Element composi = composite.addElement(doc, svgNS, comp.getX(), comp.getY(), comp.getHeight(), comp.getWidth());
- Element text = Text.addTextElement(doc, svgNS, comp.getX()+20, comp.getY() +20, comp.getName());
+ setDiagramHeight(comp.getHeight() + 200);
+ setDiagramWidth(comp.getWidth() + 400);
- svgRoot.appendChild(composi);
- svgRoot.appendChild(text);
+ svgRoot.setAttributeNS(null, "viewBox", "0 0 " + getDiagramWidth() + " " + getDiagramHeight());
- composite.setName(comp.getName());
+ addLayer();
+ addComposite();
+ for (ComponentEntity ent : comp.getComponentList()) {
- }
+ addComponent(ent);
+ addComponentProperties(ent);
+ addComponentService(ent);
+ addComponentReference(ent);
+ }
- public void setDiagramHeight(int diagramHeight) {
- this.diagramHeight = diagramHeight;
- }
+ addCompositeProperties();
+ addCompositeService();
+ addCompositeReference();
- public int getDiagramHeight() {
- return diagramHeight;
- }
+ addComponentConnections();
+ addReferencePromotion();
+ addServicePromotion();
- public void setDiagramWidth(int diagramWidth) {
- this.diagramWidth = diagramWidth;
- }
+ addInclusions();
- public int getDiagramWidth() {
- return diagramWidth;
- }
+ return doc;
+ }
+ private void addLayer() {
+ Layer outerLayer = new Layer();
+ Element layerElt = outerLayer.addElement(doc, svgNS, 0, 0, getDiagramHeight(), getDiagramWidth());
+ 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();
+ ArrayList<String> componentRef = (ArrayList<String>)entry.getValue();
+
+ ReferenceArtifact r1 = getRef(compositeRef);
+
+ for (String ref : componentRef) {
+
+ ReferenceArtifact r2 = getRef(ref);
+
+ 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();
+
+ ServiceArtifact s1 = getSer(compositeSer);
+ ServiceArtifact s2 = getSer(componentSer);
+
+ if (s1 != null && s2 != null) {
+ addWire(s1, s2);
+ }
+ }
+ }
+
+ private void addInclusions() {
+
+ if (!comp.getIncludedComposites().isEmpty()) {
+
+ Layer inclusionLayer = new Layer();
+ int constant = 5;
+ int x0 = comp.getX() + constant;
+ int y0 = comp.getY() + comp.getHeight() - (Constant.COMPONENT_DEFAULT_HEIGHT / 2 + constant);
+ int height = Constant.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, "");
+
+ String ext;
+
+ if (isHtml) {
+ ext = ".html";
+ } else {
+ ext = ".svg";
+ }
+
+ for (String includedComposite : comp.getIncludedComposites()) {
+
+ Link link = new Link();
+ Element aLink =
+ link.addElement(doc, svgNS, includedComposite + comp.getFileNameSuffix() + ext, includedComposite);
+ text.appendChild(aLink);
+
+ }
+ svgRoot.appendChild(text);
+ }
+ }
+
+ /**
+ * Connects references to services.
+ */
+ private void addComponentConnections() {
+
+ for (Entity ent : comp.getComponentList()) {
+ //if(ent instanceof ComponentEntity){
+
+ for (Iterator it = ((ComponentEntity)ent).getReferenceToServiceMap().entrySet().iterator(); it.hasNext();) {
+ Entry entry = (Entry)it.next();
+ String ref = (String)entry.getKey();
+ String ser = (String)entry.getValue();
+
+ ReferenceArtifact r = getRef(ref);
+ ServiceArtifact s = getSer(ser);
+
+ if (r != null && s != null) {
+ addWire(r, 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(ReferenceArtifact r, ServiceArtifact s) {
+
+ WireArtifact edge = new NormalWire();
+ Element wire = edge.addElement(doc, svgNS, r, s, getChangingFactor(), getColor());
+ svgRoot.appendChild(wire);
+ }
+
+ private void addWire(ServiceArtifact s1, ServiceArtifact s2) {
+
+ DashedWire edge = new DashedWire();
+ Element wire = edge.addElement(doc, svgNS, s1, s2, getChangingFactor(), getColor());
+ svgRoot.appendChild(wire);
+ }
+
+ private void addWire(ReferenceArtifact r1, ReferenceArtifact r2) {
+
+ DashedWire edge = new DashedWire();
+ Element wire = edge.addElement(doc, svgNS, r1, r2, getChangingFactor(), getColor());
+ svgRoot.appendChild(wire);
+ }
+
+ private ServiceArtifact getSer(String ser) {
+
+ for (ServiceArtifact s : sers) {
+ if (s.getContainerName().equals(ser) || s.getName().equals(ser)) {
+ return s;
+ }
+ }
+ return null;
+ }
+
+ private ReferenceArtifact getRef(String ref) {
+
+ for (ReferenceArtifact r : refs) {
+
+ if (r.getContainerName().equals(ref) || r.getName().equals(ref)) {
+ return r;
+ }
+ }
+ return null;
+ }
+
+ private void addComponentProperties(ComponentEntity ent) {
+ int propLen = ent.getPropLength();
+ int x = ent.getX() + Constant.SPACING_FOR_COMPONENT_OF_PROPERTY;
+ int y = ent.getY() - propLen / 2;
+
+ for (String prop : ent.getProperties()) {
+ PropertyArtifact pro = new PropertyArtifact();
+ Element property = pro.addElement(doc, svgNS, x, y, propLen);
+ Element text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, prop);
+
+ svgRoot.appendChild(property);
+ svgRoot.appendChild(text);
+
+ x += (propLen + Constant.SPACING_FOR_COMPONENT_OF_PROPERTY);
+
+ pro.setName(prop);
+ pro.setContainerName(ent.getName());
+ }
+ }
+
+ private void addComponentReference(ComponentEntity ent) {
+
+ int refHeight = ent.getRefHeight();
+ int x = (ent.getX() + ent.getWidth()) - (refHeight * 2 / 3);
+ int y = ent.getY() + Constant.SPACING_FOR_COMPONENT_OF_REFERENCE;
+
+ for (String ref : setRefOrder(ent)) {
+ ReferenceArtifact refer = new ReferenceArtifact();
+ Element polygon = refer.addElement(doc, svgNS, x, y, refHeight);
+ Element text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, ref);
+ svgRoot.appendChild(polygon);
+ svgRoot.appendChild(text);
+
+ y += (refHeight + Constant.SPACING_FOR_COMPONENT_OF_REFERENCE);
+
+ refer.setName(ref);
+ refer.setContainerName(ent.getName());
+ refs.add(refer);
+
+ }
+ }
+
+ /**
+ * 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()];
+
+ //sers = new ArrayList<String>(e.getReferenceToServiceMap().values());
+
+ sers = buildReferenceToMappingServiceList(refs, e);
+
+ for (String eName : e.getAdjacentEntities()) {
+ for (Entity ent : comp.getComponentList()) {
+
+ if (ent.getName().equals(eName)) {
+ for (String s : sers) {
+ 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);
+ 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 "+ refs.get(sers.indexOf(s))+" ::: "+ent.getLevel()+" ::: "+ent.getName());
+ orderedRefs[ent.getLevel()] = refs.get(sers.indexOf(s));
+ break;
+ } else {
+ for (int i = ent.getLevel(); i < orderedRefs.length; i++) {
+ if (orderedRefs[i] == null) {
+
+ orderedRefs[i] = refs.get(sers.indexOf(s));
+ break;
+ }
+ // else{
+ // if(i==orderedRefs.length)
+ // System.out.println("GRRR");
+ // }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //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;
+ }
+
+ 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() + Constant.SPACING_FOR_COMPONENT_OF_SERVICE;
+
+ //System.out.println("''''''"+ent.getName() +" '''''' "+ ent.getServices().size());
+ for (String ser : ent.getServices()) {
+
+ ServiceArtifact serve = new ServiceArtifact();
+ Element polygon = serve.addElement(doc, svgNS, x, y, serHeight);
+ Element text;
+ if (!ser.endsWith("Impl"))
+ text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, ser);
+ else
+ text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, "");
+
+ svgRoot.appendChild(polygon);
+ svgRoot.appendChild(text);
+
+ y += (serHeight + Constant.SPACING_FOR_COMPONENT_OF_SERVICE);
+
+ serve.setName(ser);
+ serve.setContainerName(ent.getName());
+ sers.add(serve);
+ }
+ }
+
+ private void addCompositeService() {
+
+ int serHeight = comp.getSerHeight();
+ int x = comp.getX() - (serHeight * 2 / 3);
+ int y =
+ comp.getY() + getStartingPoint(comp.getHeight(), serHeight, Constant.SPACING_FOR_COMPOSITE_OF_SERVICE, comp
+ .getServices().size());
+
+ //int y= comp.getY() + Constant.SPACING_FOR_COMPOSITE_OF_SERVICE;
+
+ //System.err.println(serHeight);
+ //System.out.println("''''''"+((CompositeEntity)comp).getName() +" '''''' "+ comp.getServices().size());
+ for (String ser : comp.getServices()) {
+
+ ServiceArtifact serve = new ServiceArtifact();
+ Element polygon = serve.addElement(doc, svgNS, x, y, serHeight);
+ Element text;
+ if (!ser.endsWith("Impl"))
+ text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, ser);
+ else
+ text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, "");
+
+ svgRoot.appendChild(polygon);
+ svgRoot.appendChild(text);
+
+ y += (serHeight + Constant.SPACING_FOR_COMPOSITE_OF_SERVICE);
+
+ serve.setName(ser);
+ serve.setContainerName(comp.getName());
+ sers.add(serve);
+ }
+ }
+
+ private void addCompositeReference() {
+
+ int refHeight = comp.getRefHeight();
+
+ int x = (comp.getX() + comp.getWidth()) - (refHeight * 2 / 3);
+ int y =
+ comp.getY() + getStartingPoint(comp.getHeight(),
+ refHeight,
+ Constant.SPACING_FOR_COMPOSITE_OF_REFERENCE,
+ comp.getReferences().size());
+
+ for (String ref : comp.getReferences()) {
+ ReferenceArtifact refer = new ReferenceArtifact();
+ Element polygon = refer.addElement(doc, svgNS, x, y, refHeight);
+ Element text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, ref);
+ svgRoot.appendChild(polygon);
+ svgRoot.appendChild(text);
+
+ y += (refHeight + Constant.SPACING_FOR_COMPOSITE_OF_REFERENCE);
+
+ refer.setName(ref);
+ refer.setContainerName(comp.getName());
+ refs.add(refer);
+
+ }
+
+ }
+
+ //Algorithm to position in center
+ private int getStartingPoint(int compDim, int artifactDim, int gap, int artifactQty) {
+
+ int x = (compDim - artifactQty * artifactDim - (artifactQty - 1) * gap) / 2;
+ return x;
+ }
+
+ private void addCompositeProperties() {
+ int propLen = comp.getPropLength();
+
+ int x =
+ comp.getX() + getStartingPoint(comp.getWidth(), propLen, Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY, comp
+ .getProperties().size());
+ //int x= comp.getX() + Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY;
+ int y = comp.getY() - propLen / 2;
+
+ for (String prop : comp.getProperties()) {
+ PropertyArtifact pro = new PropertyArtifact();
+ Element property = pro.addElement(doc, svgNS, x, y, propLen);
+ Element text = Text.addTextElement(doc, svgNS, x, y - Constant.SPACING_FOR_TEXT, prop);
+
+ svgRoot.appendChild(property);
+ svgRoot.appendChild(text);
+
+ x += (propLen + Constant.SPACING_FOR_COMPOSITE_OF_PROPERTY);
+
+ pro.setName(prop);
+ pro.setContainerName(comp.getName());
+ }
+ }
+
+ private void addComponent(Entity ent) {
+
+ ComponentArtifact comp = new ComponentArtifact();
+ //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.getY() + (ent.getHeight() + Constant.COMPONENT_TEXT_SPACING),
+ ent.getName());
+
+ svgRoot.appendChild(com);
+ svgRoot.appendChild(text);
+
+ comp.setName(ent.getName());
+ }
+
+ private void addComposite() {
+
+ CompositeArtifact composite = new CompositeArtifact();
+
+ Element composi = composite.addElement(doc, svgNS, comp.getX(), comp.getY(), comp.getHeight(), comp.getWidth());
+ Element text = Text.addTextElement(doc, svgNS, comp.getX() + 20, comp.getY() + 20, comp.getName());
+
+ svgRoot.appendChild(composi);
+ svgRoot.appendChild(text);
+
+ composite.setName(comp.getName());
+
+ }
+
+ public void setDiagramHeight(int diagramHeight) {
+ this.diagramHeight = diagramHeight;
+ }
+
+ public int getDiagramHeight() {
+ return diagramHeight;
+ }
+
+ public void setDiagramWidth(int diagramWidth) {
+ this.diagramWidth = diagramWidth;
+ }
+
+ public int getDiagramWidth() {
+ return diagramWidth;
+ }
}