/************1************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.annotation; import org.codehaus.aspectwerkz.definition.MixinDefinition; import org.codehaus.aspectwerkz.definition.SystemDefinition; import org.codehaus.aspectwerkz.definition.DefinitionParserHelper; import org.codehaus.aspectwerkz.reflect.ClassInfo; import org.codehaus.aspectwerkz.expression.ExpressionInfo; import org.codehaus.aspectwerkz.expression.ExpressionNamespace; import org.codehaus.aspectwerkz.DeploymentModel; import org.codehaus.aspectwerkz.DeploymentModel; import java.util.Iterator; import java.util.List; /** * Extracts the mixin annotations from the class files and creates a meta-data representation of them. * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public class MixinAnnotationParser { /** * The sole instance. */ private final static MixinAnnotationParser INSTANCE = new MixinAnnotationParser(); /** * Private constructor to prevent subclassing. */ private MixinAnnotationParser() { } /** * Parse the attributes and create and return a meta-data representation of them. * * @param classInfo the class to extract attributes from * @param mixinDef the mixin definition */ public static void parse(final ClassInfo classInfo, final MixinDefinition mixinDef) { INSTANCE.doParse(classInfo, mixinDef); } /** * Parse the attributes and create and return a meta-data representation of them. * * @param classInfo the class to extract attributes from * @param mixinDef the mixin definition */ private void doParse(final ClassInfo classInfo, final MixinDefinition mixinDef) { if (classInfo == null) { throw new IllegalArgumentException("class to parse can not be null"); } if (classInfo == null) { throw new IllegalArgumentException("class can not be null"); } final SystemDefinition systemDef = mixinDef.getSystemDefinition(); Mixin annotation = (Mixin) AsmAnnotations.getAnnotation(AnnotationConstants.MIXIN, classInfo); if (annotation != null) { String expression = AspectAnnotationParser.getExpressionElseValue( annotation.value(), annotation.pointcut() ); final ExpressionInfo expressionInfo = new ExpressionInfo(expression, systemDef.getUuid()); ExpressionNamespace.getNamespace(systemDef.getUuid()).addExpressionInfo( DefinitionParserHelper.EXPRESSION_PREFIX + expression.hashCode(), expressionInfo ); mixinDef.addExpressionInfo(expressionInfo); mixinDef.setTransient(annotation.isTransient()); if (annotation.deploymentModel() != null) { mixinDef.setDeploymentModel(DeploymentModel.getDeploymentModelFor(annotation.deploymentModel())); } } } }