Removed half-baked java source code parser.
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / structure / ClassGraph.java
index 1488b1c..65b8d4d 100755 (executable)
@@ -1,6 +1,6 @@
 /*
  * JavaInspect - Utility to visualize java software
- * Copyright (C) 2013-2015, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ * Copyright (C) 2013-2020, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 3 of the GNU Lesser General Public License
@@ -9,10 +9,7 @@
 
 package eu.svjatoslav.inspector.java.structure;
 
-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;
+import eu.svjatoslav.commons.string.GlobMatcher;
 
 import java.io.File;
 import java.io.IOException;
@@ -22,24 +19,27 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static eu.svjatoslav.inspector.java.methods.JavaFile.UTF_8;
+import static java.io.File.separator;
+import static java.lang.System.getProperty;
 
 public class ClassGraph {
 
     /**
      * Maps class fully qualified names to class descriptors.
      */
-    private final Map<String, ClassDescriptor> fullyQualifiedNameToClassMap = new HashMap<String, ClassDescriptor>();
+    private final Map<String, ClassDescriptor> fullyQualifiedNameToClassMap = new HashMap<>();
 
-    private final List<String> blacklistClassPatterns = new ArrayList<String>();
-
-    private final List<String> whitelistClassPatterns = new ArrayList<String>();
-
-    private String targetDirectory = CommonPathResolver.getDesktopDirectory()
-            .getAbsolutePath() + "/";
+    private final List<String> blacklistClassGlobs = new ArrayList<>();
 
+    private final List<String> whitelistClassGlobs = new ArrayList<>();
+    TargetImageType targetImageType = TargetImageType.SVG;
     private boolean keepDotFile;
 
+    /**
+     * Default to current directory
+     */
+    private File targetDirectory = new File(getProperty("user.dir") + separator);
+
     public ClassGraph() {
     }
 
@@ -63,25 +63,12 @@ public class ClassGraph {
             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 blacklistClassGlob(final String glob) {
+        blacklistClassGlobs.add(glob);
     }
 
-    public void blacklistClassPattern(final String pattern) {
-        blacklistClassPatterns.add(pattern);
+    public void setTargetImageType(TargetImageType targetImageType) {
+        this.targetImageType = targetImageType;
     }
 
     /**
@@ -92,36 +79,39 @@ public class ClassGraph {
 
     public void generateGraph(final String resultFileName) {
 
-        final String dotFilePath = targetDirectory + resultFileName + ".dot";
-        final String imageFilePath = targetDirectory + resultFileName + ".png";
-
-        System.out.println("Dot file path:" + dotFilePath);
+        final File dotFile = new File(targetDirectory, resultFileName + ".dot");
+        final File imageFile = new File(targetDirectory, resultFileName + "." + targetImageType.fileExtension);
 
         try {
             // write DOT file to disk
-            final PrintWriter out = new PrintWriter(dotFilePath, UTF_8);
+            final PrintWriter out = new PrintWriter(dotFile, "UTF-8");
             out.write(getDot());
             out.close();
 
             // execute GraphViz to visualize graph
             try {
                 Runtime.getRuntime()
-                        .exec(new String[]{"dot", "-Tpng", dotFilePath, "-o",
-                                imageFilePath}).waitFor();
+                        .exec(new String[]{"dot",
+                                "-T" + targetImageType.fileExtension,
+                                dotFile.getAbsolutePath(),
+                                "-o",
+                                imageFile.getAbsolutePath()}).waitFor();
             } catch (final InterruptedException ignored) {
             }
 
             if (!keepDotFile)
                 // delete dot file
-                if (!new File(dotFilePath).delete()) throw new RuntimeException("Cannot delete file: " + dotFilePath);
+                if (!dotFile.delete())
+                    throw new RuntimeException("Cannot delete file: " + dotFile.getAbsolutePath());
+
         } catch (final IOException e) {
-            System.err.println(e);
+            throw new RuntimeException("Unable to generate graph: " + e.getMessage(), e);
         }
 
     }
 
     private String getDot() {
-        final StringBuffer result = new StringBuffer();
+        final StringBuilder result = new StringBuilder();
 
         result.append("digraph Java {\n");
         result.append("graph [rankdir=LR, overlap = false, concentrate=true];\n");
@@ -132,8 +122,7 @@ public class ClassGraph {
 
         result.append("}\n");
 
-        final String resultStr = result.toString();
-        return resultStr;
+        return result.toString();
     }
 
     /**
@@ -176,13 +165,13 @@ public class ClassGraph {
     }
 
     protected boolean isClassShown(final String className) {
-        for (final String pattern : blacklistClassPatterns)
-            if (WildCardMatcher.match(className, pattern))
+        for (final String pattern : blacklistClassGlobs)
+            if (GlobMatcher.match(className, pattern))
                 return false;
 
-        if (!whitelistClassPatterns.isEmpty()) {
-            for (final String pattern : whitelistClassPatterns)
-                if (WildCardMatcher.match(className, pattern))
+        if (!whitelistClassGlobs.isEmpty()) {
+            for (final String pattern : whitelistClassGlobs)
+                if (GlobMatcher.match(className, pattern))
                     return true;
             return false;
         }
@@ -196,18 +185,13 @@ public class ClassGraph {
         return this;
     }
 
-    public ClassGraph setTargetDirectory(String directoryPath) {
-        if (!directoryPath.endsWith("/"))
-            directoryPath += "/";
-
-        targetDirectory = directoryPath;
-
+    public ClassGraph setTargetDirectory(File targetDirectory) {
+        this.targetDirectory = targetDirectory;
         return this;
     }
 
-    public ClassGraph whitelistClassPattern(final String pattern) {
-        whitelistClassPatterns.add(pattern);
-
+    public ClassGraph whitelistClassGlob(final String glob) {
+        whitelistClassGlobs.add(glob);
         return this;
     }