1 package org.apache.maven.tools.plugin.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.annotations.scanner.MojoAnnotatedClass;
23 import org.apache.maven.tools.plugin.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.Type;
32
33 import java.util.ArrayList;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37
38
39
40
41
42 public class MojoClassVisitor
43 implements ClassVisitor
44 {
45 private Logger logger;
46
47 private MojoAnnotatedClass mojoAnnotatedClass;
48
49 private Map<String, MojoAnnotationVisitor> annotationVisitorMap = new HashMap<String, MojoAnnotationVisitor>();
50
51 private List<MojoFieldVisitor> fieldVisitors = new ArrayList<MojoFieldVisitor>();
52
53 public MojoClassVisitor( Logger logger )
54 {
55 this.logger = logger;
56 }
57
58 public MojoAnnotatedClass getMojoAnnotatedClass()
59 {
60 return mojoAnnotatedClass;
61 }
62
63 public void setMojoAnnotatedClass( MojoAnnotatedClass mojoAnnotatedClass )
64 {
65 this.mojoAnnotatedClass = mojoAnnotatedClass;
66 }
67
68 public Map<String, MojoAnnotationVisitor> getAnnotationVisitorMap()
69 {
70 return annotationVisitorMap;
71 }
72
73 public void setAnnotationVisitorMap( Map<String, MojoAnnotationVisitor> annotationVisitorMap )
74 {
75 this.annotationVisitorMap = annotationVisitorMap;
76 }
77
78 public List<MojoFieldVisitor> getFieldVisitors()
79 {
80 return fieldVisitors;
81 }
82
83 public void setFieldVisitors( List<MojoFieldVisitor> fieldVisitors )
84 {
85 this.fieldVisitors = fieldVisitors;
86 }
87
88 public List<MojoFieldVisitor> findFieldWithAnnotationClass( String annotationClassName )
89 {
90 List<MojoFieldVisitor> mojoFieldVisitors = new ArrayList<MojoFieldVisitor>();
91
92 for ( MojoFieldVisitor mojoFieldVisitor : this.fieldVisitors )
93 {
94 MojoAnnotationVisitor mojoAnnotationVisitor = mojoFieldVisitor.getMojoAnnotationVisitor();
95 if ( mojoAnnotationVisitor != null && StringUtils.equals( annotationClassName,
96 mojoAnnotationVisitor.getAnnotationClassName() ) )
97 {
98 mojoFieldVisitors.add( mojoFieldVisitor );
99 }
100 }
101
102 return mojoFieldVisitors;
103 }
104
105 public void visit( int version, int access, String name, String signature, String superName, String[] interfaces )
106 {
107 mojoAnnotatedClass = new MojoAnnotatedClass();
108 mojoAnnotatedClass.setClassName( Type.getObjectType( name ).getClassName() ).setParentClassName(
109 Type.getObjectType( superName ).getClassName() );
110 logger.debug( "MojoClassVisitor#visit" );
111 }
112
113 public AnnotationVisitor visitAnnotation( String desc, boolean visible )
114 {
115 logger.debug( "MojoClassVisitor#visitAnnotation" );
116 String annotationClassName = Type.getType( desc ).getClassName();
117 if ( !MojoAnnotationsScanner.CLASS_LEVEL_ANNOTATIONS.contains( annotationClassName ) )
118 {
119 return null;
120 }
121 MojoAnnotationVisitor mojoAnnotationVisitor = new MojoAnnotationVisitor( logger, annotationClassName );
122 annotationVisitorMap.put( annotationClassName, mojoAnnotationVisitor );
123 return mojoAnnotationVisitor;
124 }
125
126 public FieldVisitor visitField( int access, String name, String desc, String signature, Object value )
127 {
128 logger.debug( "MojoClassVisitor#visitField" );
129 MojoFieldVisitor mojoFieldVisitor = new MojoFieldVisitor( logger, name, Type.getType( desc ).getClassName() );
130 fieldVisitors.add( mojoFieldVisitor );
131 return mojoFieldVisitor;
132 }
133
134 public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions )
135 {
136
137 return null;
138 }
139
140 public void visitAttribute( Attribute attr )
141 {
142
143 }
144
145 public void visitSource( String source, String debug )
146 {
147
148 }
149
150 public void visitOuterClass( String owner, String name, String desc )
151 {
152
153 }
154
155 public void visitInnerClass( String name, String outerName, String innerName, int access )
156 {
157
158 }
159
160 public void visitEnd()
161 {
162
163 }
164
165 }