X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Finspector%2Fjava%2FMain.java;h=9b706d33415ef894fe12850e423976a48817dc89;hb=b5ce3bd895a6e6c2253e070cfce197a244c78c4c;hp=eda82ee63aacca8bc45bc712bf56be5c5bbcd2a3;hpb=d6b9aa36eec691e17ad10eaa814308b50e44255a;p=javainspect.git diff --git a/src/main/java/eu/svjatoslav/inspector/java/Main.java b/src/main/java/eu/svjatoslav/inspector/java/Main.java index eda82ee..9b706d3 100644 --- a/src/main/java/eu/svjatoslav/inspector/java/Main.java +++ b/src/main/java/eu/svjatoslav/inspector/java/Main.java @@ -1,7 +1,19 @@ package eu.svjatoslav.inspector.java; +import eu.svjatoslav.inspector.java.commandline.CommandlineConfiguration; import eu.svjatoslav.inspector.java.structure.ClassGraph; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; + import static java.io.File.separator; import static java.lang.System.getProperty; @@ -9,16 +21,106 @@ import static java.lang.System.getProperty; * This class acts as a commandline interface for JavaInspect. */ public class Main { - public static void main(String[] args) { - CommandlineConfiguration commandlineConfiguration = new CommandlineConfiguration(args); - System.out.println("Commandline config validated"); - - ClassGraph cg = new ClassGraph(); - cg.setTargetDirectoryPath(getProperty("user.dir") + separator); - -// cg.addProject(projectDir); -// cg.whitelistClassGlob(packageGlob); -// cg.setKeepDotFile(true); -// cg.generateGraph(graphName); - } + public static void main(String[] args) throws IOException, ClassNotFoundException { + CommandlineConfiguration configuration = new CommandlineConfiguration(args); + if (!configuration.configurationOk) + System.exit(1); + + getClassGraph(configuration).generateGraph(configuration.graphName.getValue()); + + if (configuration.isDebug()) + System.out.println("Graph ready."); + } + + private static ClassGraph getClassGraph(CommandlineConfiguration configuration) throws IOException, ClassNotFoundException { + List jarFiles = configuration.jarFiles.getValue(); + + URLClassLoader classLoader = new URLClassLoader( + getFileUrls(jarFiles), + configuration.getClass().getClassLoader()); + + ClassGraph classGraph = new ClassGraph(); + + classGraph.setTargetDirectory(getTargetDirectory(configuration)); + + if (configuration.targetImageType.isSpecified()) + classGraph.setTargetImageType(configuration.targetImageType.getValue()); + + classGraph.setKeepDotFile(configuration.keepDotFile.getValue()); + + for (File jarFile : jarFiles) + addJarToGraph(jarFile, classLoader, classGraph, configuration); + + configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob); + configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob); + + if (configuration.hideOrphanedClasses.getValue()) + classGraph.hideOrphanedClasses(); + + return classGraph; + } + + private static File getTargetDirectory(CommandlineConfiguration configuration) { + if (configuration.targetDirectory.isSpecified()) + return configuration.targetDirectory.getValue(); + + // default to current directory + return new File(getProperty("user.dir") + separator); + } + + private static URL[] getFileUrls(List jarFiles) { + List urls = new ArrayList<>(); + jarFiles.forEach((File file) -> { + try { + urls.add(file.toURI().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + }); + + return urls.toArray(new URL[urls.size()]); + } + + private static void addJarToGraph( + File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration) + throws IOException, ClassNotFoundException { + + for (String className : getClassNamesFromJar(jarFile)) { + if (configuration.isDebug()) + System.out.println("Adding class to graph: " + className); + + classGraph.add(loadClassByName(classLoader, className)); + } + } + + private static Class loadClassByName(URLClassLoader classLoader, String className) throws ClassNotFoundException { + return Class.forName(className, true, classLoader); + } + + public static List getClassNamesFromJar(File jarFile) throws IOException { + List result = new ArrayList<>(); + try ( + JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile)) + ) { + while (true) { + JarEntry jarEntry = jarInputStream.getNextJarEntry(); + if (jarEntry == null) + break; + + if (isClassFile(jarEntry)) + result.add(getClassNameFromFileName(jarEntry)); + } + + return result; + } + } + + private static boolean isClassFile(JarEntry jarEntry) { + return jarEntry.getName().endsWith(".class"); + } + + private static String getClassNameFromFileName(JarEntry jarEntry) { + String result = jarEntry.getName().replaceAll("/", "\\."); + return result.substring(0, result.lastIndexOf('.')); + } }