- public static void render(final String graphName, final Class... classes) {
- final ClassGraph classGraph = new ClassGraph();
-
- for (final Class clazz : classes)
- classGraph.addClass(clazz);
-
- classGraph.generateGraph(graphName);
- }
-
- /**
- * Maps class fully qualified names to class descriptors.
- */
- Map<String, ClassDescriptor> nameToClassMap = new HashMap<String, ClassDescriptor>();
-
- public Filter filter = new Filter();
-
- public ClassGraph() {
- }
-
- public ClassGraph(final Class<? extends Object> clazz) {
- addClass(clazz);
- }
-
- public ClassGraph(final Object root) {
- addClass(root.getClass());
- }
-
- public ClassDescriptor addClass(final Class<? extends Object> 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 addProject(final String path) {
- final ProjectScanner projectScanner = new ProjectScanner(new File(path));
- for (final Clazz clazz : projectScanner.getAllClasses())
- try {
- System.out.println("Class full name: " + clazz.getFullName());
- final Class c = this.getClass().forName(clazz.getFullName());
- addClass(c);
- } catch (final Exception exception) {
- System.out.println("cannot add class: "
- + exception.getMessage());
- }
- }
+ /**
+ * Maps class fully qualified names to class descriptors.
+ */
+ private final Map<String, ClassDescriptor> fullyQualifiedNameToClassMap = new HashMap<String, ClassDescriptor>();
+
+ private final List<String> blacklistClassPatterns = new ArrayList<String>();
+
+ private final List<String> whitelistClassPatterns = new ArrayList<String>();
+
+ private String targetDirectoryPath = CommonPathResolver.getDesktopDirectory()
+ .getAbsolutePath() + separator;
+
+ private boolean keepDotFile;
+
+ TargetImageType targetImageType = TargetImageType.SVG;
+
+ public ClassGraph() {
+ }
+
+ /**
+ * @param objects objects that shall be added to graph
+ * @return this {@link ClassGraph}
+ */
+ public ClassGraph add(final Object... objects) {
+
+ if (objects != null)
+ for (final Object object : objects)
+ addObject(object);
+
+ return this;
+ }
+
+ private void addObject(final Object object) {
+ if (object instanceof Class)
+ getOrCreateClassDescriptor((Class) object);
+ else
+ getOrCreateClassDescriptor(object.getClass());
+ }
+
+ /**
+ * @param path path to recursively scan for java source code could be
+ * relative to current project or absolute
+ */
+ public void addProject(final String path) {
+ final ProjectScanner projectScanner = new ProjectScanner(new File(path));
+ for (final Clazz clazz : projectScanner.getAllClasses())
+ try {
+ System.out.println("Class full name: " + clazz.getFullName());
+ final Class c = this.getClass().forName(clazz.getFullName());
+ addObject(c);
+ } catch (final Exception exception) {
+ System.out.println("cannot add class: "
+ + exception.getMessage());
+ }
+ }
+
+ public void blacklistClassPattern(final String pattern) {
+ blacklistClassPatterns.add(pattern);
+ }
+
+ public void setTargetImageType(TargetImageType targetImageType) {
+ this.targetImageType = targetImageType;
+ }
+
+ /**
+ * @param resultFileName file name for the generated graph. File extension will be
+ * added automatically. Existing file with the same name will be
+ * overwritten.
+ */
+
+ public void generateGraph(final String resultFileName) {
+
+ final String dotFilePath = targetDirectoryPath + resultFileName + ".dot";
+ final String imageFilePath = targetDirectoryPath + resultFileName + "." + targetImageType.fileExtension;
+
+ try {
+ // write DOT file to disk
+ final PrintWriter out = new PrintWriter(dotFilePath, UTF_8);
+ out.write(getDot());
+ out.close();
+
+ // execute GraphViz to visualize graph
+ try {
+ Runtime.getRuntime()
+ .exec(new String[]{"dot", "-T" + targetImageType.fileExtension, dotFilePath, "-o",
+ imageFilePath}).waitFor();
+ } catch (final InterruptedException ignored) {
+ }