/**************************************************************************************
* 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.aspect;
import org.codehaus.aspectwerkz.transform.inlining.AsmHelper;
import org.codehaus.aspectwerkz.expression.ExpressionInfo;
import org.codehaus.aspectwerkz.expression.ExpressionContext;
import org.codehaus.aspectwerkz.definition.AdviceDefinition;
import org.codehaus.aspectwerkz.DeploymentModel;
import org.objectweb.asm.Type;
import java.io.Serializable;
/**
* Contains advice info, like indexes describing the aspect and a method (advice or introduced),
* aspect manager etc.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a>
*/
public class AdviceInfo implements Serializable {
public final static AdviceInfo[] EMPTY_ADVICE_INFO_ARRAY = new AdviceInfo[0];
// -- some magic index used in the m_methodToArgIndexes[] so that we know what to bind except advised target args
// -- those constants MUST be negative since positive values are used for args(..) binding
public final static int JOINPOINT_ARG = -0x1;
public final static int STATIC_JOINPOINT_ARG = -0x2;
public final static int TARGET_ARG = -0x3;
public final static int THIS_ARG = -0x4;
public final static int VALID_NON_AW_AROUND_CLOSURE_TYPE = -0x5;
public final static int SPECIAL_ARGUMENT = -0x6;
public static final int CUSTOM_JOIN_POINT_ARG = -0x7;
/**
* The method name.
*/
private String m_methodName;
/**
* The method sig.
*/
private String m_methodSignature;
/**
* The method's parameter types.
*/
private Type[] m_methodParameterTypes;
/**
* The advice name
* <adviceMethodName>[(... call signature)]
*/
private final String m_name;
/**
* The aspect class name where this advice is defined.
*/
private String m_aspectClassName;
/**
* The aspect qualified name - <uuid>/<aspectNickName or FQNclassName>
*/
private String m_aspectQualifiedName;
/**
* The aspect deployment model
*/
private DeploymentModel m_aspectDeploymentModel;
/**
* The advice method arg index mapped to the advisED target arg index.
* If the value is greater or equal to 0, it is an args binding. Else, it is a magic index
* (see constants JOINPOINT_ARG, STATIC_JOINPOINT_ARG, THIS_ARG, TARGET_ARG)
*/
private int[] m_methodToArgIndexes;
/**
* The "special" argument type desc for the advice.
*/
private String m_specialArgumentTypeDesc;
/**
* The "special" argument type name for the advice.
*/
private String m_specialArgumentTypeName;
/**
* The advice type.
*/
private AdviceType m_type;
/**
* Runtime check flag.
*/
private boolean m_targetWithRuntimeCheck;
/**
* The expression info.
*/
private ExpressionInfo m_expressionInfo;
/**
* The expression context.
*/
private ExpressionContext m_expressionContext;
/**
* The advice definition for this advice.
*/
private AdviceDefinition m_adviceDef;
/**
* TODO refactor - many member fields holds data that is in either the adviceDef (which is in the class) or the aspectDef (which is accessible from the adviceDef)
* <p/>
* Creates a new advice info.
*
* @param aspectQualifiedName
* @param aspectClassName
* @param aspectDeploymentModel
* @param methodName
* @param methodSignature
* @param methodParameterTypes
* @param type the advice type
* @param specialArgumentType the special arg type
* @param adviceName full qualified advice method name (aspectFQN/advice(call sig))
* @param targetWithRuntimeCheck true if a runtime check is needed based on target instance
* @param expressionInfo
* @param expressionContext
* @param adviceDef
*/
public AdviceInfo(final String aspectQualifiedName,
final String aspectClassName,
final DeploymentModel aspectDeploymentModel,
final String methodName,
final String methodSignature,
final Type[] methodParameterTypes,
final AdviceType type,
final String specialArgumentType,
final String adviceName,
final boolean targetWithRuntimeCheck,
final ExpressionInfo expressionInfo,
final ExpressionContext expressionContext,
final AdviceDefinition adviceDef) {
m_aspectQualifiedName = aspectQualifiedName;
m_aspectClassName = aspectClassName;
m_aspectDeploymentModel = aspectDeploymentModel;
m_methodName = methodName;
m_methodSignature = methodSignature;
m_methodParameterTypes = methodParameterTypes;
m_type = type;
if (specialArgumentType != null && specialArgumentType.length()>0) {//AW-434
m_specialArgumentTypeDesc = AsmHelper.convertReflectDescToTypeDesc(specialArgumentType);
m_specialArgumentTypeName = specialArgumentType.replace('.', '/');
}
m_name = adviceName;
m_targetWithRuntimeCheck = targetWithRuntimeCheck;
m_expressionInfo = expressionInfo;
m_expressionContext = expressionContext;
m_adviceDef = adviceDef;
}
/**
* Return the method name.
*
* @return the method name
*/
public String getMethodName() {
return m_methodName;
}
/**
* Return the method signature.
*
* @return the method signature
*/
public String getMethodSignature() {
return m_methodSignature;
}
/**
* Return the method name.
*
* @return the method name
*/
public Type[] getMethodParameterTypes() {
return m_methodParameterTypes;
}
/**
* Returns the aspect qualified name.
*
* @return the aspect qualified name
*/
public String getAspectQualifiedName() {
return m_aspectQualifiedName;
}
/**
* Returns the aspect FQN className.
*
* @return the aspect class name
*/
public String getAspectClassName() {
return m_aspectClassName;
}
/**
* Returns the aspect deployment model
*
* @return
*/
public DeploymentModel getAspectDeploymentModel() {
return m_aspectDeploymentModel;
}
/**
* Returns the name of the advice.
*
* @return
*/
public String getName() {
return m_name;
}
/**
* Sets the advice method to target method arg mapping A value of -1 means "not mapped"
*
* @param map
*/
public void setMethodToArgIndexes(final int[] map) {
m_methodToArgIndexes = map;
}
/**
* Returns the advice method to target method arg index mapping.
*
* @return the indexes
*/
public int[] getMethodToArgIndexes() {
return m_methodToArgIndexes;
}
/**
* Returns the special argument type desc.
*
* @return
*/
public String getSpecialArgumentTypeDesc() {
return m_specialArgumentTypeDesc;
}
/**
* Returns the special argument type name.
*
* @return
*/
public String getSpecialArgumentTypeName() {
return m_specialArgumentTypeName;
}
/**
* Returns the advice type.
*
* @return
*/
public AdviceType getType() {
return m_type;
}
/**
* Checks if the target has a runtime check.
*
* @return
*/
public boolean hasTargetWithRuntimeCheck() {
return m_targetWithRuntimeCheck;
}
/**
* Returns the expression info.
*
* @return
*/
public ExpressionInfo getExpressionInfo() {
return m_expressionInfo;
}
/**
* Returns the expression context.
*
* @return
*/
public ExpressionContext getExpressionContext() {
return m_expressionContext;
}
/**
* Returns the advice definition.
*
* @return
*/
public AdviceDefinition getAdviceDefinition() {
return m_adviceDef;
}
public String toString() {
StringBuffer sb = new StringBuffer("AdviceInfo[");
sb.append(m_type).append(',');
sb.append(m_aspectQualifiedName).append(',');
sb.append(m_name).append(',');
sb.append(m_methodName).append(',');
sb.append(m_methodSignature).append(',');
sb.append(m_methodParameterTypes).append(',');
sb.append(m_specialArgumentTypeDesc).append(',');
sb.append(m_expressionInfo).append(',');
sb.append(m_expressionContext).append(',');
sb.append(m_targetWithRuntimeCheck).append(']');
sb.append(hashCode());
return sb.toString();
}
}