View Javadoc

1   /*************1**************************************************************************
2    * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved.                 *
3    * http://aspectwerkz.codehaus.org                                                    *
4    * ---------------------------------------------------------------------------------- *
5    * The software in this package is published under the terms of the LGPL license      *
6    * a copy of which has been included with this distribution in the license.txt file.  *
7    **************************************************************************************/
8   package org.codehaus.aspectwerkz.annotation;
9   
10  import org.codehaus.aspectwerkz.definition.MixinDefinition;
11  import org.codehaus.aspectwerkz.definition.SystemDefinition;
12  import org.codehaus.aspectwerkz.definition.DefinitionParserHelper;
13  import org.codehaus.aspectwerkz.reflect.ClassInfo;
14  import org.codehaus.aspectwerkz.annotation.instrumentation.asm.AsmAnnotations;
15  import org.codehaus.aspectwerkz.expression.ExpressionInfo;
16  import org.codehaus.aspectwerkz.expression.ExpressionNamespace;
17  import org.codehaus.aspectwerkz.DeploymentModel;
18  import org.codehaus.aspectwerkz.DeploymentModel;
19  
20  import java.util.Iterator;
21  import java.util.List;
22  
23  /***
24   * Extracts the mixin annotations from the class files and creates a meta-data representation of them.
25   *
26   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
27   */
28  public class MixinAnnotationParser {
29  
30      /***
31       * The sole instance.
32       */
33      private final static MixinAnnotationParser INSTANCE = new MixinAnnotationParser();
34  
35      /***
36       * Private constructor to prevent subclassing.
37       */
38      private MixinAnnotationParser() {
39      }
40  
41      /***
42       * Parse the attributes and create and return a meta-data representation of them.
43       *
44       * @param classInfo the class to extract attributes from
45       * @param mixinDef  the mixin definition
46       */
47      public static void parse(final ClassInfo classInfo, final MixinDefinition mixinDef) {
48          INSTANCE.doParse(classInfo, mixinDef);
49      }
50  
51      /***
52       * Parse the attributes and create and return a meta-data representation of them.
53       *
54       * @param classInfo the class to extract attributes from
55       * @param mixinDef  the mixin definition
56       */
57      private void doParse(final ClassInfo classInfo, final MixinDefinition mixinDef) {
58          if (classInfo == null) {
59              throw new IllegalArgumentException("class to parse can not be null");
60          }
61          if (classInfo == null) {
62              throw new IllegalArgumentException("class can not be null");
63          }
64          final SystemDefinition systemDef = mixinDef.getSystemDefinition();
65          final List annotations = AsmAnnotations.getAnnotations(AnnotationConstants.MIXIN, classInfo);
66          for (Iterator iterator = annotations.iterator(); iterator.hasNext();) {
67              Mixin annotation = (Mixin) iterator.next();
68              if (annotation != null) {
69                  String expression = AspectAnnotationParser.getExpressionElseValue(
70                          annotation.value(), annotation.pointcut()
71                  );
72                  final ExpressionInfo expressionInfo = new ExpressionInfo(expression, systemDef.getUuid());
73                  ExpressionNamespace.getNamespace(systemDef.getUuid()).addExpressionInfo(
74                          DefinitionParserHelper.EXPRESSION_PREFIX + expression.hashCode(),
75                          expressionInfo
76                  );
77                  mixinDef.addExpressionInfo(expressionInfo);
78                  mixinDef.setTransient(annotation.isTransient());
79                  if (annotation.deploymentModel() != null) {
80                      mixinDef.setDeploymentModel(DeploymentModel.getDeploymentModelFor(annotation.deploymentModel()));
81                  }
82              }
83          }
84      }
85  }