1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.dependency.analyzer.asm;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.util.Set;
24
25 import org.apache.commons.io.IOUtils;
26 import org.apache.maven.shared.dependency.analyzer.ClassFileVisitor;
27 import org.objectweb.asm.AnnotationVisitor;
28 import org.objectweb.asm.ClassReader;
29 import org.objectweb.asm.ClassVisitor;
30 import org.objectweb.asm.FieldVisitor;
31 import org.objectweb.asm.MethodVisitor;
32 import org.objectweb.asm.signature.SignatureVisitor;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36
37
38
39
40
41
42
43 public class DependencyClassFileVisitor implements ClassFileVisitor {
44 private final ResultCollector resultCollector = new ResultCollector();
45
46 private final Logger logger = LoggerFactory.getLogger(getClass());
47
48
49
50
51 public DependencyClassFileVisitor() {}
52
53
54 public void visitClass(String className, InputStream in) {
55 try {
56 byte[] byteCode = IOUtils.toByteArray(in);
57 ClassReader reader = new ClassReader(byteCode);
58
59 final Set<String> constantPoolClassRefs = ConstantPoolParser.getConstantPoolClassReferences(byteCode);
60 for (String string : constantPoolClassRefs) {
61 resultCollector.addName(string);
62 }
63
64 AnnotationVisitor annotationVisitor = new DefaultAnnotationVisitor(resultCollector);
65 SignatureVisitor signatureVisitor = new DefaultSignatureVisitor(resultCollector);
66 FieldVisitor fieldVisitor = new DefaultFieldVisitor(annotationVisitor, resultCollector);
67 MethodVisitor mv = new DefaultMethodVisitor(annotationVisitor, signatureVisitor, resultCollector);
68 ClassVisitor classVisitor =
69 new DefaultClassVisitor(signatureVisitor, annotationVisitor, fieldVisitor, mv, resultCollector);
70
71 reader.accept(classVisitor, 0);
72 } catch (IOException exception) {
73 exception.printStackTrace();
74 } catch (IndexOutOfBoundsException e) {
75
76
77 logger.warn("Unable to process: " + className);
78 }
79 }
80
81
82
83
84
85
86 public Set<String> getDependencies() {
87 return resultCollector.getDependencies();
88 }
89 }