View Javadoc

1   package org.apache.maven.tools.plugin.annotations.scanner.visitors;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author Olivier Lamy
40   * @since 3.0
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         // we don't need methods informations
137         return null;
138     }
139 
140     public void visitAttribute( Attribute attr )
141     {
142         // no op
143     }
144 
145     public void visitSource( String source, String debug )
146     {
147         // no op
148     }
149 
150     public void visitOuterClass( String owner, String name, String desc )
151     {
152         // no op
153     }
154 
155     public void visitInnerClass( String name, String outerName, String innerName, int access )
156     {
157         // no op
158     }
159 
160     public void visitEnd()
161     {
162         // no op
163     }
164 
165 }