/*
* 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
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;
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() {
}
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;
}
/**
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");
result.append("}\n");
- final String resultStr = result.toString();
- return resultStr;
+ return result.toString();
}
/**
}
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;
}
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;
}