View Javadoc

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  }