1 package org.apache.maven.tools.plugin.extractor.annotations.scanner.visitors;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.tools.plugin.extractor.annotations.scanner.MojoAnnotatedClass;
23 import org.apache.maven.tools.plugin.extractor.annotations.scanner.MojoAnnotationsScanner;
24 import org.codehaus.plexus.logging.Logger;
25 import org.codehaus.plexus.util.StringUtils;
26 import org.objectweb.asm.AnnotationVisitor;
27 import org.objectweb.asm.Attribute;
28 import org.objectweb.asm.ClassVisitor;
29 import org.objectweb.asm.FieldVisitor;
30 import org.objectweb.asm.MethodVisitor;
31 import org.objectweb.asm.Opcodes;
32 import org.objectweb.asm.Type;
33
34 import java.util.ArrayList;
35 import java.util.HashMap;
36 import java.util.List;
37 import java.util.Map;
38
39
40
41
42
43 public class MojoClassVisitor
44 extends ClassVisitor
45 {
46 private Logger logger;
47
48 private MojoAnnotatedClass mojoAnnotatedClass;
49
50 private Map<String, MojoAnnotationVisitor> annotationVisitorMap = new HashMap<String, MojoAnnotationVisitor>();
51
52 private List<MojoFieldVisitor> fieldVisitors = new ArrayList<MojoFieldVisitor>();
53
54 public MojoClassVisitor( Logger logger )
55 {
56 super( Opcodes.ASM5 );
57 this.logger = logger;
58 }
59
60 public MojoAnnotatedClass getMojoAnnotatedClass()
61 {
62 return mojoAnnotatedClass;
63 }
64
65 public void setMojoAnnotatedClass( MojoAnnotatedClass mojoAnnotatedClass )
66 {
67 this.mojoAnnotatedClass = mojoAnnotatedClass;
68 }
69
70 public Map<String, MojoAnnotationVisitor> getAnnotationVisitorMap()
71 {
72 return annotationVisitorMap;
73 }
74
75 public MojoAnnotationVisitor getAnnotationVisitor( Class<?> annotation )
76 {
77 return annotationVisitorMap.get( annotation.getName() );
78 }
79
80 public void setAnnotationVisitorMap( Map<String, MojoAnnotationVisitor> annotationVisitorMap )
81 {
82 this.annotationVisitorMap = annotationVisitorMap;
83 }
84
85 public List<MojoFieldVisitor> getFieldVisitors()
86 {
87 return fieldVisitors;
88 }
89
90 public void setFieldVisitors( List<MojoFieldVisitor> fieldVisitors )
91 {
92 this.fieldVisitors = fieldVisitors;
93 }
94
95 public List<MojoFieldVisitor> findFieldWithAnnotation( Class<?> annotation )
96 {
97 String annotationClassName = annotation.getName();
98
99 List<MojoFieldVisitor> mojoFieldVisitors = new ArrayList<MojoFieldVisitor>();
100
101 for ( MojoFieldVisitor mojoFieldVisitor : this.fieldVisitors )
102 {
103 MojoAnnotationVisitor mojoAnnotationVisitor = mojoFieldVisitor.getMojoAnnotationVisitor();
104 if ( mojoAnnotationVisitor != null && StringUtils.equals( annotationClassName,
105 mojoAnnotationVisitor.getAnnotationClassName() ) )
106 {
107 mojoFieldVisitors.add( mojoFieldVisitor );
108 }
109 }
110
111 return mojoFieldVisitors;
112 }
113
114 public void visit( int version, int access, String name, String signature, String superName, String[] interfaces )
115 {
116 mojoAnnotatedClass = new MojoAnnotatedClass();
117 mojoAnnotatedClass.setClassName( Type.getObjectType( name ).getClassName() );
118 if ( superName != null )
119 {
120 mojoAnnotatedClass.setParentClassName( Type.getObjectType( superName ).getClassName() );
121 }
122 }
123
124 public AnnotationVisitor visitAnnotation( String desc, boolean visible )
125 {
126 String annotationClassName = Type.getType( desc ).getClassName();
127 if ( !MojoAnnotationsScanner.CLASS_LEVEL_ANNOTATIONS.contains( annotationClassName ) )
128 {
129 return null;
130 }
131 MojoAnnotationVisitor mojoAnnotationVisitor = new MojoAnnotationVisitor( logger, annotationClassName );
132 annotationVisitorMap.put( annotationClassName, mojoAnnotationVisitor );
133 return mojoAnnotationVisitor;
134 }
135
136 public FieldVisitor visitField( int access, String name, String desc, String signature, Object value )
137 {
138 MojoFieldVisitor mojoFieldVisitor = new MojoFieldVisitor( logger, name, Type.getType( desc ).getClassName() );
139 fieldVisitors.add( mojoFieldVisitor );
140 return mojoFieldVisitor;
141 }
142
143 public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions )
144 {
145
146 return null;
147 }
148
149 public void visitAttribute( Attribute attr )
150 {
151
152 }
153
154 public void visitSource( String source, String debug )
155 {
156
157 }
158
159 public void visitOuterClass( String owner, String name, String desc )
160 {
161
162 }
163
164 public void visitInnerClass( String name, String outerName, String innerName, int access )
165 {
166
167 }
168
169 public void visitEnd()
170 {
171
172 }
173
174 }