package org.apache.tuscany.sca.impl.layout; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; 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();//keeps track of levels used in lanes private HashMap> connectedEntities = new HashMap>(); public final int totalLength=0, totalHeight=0; 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("component"); if(nl != null && nl.getLength() > 0 ) { elts = new Entity[nl.getLength()]; for(int i = 0 ; i < nl.getLength();i++) { elts[i] = new Entity(); Element nVal = (Element)nl.item(i); //System.out.println(nVal.hasAttribute("name")); elts[i].setComponentName(nVal.getAttribute("name")); setServices(nVal, elts[i]); setReferences(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("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; // } // } // } // } //correctMap(elts); positionEntities(elts); print(elts); return elts; } // private void correctMap(Entity[] elts) { // // for(Entity ent: elts){ // for(Iterator it=ent.getReferenceToServiceMap().values().iterator();it.hasNext();){ // String target = (String)it.next(); // if(target.startsWith("#")){ // for(Entity e: elts){ // if(e.getComponentName().equals(target.substring(1))){ // // } // } // } // } // } // } private void print(Entity[] elts) { for(Entity ent: elts){ System.out.println(ent.getComponentName()+" : "+ent.getLevel()+" : " +ent.getLane()+" : "+ent.getX()+" : "+ent.getY()); } } private void positionEntities(Entity[] ents){ Entity startEnt = null; for(Entity 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.getComponentName()); break; } } // for(Entity ent: ents){ // if(ent != startEnt){ // assignPosition(ent, ents); // } // } if(startEnt != null) assignPositions(ents, startEnt); } private void assignPosition(Entity ent, Entity[] ents) { } private void assignPositions(Entity[] ents, Entity ent){ int i=0; //for(Entity ent: ents){ if(ent.getAdjacentEntities().size()>0){ System.out.println(ent.getComponentName()); for(String name: ent.getAdjacentEntities()){ System.out.println("eee "+name); for(Entity aEnt: ents){ i++; if(name.equalsIgnoreCase(aEnt.getComponentName())){ 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 conns = connectedEntities.get(ent.getComponentName()); System.err.println(conns.size()); if(conns.size()>0){ for(String conn: conns){ System.err.println("conn "+conn +" : "+ent.getComponentName()); for(Entity e: ents){ if(e.getLane() == -1 && e.getComponentName().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); // 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); // } // System.err.println(e.getComponentName()); // assignPositions(ents, e); break; } } } } } } 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("reference"); if(nl != null && nl.getLength() > 0 ) { for(int i = 0 ; i < nl.getLength();i++) { Element elt = (Element)nl.item(i); String target = elt.getAttribute("target"); String ref = elt.getAttribute("name"); if(target.contains("/")){ ent.addToRefToSerMap(ref, target.split("/")[1]); ent.addAnAdjacentEntity(target.split("/")[0]); addToConnectedEntities(ent.getComponentName(), target.split("/")[0]); addToConnectedEntities(target.split("/")[0], ent.getComponentName()); } else if(!target.equals("")){ //adding a #, since this is not the name of the service //but the component which has only one service ent.addToRefToSerMap(ref, "#"+target); ent.addAnAdjacentEntity(target); addToConnectedEntities(ent.getComponentName(), target); addToConnectedEntities(target, ent.getComponentName()); } ent.addAReference(ref); } } } private void addToConnectedEntities(String ent1, String ent2) { System.err.println(ent1+" : "+ent2); ArrayList list; if(connectedEntities.containsKey(ent1)){ list = connectedEntities.get(ent1); } else{ list =new ArrayList(); } list.add(ent2); connectedEntities.put(ent1, list); } private void setServices(Element nVal, Entity ent) { NodeList nl = nVal.getElementsByTagName("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("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")); } } } }