diff options
Diffstat (limited to 'collaboration/GSoC-2011-Nirmal/CompositeDiagramGeneratorUsingBatik/src/main/java/org/apache/tuscany/sca/impl/layout')
5 files changed, 1069 insertions, 162 deletions
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); + } + +} |