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.transform.delegation; 9 10 import org.codehaus.aspectwerkz.definition.SystemDefinition; 11 import org.codehaus.aspectwerkz.expression.ExpressionContext; 12 import org.codehaus.aspectwerkz.expression.PointcutType; 13 import org.codehaus.aspectwerkz.reflect.ClassInfo; 14 import org.codehaus.aspectwerkz.reflect.impl.javassist.JavassistClassInfo; 15 import org.codehaus.aspectwerkz.transform.Context; 16 import org.codehaus.aspectwerkz.transform.Transformer; 17 18 import java.util.Iterator; 19 import java.util.List; 20 21 import javassist.CtClass; 22 23 /*** 24 * Prepares classes that are eligable for instrumentation. 25 * 26 * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a> 27 * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a> 28 */ 29 public class PrepareAdvisedClassTransformer implements Transformer { 30 /*** 31 * Makes the member method transformations. 32 * 33 * @param context the transformation context 34 * @param klass the class set. 35 */ 36 public void transform(final Context context, final Klass klass) throws Exception { 37 List definitions = context.getDefinitions(); 38 for (Iterator it = definitions.iterator(); it.hasNext();) { 39 SystemDefinition definition = (SystemDefinition) it.next(); 40 final CtClass ctClass = klass.getCtClass(); 41 ClassInfo classMetaData = JavassistClassInfo.getClassInfo(ctClass, context.getLoader()); 42 43 ExpressionContext[] ctxs = new ExpressionContext[]{ 44 new ExpressionContext(PointcutType.EXECUTION, classMetaData, classMetaData), 45 new ExpressionContext(PointcutType.CALL, null, classMetaData), 46 new ExpressionContext(PointcutType.GET, classMetaData, classMetaData), 47 new ExpressionContext(PointcutType.SET, classMetaData, classMetaData), 48 new ExpressionContext(PointcutType.HANDLER, null, classMetaData), 49 new ExpressionContext(PointcutType.STATIC_INITIALIZATION, classMetaData, classMetaData), 50 new ExpressionContext(PointcutType.WITHIN, classMetaData, classMetaData) 51 }; 52 if (classFilter(definition, ctxs, ctClass)) { 53 continue; 54 } 55 JavassistHelper.addStaticClassField(ctClass, context); 56 JavassistHelper.addJoinPointManagerField(ctClass, definition, context); 57 } 58 } 59 60 /*** 61 * Filters the classes to be transformed. 62 * 63 * @param definition the definition 64 * @param ctxs expression contexts 65 * @param cg the class to filter 66 * @return boolean true if the method should be filtered away 67 */ 68 public static boolean classFilter(final SystemDefinition definition, final ExpressionContext[] ctxs, final CtClass cg) { 69 if (cg.isInterface()) { 70 return true; 71 } 72 String className = cg.getName().replace('/', '.'); 73 if (definition.inExcludePackage(className)) { 74 return true; 75 } 76 if (!definition.inIncludePackage(className)) { 77 return true; 78 } 79 if (definition.inPreparePackage(className)) { 80 return false; 81 } 82 if (definition.isAdvised(ctxs)) { 83 return false; 84 } 85 return true; 86 } 87 }