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  }