package org.apache.tuscany.sca.impl.layout; import java.util.ArrayList; import org.apache.tuscany.sca.impl.artifacts.Component; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class EntityBuilder { private Document dom; private final int initPoint = 100; private final int spaceX = Component.DEFAULT_WIDTH*2; private final int spaceY = Component.DEFAULT_HEIGHT*2; private ArrayList levelCount = new ArrayList(); public EntityBuilder(Document aDom){ dom = aDom; } public Entity[] buildEntities(){ Entity[] elts = null; //get the root element Element docEle = dom.getDocumentElement(); //get a nodelist of elements NodeList nl = docEle.getElementsByTagName("sca:component"); if(nl != null && nl.getLength() > 0 ) { elts = new Entity[nl.getLength()]; for(int i = 0 ; i < nl.getLength();i++) { Element nVal = (Element)nl.item(i); elts[i].setComponentName(nVal.getAttribute("name")); setReferences(nVal, elts[i]); setServices(nVal, elts[i]); setProperties(nVal, elts[i]); elts[i].referenceHeight(); elts[i].serviceHeight(); elts[i].propertyLength(); } } //get a nodelist of elements NodeList nl2 = docEle.getElementsByTagName("sca:wire"); if(nl2 != null && nl2.getLength() > 0 ) { for(int i = 0 ; i < nl2.getLength();i++) { Element nVal = (Element)nl2.item(i); String[] source = splitValues(nVal.getAttribute("source")); String[] target = splitValues(nVal.getAttribute("target")); for(Entity ent: elts){ if(ent.getComponentName().equalsIgnoreCase(source[0])){ ent.addAnAdjacentEntity(target[0]); ent.addToRefToSerMap(source[1], target[1]); break; } } } } positionEntities(elts); return elts; } private void positionEntities(Entity[] ents){ Entity startEnt = null; for(Entity ent: ents){ if(ent.getAdjacentEntities().size() != 0){ setPosition(ent, initPoint, initPoint, 0, 0); levelCount.add(0, 1); startEnt = ent; break; } } if(startEnt != null) assignPositions(ents, startEnt); } private void assignPositions(Entity[] ents, Entity ent){ int i=0; for(String name: ent.getAdjacentEntities()){ for(Entity aEnt: ents){ if(name.equalsIgnoreCase(aEnt.getComponentName())){ int lane = ent.getLane()+1; if(levelCount.get(lane) != null){ 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); } assignPositions(ents, aEnt); break; } } i++; } } private void setPosition(Entity 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 setReferences(Element nVal, Entity ent) { NodeList nl = nVal.getElementsByTagName("sca:reference"); if(nl != null && nl.getLength() > 0 ) { for(int i = 0 ; i < nl.getLength();i++) { Element elt = (Element)nl.item(i); ent.addAReference(elt.getAttribute("name")); } } } private void setServices(Element nVal, Entity ent) { NodeList nl = nVal.getElementsByTagName("sca:service"); if(nl != null && nl.getLength() > 0 ) { for(int i = 0 ; i < nl.getLength();i++) { Element elt = (Element)nl.item(i); ent.addAService(elt.getAttribute("name")); } } } private void setProperties(Element nVal, Entity ent) { NodeList nl = nVal.getElementsByTagName("sca:property"); if(nl != null && nl.getLength() > 0 ) { for(int i = 0 ; i < nl.getLength();i++) { Element elt = (Element)nl.item(i); ent.addAProperty(elt.getAttribute("name")); } } } }