package org.apache.commons.graph.visualize; /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Commons" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Commons", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ import java.io.OutputStream; import org.apache.commons.graph.GraphConstants; import org.apache.commons.graph.Edge; import org.apache.commons.graph.Graph; import org.apache.commons.graph.Sequential; import org.apache.commons.graph.Vertex; /** * Visualizes directed graphs into the * * DaVinci format. It can only be used for directed graphs and does not support * labeled edges very well, unfortunately. They have to be simulated via dummy vertices. * * Traverses graph with the Sequential visitor, since it uses invariants of that algorithm. * * @version $Id: DaVinciVisualizer.java,v 1.3 2002/01/16 20:38:30 jvanzyl Exp $ * @author M. Dahm */ public class DaVinciVisualizer extends GraphVisualizer implements GraphConstants { private Graph graph; private int no_edges, edges; private int no_vertices, vertices; /** * @param out stream to print output to * @param verbose toggle verbosity of output */ public DaVinciVisualizer(OutputStream out, int verbose) { super(out, verbose); } public void discoverGraph(Graph g) { graph = g; no_vertices = g.getNoVertices(); vertices = 0; out.println("["); } public void finishGraph(Graph g) { out.println("]"); out.close(); } public void discoverVertex(Vertex v) { String label = convertString(v.toString(verbose)); //System.out.println("vertex:" + v.getIdent() + ":" + v); println(1, "l(\"" + v.getIdent() + "\","); println(1, "n(\"anything\", ["); println(2, "a(\"OBJECT\", \"" + label + "\"),"); println(2, "a(\"FONTSTYLE\", \"bold\"),"); println(2, "a(\"FONTFAMILY\", \"courier\")],"); println(1, "["); // array of successor nodes no_edges = graph.getNoEdges(v); edges = 0; } public void finishVertex(Vertex v) { String str = (vertices < no_vertices - 1)? "]))," : "]))"; println(1, str); vertices++; } private static int label_counter=0; private final String getEdgeAttribute() { if(graph.isDirected()) return ""; else return "a(\"_DIR\", \"none\""; } public void discoverEdge(Edge e) { int u = graph.getSource(e).getIdent(); int v = graph.getTarget(e).getIdent(); String label = convertString(e.toString(verbose)); if(label.equals("")) { print(2, "l(\"" + u + "->" + v + "\", e(\"\", [" + getEdgeAttribute() + "], r(\"" + v + "\")))"); } else { // Simulate labeled edge with intermediate node String dummy = "label" + label_counter++; // Dummy name for intermediate node print(2, "l(\"" + u + "->" + dummy + "\", e(\"\", [a(\"_DIR\", \"none\")], " + "l(\"" + dummy + "\", n(\"anything\",[a(\"OBJECT\", \"" + label + "\"), a(\"_GO\", \"text\")], [l(\"" + dummy + "->" + v + "\", e(\"\",[" + getEdgeAttribute() + "], r(\"" + v + "\")))]))))"); //System.out.println(graph.getTarget(e).getIdent() + ":" + graph.getTarget(e)); } } public void finishEdge(Edge e) { if(edges < no_edges - 1) out.println(", "); else out.print('\n'); edges++; } /** * Visualize graph g with this Visualizer. * * @param g graph to visualize * @param start node to start at */ public void visualize(Graph g, Vertex start) { new Sequential(this).start(g); } }