X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fjavainspect%2Fstructure%2FClassGraph.java;fp=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fjavainspect%2Fstructure%2FClassGraph.java;h=180b2c7e7744d4a9eff821cd7a02bb6719b8dc65;hb=5420578cb5e2f66fd0ca780192808be376f9d5b9;hp=0000000000000000000000000000000000000000;hpb=13eb4378a21127f9ebfb226b7f883ec4ca538215;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/javainspect/structure/ClassGraph.java b/src/main/java/eu/svjatoslav/javainspect/structure/ClassGraph.java new file mode 100644 index 0000000..180b2c7 --- /dev/null +++ b/src/main/java/eu/svjatoslav/javainspect/structure/ClassGraph.java @@ -0,0 +1,110 @@ +/* + * JavaInspect - Utility to visualize java software + * Copyright (C) 2013, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + */ + +package eu.svjatoslav.javainspect.structure; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +import eu.svjatoslav.commons.file.CommonPathResolver; + +public class ClassGraph { + + /** + * Maps class fully qualified names to class descriptors. + */ + Map nameToClassMap = new HashMap(); + + public ClassGraph() { + } + + public ClassGraph(final Class clazz) { + addClass(clazz); + } + + public ClassGraph(final Object root) { + addClass(root.getClass()); + } + + public ClassDescriptor addClass(final Class clazz) { + + if (clazz == null) + return null; + + final String className = clazz.getName(); + + if (nameToClassMap.containsKey(className)) + return nameToClassMap.get(className); + + return new ClassDescriptor(clazz, this); + } + + public ClassDescriptor addObject(final Object object) { + return addClass(object.getClass()); + } + + public void generateGraph(final String graphName) { + generateGraph(graphName, false); + } + + public void generateGraph(final String graphName, final boolean keepDotFile) { + + final String desktopPath = CommonPathResolver.getDesktopDirectory() + .getAbsolutePath() + "/"; + + final String dotFilePath = desktopPath + graphName + ".dot"; + final String imageFilePath = desktopPath + graphName + ".png"; + + System.out.println("Dot file path:" + dotFilePath); + + try { + // write DOT file to disk + final PrintWriter out = new PrintWriter(dotFilePath); + out.write(getDot()); + out.close(); + + // execute GraphViz to visualize graph + try { + Runtime.getRuntime() + .exec(new String[] { "dot", "-Tpng", dotFilePath, "-o", + imageFilePath }).waitFor(); + } catch (final InterruptedException e) { + } finally { + } + + if (!keepDotFile) { + // delete dot file + final File dotFile = new File(dotFilePath); + dotFile.delete(); + } + } catch (final IOException e) { + System.err.println(e); + } + } + + private String getDot() { + final StringBuffer result = new StringBuffer(); + + result.append("digraph Java {\n"); + result.append("graph [rankdir=LR, overlap = false, concentrate=true];\n"); + + for (final Map.Entry entry : nameToClassMap + .entrySet()) + result.append(entry.getValue().getDot()); + + result.append("}\n"); + + final String resultStr = result.toString(); + return resultStr; + } + +}