X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2Fstructure%2FClassGraph.java;h=f3afd808371cb05b025475fc14847edb13e74fdc;hb=c508bf97e017675b49df989b7f5a64cbd31d9aa3;hp=a2ce8a2110149b959e7bf2533fff8e2613e7d7c1;hpb=9d9b65fb1909e12606e76ed0625706e446f588fb;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java index a2ce8a2..f3afd80 100755 --- a/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java +++ b/src/main/java/eu/svjatoslav/inspector/java/structure/ClassGraph.java @@ -12,72 +12,53 @@ package eu.svjatoslav.inspector.java.structure; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import eu.svjatoslav.commons.file.CommonPathResolver; +import eu.svjatoslav.commons.string.WildCardMatcher; import eu.svjatoslav.inspector.java.methods.Clazz; import eu.svjatoslav.inspector.java.methods.ProjectScanner; public class ClassGraph { - public static void render(final String graphName, final Class... classes) { - final ClassGraph classGraph = new ClassGraph(classes); - - classGraph.generateGraph(graphName); - } - /** * Maps class fully qualified names to class descriptors. */ private final Map fullyQualifiedNameToClassMap = new HashMap(); - private Filter filter = new Filter(); + private final List blacklistClassPatterns = new ArrayList(); - public ClassGraph() { - } + private final List whitelistClassPatterns = new ArrayList(); - /** - * @param classes - * classes that shall be added to graph - */ - public ClassGraph(final Class... classes) { - for (final Class clazz : classes) - addClass(clazz); + private String targetDirectory = CommonPathResolver.getDesktopDirectory() + .getAbsolutePath() + "/"; + + private boolean keepDotFile; + + public ClassGraph() { } /** * @param objects * objects that shall be added to graph */ - public ClassGraph(final Object... objects) { - for (final Object object : objects) - addClass(object.getClass()); - } - - /** - * @param clazz - * class that shall be added to graph - */ - public ClassDescriptor addClass(final Class clazz) { - - if (clazz == null) - return null; - - final String className = clazz.getName(); + public ClassGraph add(final Object... objects) { - if (fullyQualifiedNameToClassMap.containsKey(className)) - return fullyQualifiedNameToClassMap.get(className); + if (objects != null) + for (final Object object : objects) + addObject(object); - return new ClassDescriptor(clazz, this); + return this; } - /** - * @param object - * object that shall be added to graph - */ - public ClassDescriptor addObject(final Object object) { - return addClass(object.getClass()); + private void addObject(final Object object) { + if (object instanceof Class) + getOrCreateClassDescriptor((Class) object); + else + getOrCreateClassDescriptor(object.getClass()); } /** @@ -91,40 +72,15 @@ public class ClassGraph { try { System.out.println("Class full name: " + clazz.getFullName()); final Class c = this.getClass().forName(clazz.getFullName()); - addClass(c); + addObject(c); } catch (final Exception exception) { System.out.println("cannot add class: " + exception.getMessage()); } } - /** - * @param resultFileName - * file name for the generated graph. Existing file with the same - * name will be overwritten. - */ - public void generateGraph(final String resultFileName) { - generateGraph(resultFileName, false); - } - - /** - * @param resultFileName - * file name for the generated graph. File extension will be - * added automatically. Existing file with the same name will be - * overwritten. - * - * @param keepDotFile - * if set to true then intermediary GraphViz DOT - * file will be kept. - */ - - public void generateGraph(final String resultFileName, - final boolean keepDotFile) { - - final String desktopPath = CommonPathResolver.getDesktopDirectory() - .getAbsolutePath() + "/"; - - generateGraph(desktopPath, resultFileName, keepDotFile); + public void blacklistClassPattern(final String pattern) { + blacklistClassPatterns.add(pattern); } /** @@ -141,11 +97,7 @@ public class ClassGraph { * file will be kept. */ - public void generateGraph(String targetDirectory, - final String resultFileName, final boolean keepDotFile) { - - if (!targetDirectory.endsWith("/")) - targetDirectory += "/"; + public void generateGraph(final String resultFileName) { final String dotFilePath = targetDirectory + resultFileName + ".dot"; final String imageFilePath = targetDirectory + resultFileName + ".png"; @@ -161,16 +113,15 @@ public class ClassGraph { // execute GraphViz to visualize graph try { Runtime.getRuntime() - .exec(new String[] { "dot", "-Tpng", dotFilePath, "-o", - imageFilePath }).waitFor(); + .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(); + new File(dotFilePath).delete(); } } catch (final IOException e) { System.err.println(e); @@ -194,8 +145,29 @@ public class ClassGraph { return resultStr; } - public Filter getFilter() { - return filter; + /** + * @param clazz + * class that shall be added to graph + */ + protected ClassDescriptor getOrCreateClassDescriptor(final Class clazz) { + + if (clazz == null) + return null; + + final String classFullyQualifiedName = clazz.getName(); + + // reuse existing instance if possible + if (fullyQualifiedNameToClassMap.containsKey(classFullyQualifiedName)) + return fullyQualifiedNameToClassMap.get(classFullyQualifiedName); + + // create new class descriptor + final ClassDescriptor newClassDescriptor = new ClassDescriptor(this); + fullyQualifiedNameToClassMap.put(classFullyQualifiedName, + newClassDescriptor); + + newClassDescriptor.analyzeClass(clazz); + + return newClassDescriptor; } /** @@ -209,14 +181,40 @@ public class ClassGraph { } - public void registerClass(final String classFullyQualifiedName, - final ClassDescriptor classDescriptor) { - fullyQualifiedNameToClassMap.put(classFullyQualifiedName, - classDescriptor); + protected boolean isClassShown(final String className) { + for (final String pattern : blacklistClassPatterns) + if (WildCardMatcher.match(className, pattern)) + return false; + + if (!whitelistClassPatterns.isEmpty()) { + for (final String pattern : whitelistClassPatterns) + if (WildCardMatcher.match(className, pattern)) + return true; + return false; + } + + return true; } - public void setFilter(final Filter filter) { - this.filter = filter; + public ClassGraph setKeepDotFile(final boolean keepDotFile) { + this.keepDotFile = keepDotFile; + + return this; + } + + public ClassGraph setTargetDirectory(String directoryPath) { + if (!directoryPath.endsWith("/")) + directoryPath += "/"; + + targetDirectory = directoryPath; + + return this; + } + + public ClassGraph whitelistClassPattern(final String pattern) { + whitelistClassPatterns.add(pattern); + + return this; } }