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 }