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.objectweb.asm.AnnotationVisitor;
26 import org.objectweb.asm.Attribute;
27 import org.objectweb.asm.ClassVisitor;
28 import org.objectweb.asm.FieldVisitor;
29 import org.objectweb.asm.MethodVisitor;
30 import org.objectweb.asm.Opcodes;
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 import java.util.Objects;
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<>();
51
52 private List<MojoFieldVisitor> fieldVisitors = new ArrayList<>();
53
54 public MojoClassVisitor( Logger logger )
55 {
56 super( Opcodes.ASM9 );
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 && Objects.equals( annotationClassName,
105 mojoAnnotationVisitor.getAnnotationClassName() ) )
106 {
107 mojoFieldVisitors.add( mojoFieldVisitor );
108 }
109 }
110
111 return mojoFieldVisitors;
112 }
113
114 @Override
115 public void visit( int version, int access, String name, String signature, String superName, String[] interfaces )
116 {
117 mojoAnnotatedClass = new MojoAnnotatedClass();
118 mojoAnnotatedClass.setClassName( Type.getObjectType( name ).getClassName() );
119 if ( superName != null )
120 {
121 mojoAnnotatedClass.setParentClassName( Type.getObjectType( superName ).getClassName() );
122 }
123 }
124
125 @Override
126 public AnnotationVisitor visitAnnotation( String desc, boolean visible )
127 {
128 String annotationClassName = Type.getType( desc ).getClassName();
129 if ( !MojoAnnotationsScanner.CLASS_LEVEL_ANNOTATIONS.contains( annotationClassName ) )
130 {
131 return null;
132 }
133 MojoAnnotationVisitor mojoAnnotationVisitor = new MojoAnnotationVisitor( logger, annotationClassName );
134 annotationVisitorMap.put( annotationClassName, mojoAnnotationVisitor );
135 return mojoAnnotationVisitor;
136 }
137
138 @Override
139 public FieldVisitor visitField( int access, String name, String desc, String signature, Object value )
140 {
141 MojoFieldVisitor mojoFieldVisitor = new MojoFieldVisitor( logger, name, Type.getType( desc ).getClassName() );
142 fieldVisitors.add( mojoFieldVisitor );
143 return mojoFieldVisitor;
144 }
145
146 @Override
147 public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions )
148 {
149
150 return null;
151 }
152
153 @Override
154 public void visitAttribute( Attribute attr )
155 {
156
157 }
158
159 @Override
160 public void visitSource( String source, String debug )
161 {
162
163 }
164
165 @Override
166 public void visitOuterClass( String owner, String name, String desc )
167 {
168
169 }
170
171 @Override
172 public void visitInnerClass( String name, String outerName, String innerName, int access )
173 {
174
175 }
176
177 @Override
178 public void visitEnd()
179 {
180
181 }
182
183 }