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 }