Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
     Copyright (c) 2012 Albert Z├╝ndorf
  
     Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
     and associated documentation files (the "Software"), to deal in the Software without restriction, 
     including without limitation the rights to use, copy, modify, merge, publish, distribute, 
     sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
     furnished to do so, subject to the following conditions:
  
    The above copyright notice and this permission notice shall be included in all copies or 
    substantial portions of the Software.
 
    The Software shall be used for Good, not Evil.
 
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
 package org.sdmlib.doc.GraphVizAdapter;
 
 import java.io.File;
 import java.util.Set;
 
 
 
 public class GraphViz implements GuiAdapter {
    public static final String NAME="GraphViz";
    private String rootDir = "src";
 	private JsonIdMap lastIdMap = null;
 	private static LinkedHashMap<StringStringiconMap;
 
    public GraphViz withRootDir(String rootDir) {
 		this. = rootDir;
 		return this;
 	}
 	
 	public String getRootDir(){
 		return ;
 	}
 
 
 	public void setLastIdMap(JsonIdMap lastIdMap) {
 		this. = lastIdMap;
 	}
 
 	public void dumpImage(String imgNameObject root) {
 		JsonArray jsonArray = .toJsonArray(root);
 
 		String imgLink = toImg(imgNamejsonArray);
 
 	}
 
 	public void dumpImage(String imgNameJsonIdMap newIdMapObject root) {
 		 = newIdMap;
 
 		JsonArray jsonArray = newIdMap.toJsonArray(root);
 
 		String imgLink = toImg(imgNamejsonArray);
 
 	}
 
 	public String toImg(String imgName,
 			JsonArray objects) {
 		return toImg(imgNameobjectsfalsenull);
 	}
 
 	public String toImg(String imgName,
 			JsonArray objectsboolean omitRoot,
 			String[] aggregationRoles) {
 		String link = "<embed type=\"image/svg+xml\" src='<imagename>'>\n";
 		link = link.replaceFirst("<imagename>"imgName + ".svg");
 
		// generate dot file
		String fileText = "graph ObjectDiagram {\n"
"   node [shape = none, fontsize = 10, fontname = \"Arial\"];\n"
"   edge [fontsize = 10, fontname = \"Arial\"];\n"
"   compound=true;\n" + "\n" + "<nodes>\n" + "<edges>"
"}\n";
		StringBuilder nodeBuilder = new StringBuilder();
		StringBuilder edgeBuilder = new StringBuilder();
		fillNodeAndEdgeBuilders(imgNameobjectsnodeBuilderedgeBuilder,
				omitRootaggregationRoles);
		fileText = fileText.replaceFirst("<nodes>",
				Matcher.quoteReplacement(nodeBuilder.toString()));
		fileText = fileText.replaceFirst("<edges>",
				Matcher.quoteReplacement(edgeBuilder.toString()));
		draw(imgNamefileText);
		// generate link
		return link;
	}
	public void fillNodeAndEdgeBuilders(String imgName,
			JsonArray objectsStringBuilder nodeBuilder,
			StringBuilder edgeBuilderboolean omitRoot,
			String... aggregationRoles) {
		String omittedId = "";
		// collect all edges
		// collect all jsonIds
		LinkedHashSet<StringknownIds = new LinkedHashSet<String>();
		for (int i = 0; i < objects.size(); i++) {
			JsonObject jsonObject = objects.getJSONObject(i);
			String jsonId = jsonObject.getString(.);
			if (omitRoot && i == 0) {
				omittedId = jsonId;
else {
				knownIds.add(jsonId);
				aggregationMap.put(jsonIdnew LinkedHashSet<String>());
				jsonObjectMap.put(jsonIdjsonObject);
			}
		}
		LinkedHashSet<StringaggregationRolesSet = new LinkedHashSet<String>();
		if (aggregationRoles != null && aggregationRoles.length > 0) {
			aggregationRolesSet.addAll(Arrays.asList(aggregationRoles));
			// all nodes
			for (String id : (LinkedHashSet<String>) knownIds.clone()) {
				// all properties
				JsonObject properties = jsonObjectMap.get(id);
				JsonObject props = (JsonObjectproperties
				if (props == null) {
					continue;
				}
				for (Iterator<Stringiter = props.keyIterator(); iter.hasNext();) {
					String nextProp = iter.next();
					if (aggregationRolesSet.contains(nextProp)) {
						// found contained elements, restructure
						Object propValue = props.get(nextProp);
						if (propValue instanceof JsonArray) {
							JsonArray propArray = (JsonArraypropValue;
							for (int i = 0; i < propArray.size(); i++) {
								JsonObject containedId = propArray
								String subId = containedId
								// add to parent and remove from top level ids
								aggregationMap.get(id).add(subId);
								knownIds.remove(subId);
							}
else {
							String subId = ((JsonObjectpropValue)
							// add to parent and remove from top level ids
							aggregationMap.get(id).add(subId);
							knownIds.remove(subId);
						}
					}
				}
			}
		}
		// list of nodes
		listOfNodes(nodeBuilderomittedIdedgeMapknownIdsaggregationMap,
				jsonObjectMapimgName);
		// now generate edges from edgeMap
		for (String keyPair : edgeMap.keySet()) {
			String[] split = keyPair.split(":");
			EdgeLabels edgeLabels = edgeMap.get(keyPair);
			if (aggregationRolesSet.contains(edgeLabels.headlabel)
					|| aggregationRolesSet.contains(edgeLabels.taillabel)) {
				continue;
			}
			String edgeLine = "<srcId> -- <tgtId> [headlabel = \"<headlabel>\" taillabel = \"<taillabel>\"];\n";
			edgeLine = edgeLine.replaceFirst("<srcId>",
					Matcher.quoteReplacement(split[0]));
			edgeLine = edgeLine.replaceFirst("<tgtId>",
					Matcher.quoteReplacement(split[1]));
			edgeLine = edgeLine.replaceFirst("<headlabel>",
					Matcher.quoteReplacement(edgeLabels.headlabel));
			String taillabel = edgeLabels.taillabel;
			if (taillabel.startsWith("_")) {
				taillabel = taillabel.substring(1);
			}
			edgeLine = edgeLine.replaceFirst("<taillabel>",
					Matcher.quoteReplacement(taillabel));
			edgeBuilder.append(edgeLine);
		}
	}
	private void listOfNodes(StringBuilder nodeBuilder,
			String omittedIdLinkedHashMap<StringEdgeLabelsedgeMap,
			Set<StringknownIds,
			LinkedHashMap<StringJsonObjectjsonObjectMapString imgName) {
		for (String topId : knownIds) {
			JsonObject jsonObject = jsonObjectMap.get(topId);
			String nodeLine = "<id> [label=<<table border='0' cellborder='1' cellspacing='0'> <optionalImage><tr> <td href=\"<classRef>\"> <u><id> :<classname></u></td></tr></table>>];\n";
			boolean isCluster = false;
			if (aggregationMap.get(topId).size() > 0) {
				isCluster = true;
				// has kids, render as cluster
				nodeLine = "subgraph cluster_<id> { \n"
"   <id> [label=<<table border='0' cellborder='0' cellspacing='0'> <optionalImage><tr> <td> <u><id> :<classname></u></td></tr></table>>];\n"
"   \n";
			}
			String imageName = jsonObject.getString(.) + ".svg";
			File imageFile = new File("doc/" + imageName);
			if (imageFile.exists()) {
				nodeLine = nodeLine.replaceFirst("<optionalImage>",
						"<tr><td border='0'><IMG src=\"" + imageName
"\" /></td></tr>");
else if ( != null && .get(topId) != null) {
				nodeLine = nodeLine.replaceFirst("<optionalImage>",
						"<tr><td border='0'><IMG src=\"" + .get(topId)
"\" /></td></tr>");
else {
				nodeLine = nodeLine.replaceFirst("<optionalImage>""");
			}
			String jsonId = lastPartStartLow(jsonObject.getString(.));
			nodeLine = nodeLine.replaceAll("<id>",
					Matcher.quoteReplacement(jsonId));
			String className = jsonObject.getString(.);
			String classFileName = className;
			if (classFileName.indexOf('$') >= 0) {
				// inner class, cut down to real class
				classFileName = classFileName.substring(0,
						classFileName.indexOf('$'));
			}
			classFileName = classFileName.replaceAll("\\.""/") + ".java";
			String localFileName = "./" +  + "/" + classFileName;
			if (new File(localFileName).exists()) {
				classFileName = "../" +  + "/" + classFileName;
else {
				classFileName = "../../SDMLib/src/" + classFileName;
			}
			nodeLine = nodeLine.replaceAll("<classRef>",
					Matcher.quoteReplacement(classFileName));
			className = lastPart(className);
			nodeLine = nodeLine.replaceAll("<classname>",
					Matcher.quoteReplacement(className));
			// go through attributes
			if (jsonObject.has(.)) {
				jsonObject = jsonObject.getJsonObject(.);
else {
				jsonObject = new JsonObject();
			}
			String attrText = "<tr><td><table border='0' cellborder='0' cellspacing='0'></table></td></tr>";
			boolean addAttrText = false;
			for (Iterator<Stringiter = jsonObject.keyIterator(); iter.hasNext();) {
				String key = iter.next();
				if (!..equals(key) && !..equals(key)) {
					Object value = jsonObject.get(key);
					if (value instanceof Number || value instanceof Enum) {
						// dump without quotes
						addAttrText = true;
						// add attribute line
						String attrLine = "<tr><td align='left'><key> = <value></td></tr>";
						attrLine = attrLine.replaceFirst("<key>",
								Matcher.quoteReplacement(key));
						attrLine = attrLine.replaceFirst("<value>",
								Matcher.quoteReplacement(value.toString()));
						attrText = attrText
										"</table>",
										Matcher.quoteReplacement(attrLine
"</table>"));
else if (value instanceof JsonObject) {
						JsonObject tgtJsonObject = (JsonObjectvalue;
						String tgtId = tgtJsonObject.getString(.);
						if (tgtJsonObject.get(.) != null) {
							addAttrText = true;
							// add hyper ref line
							String attrLine = "<tr><td align='left' href=\"<key>\">\"<value>\"</td></tr>";
							attrLine = attrLine.replaceFirst(
									"<key>",
									Matcher.quoteReplacement(imgName + "/"
tgtId + ".svg"));
							attrLine = attrLine.replaceFirst(
									"<value>",
									Matcher.quoteReplacement(imgName + "/"
tgtId + ".svg"));
							attrText = attrText.replaceFirst(
									"</table>",
									Matcher.quoteReplacement(attrLine
"</table>"));
else if (!omittedId.equals(tgtId)) {
							tgtId = lastPartStartLow(tgtId);
							addToEdges(edgeMapjsonIdtgtIdkey);
						}
else if (value instanceof JsonArray) {
						// array of links
						JsonArray jsonArray = (JsonArrayvalue;
						for (int j = 0; j < jsonArray.size(); j++) {
							JsonObject tgtJsonObject = jsonArray
							String tgtId = tgtJsonObject
							if (!omittedId.equals(tgtId)) {
								tgtId = lastPartStartLow(tgtId);
								addToEdges(edgeMapjsonIdtgtIdkey);
							}
						}
else {
						addAttrText = true;
						// add attribute line
						String attrLine = "<tr><td align='left'><key> = \"<value>\"</td></tr>";
						attrLine = attrLine.replaceFirst("<key>",
								Matcher.quoteReplacement(key));
						String encode = new HTMLEntities().encode(value
						int pos = attrLine.indexOf("<value>");
						attrLine = attrLine.substring(0, pos) + encode
attrLine.substring(pos + "<value>".length());
						attrText = attrText
										"</table>",
										Matcher.quoteReplacement(attrLine
"</table>"));
					}
				}
			}
			if (addAttrText) {
				nodeLine = nodeLine.replaceFirst("</table>",
						Matcher.quoteReplacement(attrText + "</table>"));
			}
			nodeBuilder.append(nodeLine);
			// do contained elements
			if (isCluster) {
				// call recursive
				listOfNodes(nodeBuilderomittedIdedgeMap,
						aggregationMap.get(topId), aggregationMap,
						jsonObjectMapimgName);
				nodeBuilder.append("}\n");
			}
		}
	}
	private static void addToEdges(LinkedHashMap<StringEdgeLabelsedgeMap,
			String srcIdString tgtIdString label) {
		// is this edge already known?
		EdgeLabels fwdEdgeLabels = edgeMap.get(srcId + ":" + tgtId);
		if (fwdEdgeLabels != null) {
			// add label to the headlabel
			fwdEdgeLabels.headlabel += "_" + label;
else {
			EdgeLabels bwdEdgeLabels = edgeMap.get(tgtId + ":" + srcId);
			if (bwdEdgeLabels != null) {
				// add label to the taillabel
				bwdEdgeLabels.taillabel += "_" + label;
else {
				// unknown edge, create it
				fwdEdgeLabels = new EdgeLabels();
				fwdEdgeLabels.headlabel = label;
				edgeMap.put(srcId + ":" + tgtIdfwdEdgeLabels);
			}
		}
	}
	static class EdgeLabels {
	}
	private static String lastPartStartLow(String dottedName) {
		return StrUtil.downFirstChar(lastPart(dottedName));
	}
	private static String lastPart(String dottedName) {
		int dotPos = dottedName.lastIndexOf('.');
		dottedName = dottedName.substring(dotPos + 1);
		return dottedName;
	}
		this. = iconMap;
		return this;
	}
		return ;
	}
	private int objNo;
   private GuiFileDrawer drawer;
	public String addGenericObjectDiag(String diagramNameGenericGraph graph,
			GenericObjectSet hiddenObjects) {
		 = 0;
		// name all objects
		// String imgLink = JsonToImg.get().toImg(this.getName() +
		// (this.steps.size()+1), jsonArray);
		String link = "<embed type=\"image/svg+xml\" src='<imagename>'>\n";
		link = link.replaceFirst("<imagename>"diagramName + ".svg");
		// generate dot file
		String fileText = "graph ObjectDiagram {\n"
"   node [shape = none, fontsize = 10];\n"
"   edge [fontsize = 10];\n\n" + "<nodes>\n" + "<edges>"
"}\n";
		// list of nodes
		StringBuilder nodeBuilder = new StringBuilder();
		for (GenericObject currentObject : graph.getObjects()) {
			if (hiddenObjects.contains(currentObject)) {
				continue;
			}
			StringBuilder nodeLine = new StringBuilder(
					"<id> [label=<<table border='0' cellborder='borderSize' cellspacing='0'> iconrow<tr> <td> <u><id> :<classname></u></td></tr>attrText</table>>];\n");
			String borderSize = "1";
			allObjects.put(currentObjectfindNameFor(currentObject));
			String iconRow = "";
			if (currentObject.getIcon() != null) {
				iconRow = "<tr><td border='0'><img src=\""
currentObject.getIcon() + "\"/></td></tr>";
				borderSize = "0";
			}
			String type = "_";
			if (currentObject.getType() != null) {
				type = currentObject.getType();
			}
			// go through attributes
			String attrText = "<tr><td border='borderSize'><table border='0' cellborder='0' cellspacing='0'></table></td></tr>";
			attrText = attrText.replaceFirst("borderSize"borderSize);
			for (GenericAttribute attr : currentObject.getAttrs()) {
				String attrLine = "<tr><td><key> = \"<value>\"</td></tr>";
				attrLine = attrLine.replaceFirst("<key>"attr.getName());
				attrLine = attrLine.replaceFirst("<value>"attr.getValue());
				attrLine = attrLine.replaceFirst("borderSize"borderSize);
				attrText = attrText.replaceFirst("</table>"attrLine
"</table>");
			}
			if (currentObject.getAttrs().isEmpty()) {
				attrText = "";
			}
			CGUtil.replaceAll(nodeLine"iconrow"iconRow"<id>",
					allObjects.get(currentObject), "<classname>"type,
					"attrText"attrText"borderSize"borderSize);
			nodeBuilder.append(nodeLine.toString());
		}
		fileText = fileText.replaceFirst("<nodes>"nodeBuilder.toString());
		// now generate edges from edgeMap
		StringBuilder edgeBuilder = new StringBuilder();
		for (GenericLink currentLink : graph.getLinks()) {
			if (hiddenObjects.contains(currentLink.getSrc())
					|| hiddenObjects.contains(currentLink.getTgt())) {
				continue;
			}
			String edgeLine = "<srcId> -- <tgtId> [headlabel = \"<headlabel>\" taillabel = \"<taillabel>\"];\n";
			edgeLine = edgeLine.replaceFirst("<srcId>",
					allObjects.get(currentLink.getSrc()));
			edgeLine = edgeLine.replaceFirst("<tgtId>",
					allObjects.get(currentLink.getTgt()));
			String headLabel = currentLink.getTgtLabel();
			if (headLabel == null) {
				headLabel = " ";
			}
			edgeLine = edgeLine.replaceFirst("<headlabel>",
					currentLink.getTgtLabel());
			String taillabel = currentLink.getSrcLabel();
			if (taillabel == null) {
				taillabel = " ";
			}
			edgeLine = edgeLine.replaceFirst("<taillabel>"taillabel);
			edgeBuilder.append(edgeLine);
		}
		fileText = fileText.replaceFirst("<edges>"edgeBuilder.toString());
	    draw(diagramNamefileText);
		return link;
	}
	private String findNameFor(GenericObject currentObject) {
		if (currentObject.getName() != null) {
			return currentObject.getName();
		}
		return "_" + ;
	}
	public String dumpSwimlanes(String nameLogEntrySet entries) {
		StringBuilder text = new StringBuilder(" digraph TaskFlowDiagram {\n"
"    \n" + "swimlanes\n" + "    \n" + "links\n" + "}");
		StringBuilder swimlanesText = dumpSwimlanes(entries);
		StringBuilder linksText = dumpLinks(entries);
		CGUtil.replaceAll(text"swimlanes"swimlanesText.toString(), "links",
				linksText.toString());
		// StoryboardManager.printFile(new File("doc/Logger.dot"),
		// text.toString());
		draw(nametext.toString());
		return name;
	}
		StringBuilder swimlanesText = new StringBuilder();
		StringList nodeNames = entries.getNodeName();
		for (String nodeName : nodeNames) {
			// add one lane
			StringBuilder laneText = new StringBuilder(
					"    subgraph clusterLaneName {\n"
"    	rankdir=\"LR\";\n" + "    	style=filled;\n"
"		color=lightgrey;\n" + "innerTasks\n"
"    	label = \"LaneName\";\n" + "    }\n"
"    \n");
			StringBuilder innerTasksText = dumpInnerTasks(nodeNameentries);
			CGUtil.replaceAll(laneText"LaneName"nodeName"innerTasks",
					innerTasksText.toString());
			swimlanesText.append(laneText.toString());
		}
		return swimlanesText;
	}
	private StringBuilder dumpInnerTasks(String nodeNameLogEntrySet entries) {
		StringBuilder innerTasksText = new StringBuilder();
		LinkedHashSet<StringtaskNames = new LinkedHashSet<String>();
		for (LogEntry entry : entries) {
			if (nodeName.equals(entry.getNodeName())) {
				taskNames.add(entry.getTaskName());
			}
		}
		for (String taskName : taskNames) {
			innerTasksText.append("        " + nodeName + "_" + taskName
"[label=\"" + taskName + "\"];\n");
		}
		return innerTasksText;
	}
	private StringBuilder dumpLinks(LogEntrySet entries) {
		StringBuilder linksText = new StringBuilder();
		for (LogEntry entry : entries) {
		   LogEntry previousEntry = entry.getParent();
			if (previousEntry != null) {
				linksText.append("    " + previousEntry.getNodeName() + "_"
previousEntry.getTaskName() + " -> "
entry.getNodeName() + "_" + entry.getTaskName()
"; \n");
			}
		}
		return linksText;
	}
	public String dumpClassDiagram(String diagName,
			ClassModel model) {
				diagNamemodel);
		// write dot file
		draw(diagNamedotFileText.toString());
      String text = "<embed type=\"image/svg+xml\" src='" + diagName + ".svg'>";
      return text;
	}
	public String dumpDiagram(String diagramNameString fileText) {
		draw(diagramNamefileText);
		return diagramName;
	}
   public String getName()
   {
      return ;
   }
   
   private boolean draw(String nameString text){
      if(this.==null){
         ..println("No GraphViz-Drawer");
         return false;
      }
     return this..drawImg(nametext);
   }
   public GraphViz withDrawer(GuiFileDrawer drawer)
   {
      this.drawer;
      return this;
   }
New to GrepCode? Check out our FAQ X