Removed files that came from forked repo and not needed in this one.
[javainspect.git] / src / main / java / eu / svjatoslav / inspector / java / commandline / Main.java
1 package eu.svjatoslav.inspector.java.commandline;
2
3 import eu.svjatoslav.inspector.java.commandline.CommandlineConfiguration;
4 import eu.svjatoslav.inspector.java.structure.ClassGraph;
5
6 import java.io.File;
7 import java.io.FileInputStream;
8 import java.io.IOException;
9 import java.net.MalformedURLException;
10 import java.net.URL;
11 import java.net.URLClassLoader;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.jar.JarEntry;
15 import java.util.jar.JarInputStream;
16
17 import static java.io.File.separator;
18 import static java.lang.System.getProperty;
19
20 /**
21  * This class acts as a commandline interface for JavaInspect.
22  */
23 public class Main {
24     public static void main(String[] args) throws IOException, ClassNotFoundException {
25         CommandlineConfiguration configuration = new CommandlineConfiguration(args);
26         if (!configuration.configurationOk)
27             System.exit(1);
28             
29         getClassGraph(configuration).generateGraph(configuration.graphName.getValue());
30
31         if (configuration.isDebug())
32             System.out.println("Graph ready.");
33     }
34
35     private static ClassGraph getClassGraph(CommandlineConfiguration configuration) throws IOException, ClassNotFoundException {
36         List<File> jarFiles = configuration.jarFiles.getValue();
37
38         URLClassLoader classLoader = new URLClassLoader(
39                 getFileUrls(jarFiles),
40                 configuration.getClass().getClassLoader());
41
42         ClassGraph classGraph = new ClassGraph();
43
44         classGraph.setTargetDirectory(getTargetDirectory(configuration));
45
46         if (configuration.targetImageType.isSpecified())
47             classGraph.setTargetImageType(configuration.targetImageType.getValue());
48
49         classGraph.setKeepDotFile(configuration.keepDotFile.getValue());
50
51         for (File jarFile : jarFiles)
52             addJarToGraph(jarFile, classLoader, classGraph, configuration);
53
54         configuration.blacklistGlob.getValue().forEach(classGraph::blacklistClassGlob);
55         configuration.whitelistGlob.getValue().forEach(classGraph::whitelistClassGlob);
56
57         if (configuration.hideOrphanedClasses.getValue())
58             classGraph.hideOrphanedClasses();
59
60         return classGraph;
61     }
62
63     private static File getTargetDirectory(CommandlineConfiguration configuration) {
64         if (configuration.targetDirectory.isSpecified())
65             return configuration.targetDirectory.getValue();
66
67         // default to current directory
68         return new File(getProperty("user.dir") + separator);
69     }
70
71     private static URL[] getFileUrls(List<File> jarFiles) {
72         List<URL> urls = new ArrayList<>();
73         jarFiles.forEach((File file) -> {
74             try {
75                 urls.add(file.toURI().toURL());
76             } catch (MalformedURLException e) {
77                 throw new RuntimeException(e);
78             }
79         });
80
81         return urls.toArray(new URL[urls.size()]);
82     }
83
84     private static void addJarToGraph(
85             File jarFile, URLClassLoader classLoader, ClassGraph classGraph, CommandlineConfiguration configuration)
86             throws IOException, ClassNotFoundException {
87
88         for (String className : getClassNamesFromJar(jarFile)) {
89             if (configuration.isDebug())
90                 System.out.println("Adding class to graph: " + className);
91
92             classGraph.add(loadClassByName(classLoader, className));
93         }
94     }
95
96     private static Class loadClassByName(URLClassLoader classLoader, String className) throws ClassNotFoundException {
97         return Class.forName(className, true, classLoader);
98     }
99
100     public static List<String> getClassNamesFromJar(File jarFile) throws IOException {
101         List<String> result = new ArrayList<>();
102         try (
103                 JarInputStream jarInputStream = new JarInputStream(new FileInputStream(jarFile))
104         ) {
105             while (true) {
106                 JarEntry jarEntry = jarInputStream.getNextJarEntry();
107                 if (jarEntry == null)
108                     break;
109
110                 if (isClassFile(jarEntry))
111                     result.add(getClassNameFromFileName(jarEntry));
112             }
113
114             return result;
115         }
116     }
117
118     private static boolean isClassFile(JarEntry jarEntry) {
119         return jarEntry.getName().endsWith(".class");
120     }
121
122     private static String getClassNameFromFileName(JarEntry jarEntry) {
123         String result = jarEntry.getName().replaceAll("/", "\\.");
124         return result.substring(0, result.lastIndexOf('.'));
125     }
126 }