Skip to content

Commit 00dd569

Browse files
committed
Apply pull request from issue gousiosg#12 from upstream to makes jcg read classes and directory
1 parent c05925e commit 00dd569

File tree

2 files changed

+52
-31
lines changed

2 files changed

+52
-31
lines changed

src/main/java/gr/gousiosg/javacg/stat/JCallGraph.java

+46-25
Original file line numberDiff line numberDiff line change
@@ -37,44 +37,65 @@
3737
import org.apache.bcel.classfile.ClassParser;
3838

3939
/**
40-
* Constructs a callgraph out of a JAR archive. Can combine multiple archives
41-
* into a single call graph.
40+
* Constructs a callgraph out of a set of directories, classes and JAR archives.
41+
* Can combine multiple archives into a single call graph.
4242
*
4343
* @author Georgios Gousios <gousiosg@gmail.com>
4444
*
4545
*/
4646
public class JCallGraph {
4747

48-
public static void main(String[] args) {
49-
ClassParser cp;
50-
try {
51-
for (String arg : args) {
48+
public static void processClass(String class_name) throws IOException {
49+
ClassParser cp = new ClassParser(class_name);
50+
ClassVisitor visitor = new ClassVisitor(cp.parse());
51+
visitor.start();
52+
}
53+
54+
public static void processClass(String jar_name, String class_name) throws IOException {
55+
ClassParser cp = new ClassParser(jar_name,class_name);
56+
ClassVisitor visitor = new ClassVisitor(cp.parse());
57+
visitor.start();
58+
}
59+
60+
public static void processJar(JarFile jar) throws IOException {
61+
Enumeration<JarEntry> entries = jar.entries();
62+
while (entries.hasMoreElements()) {
63+
JarEntry entry = entries.nextElement();
64+
if (entry.isDirectory())
65+
continue;
5266

53-
File f = new File(arg);
54-
55-
if (!f.exists()) {
56-
System.err.println("Jar file " + arg + " does not exist");
57-
}
58-
59-
JarFile jar = new JarFile(f);
67+
if (!entry.getName().endsWith(".class"))
68+
continue;
6069

61-
Enumeration<JarEntry> entries = jar.entries();
62-
while (entries.hasMoreElements()) {
63-
JarEntry entry = entries.nextElement();
64-
if (entry.isDirectory())
65-
continue;
70+
processClass(jar.getName(),entry.getName());
71+
}
72+
}
6673

67-
if (!entry.getName().endsWith(".class"))
68-
continue;
74+
public static void processFile(File file) {
75+
try {
76+
if (!file.exists())
77+
System.err.println("File " + file.getName() + " does not exist");
6978

70-
cp = new ClassParser(arg,entry.getName());
71-
ClassVisitor visitor = new ClassVisitor(cp.parse());
72-
visitor.start();
73-
}
79+
else if (file.isDirectory()) {
80+
for (File dfile : file.listFiles())
81+
processFile(dfile);
7482
}
83+
84+
else if (file.getName().endsWith(".jar"))
85+
processJar(new JarFile(file));
86+
87+
else if (file.getName().endsWith(".class"))
88+
processClass(file.getAbsolutePath());
89+
7590
} catch (IOException e) {
76-
System.err.println("Error while processing jar: " + e.getMessage());
91+
System.err.println("Error while processing file: " + e.getMessage());
7792
e.printStackTrace();
7893
}
7994
}
95+
96+
public static void main(String[] args) {
97+
for (String arg : args) {
98+
processFile(new File(arg));
99+
}
100+
}
80101
}

src/main/java/gr/gousiosg/javacg/stat/MethodVisitor.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public MethodVisitor(MethodGen m, JavaClass jc) {
4848
visitedClass = jc;
4949
mg = m;
5050
cp = mg.getConstantPool();
51-
format = "M:" + visitedClass.getClassName() + ":" + mg.getName() + "(" + argumentList(mg.getArgumentTypes()) + ")"
51+
format = "M:" + visitedClass.getClassName() + ":" + mg.getName() + "(" + argumentList(mg.getArgumentTypes()) + "):%d"
5252
+ " " + "(%s)%s:%s(%s)";
5353
}
5454

@@ -84,27 +84,27 @@ private boolean visitInstruction(Instruction i) {
8484

8585
@Override
8686
public void visitINVOKEVIRTUAL(INVOKEVIRTUAL i) {
87-
System.out.println(String.format(format,"M",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
87+
System.out.println(String.format(format,i.getIndex(),"M",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
8888
}
8989

9090
@Override
9191
public void visitINVOKEINTERFACE(INVOKEINTERFACE i) {
92-
System.out.println(String.format(format,"I",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
92+
System.out.println(String.format(format,i.getIndex(),"I",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
9393
}
9494

9595
@Override
9696
public void visitINVOKESPECIAL(INVOKESPECIAL i) {
97-
System.out.println(String.format(format,"O",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
97+
System.out.println(String.format(format,i.getIndex(),"O",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
9898
}
9999

100100
@Override
101101
public void visitINVOKESTATIC(INVOKESTATIC i) {
102-
System.out.println(String.format(format,"S",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
102+
System.out.println(String.format(format,i.getIndex(),"S",i.getReferenceType(cp),i.getMethodName(cp),argumentList(i.getArgumentTypes(cp))));
103103
}
104104

105105
@Override
106106
public void visitINVOKEDYNAMIC(INVOKEDYNAMIC i) {
107-
System.out.println(String.format(format,"D",i.getType(cp),i.getMethodName(cp),
107+
System.out.println(String.format(format,i.getIndex(),"D",i.getType(cp),i.getMethodName(cp),
108108
argumentList(i.getArgumentTypes(cp))));
109109
}
110110
}

0 commit comments

Comments
 (0)