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.joinpoint.management;
9   
10  import org.codehaus.aspectwerkz.joinpoint.CatchClauseRtti;
11  import org.codehaus.aspectwerkz.joinpoint.CatchClauseSignature;
12  import org.codehaus.aspectwerkz.joinpoint.Rtti;
13  import org.codehaus.aspectwerkz.joinpoint.Signature;
14  
15  /***
16   * Abstraction of a catch clause join point.
17   * 
18   * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a>
19   */
20  class CatchClauseJoinPoint extends JoinPointBase {
21      private final CatchClauseSignature m_signature;
22  
23      private transient CatchClauseRtti m_rtti;
24  
25      /***
26       * Creates a new join point.
27       * 
28       * @param targetClass
29       * @param signature
30       * @param rtti
31       * @param joinPointMetaData
32       * @param aroundAdviceExecutor
33       * @param beforeAdviceExecutor
34       * @param afterAdviceExecutor
35       */
36      public CatchClauseJoinPoint(final Class targetClass,
37                                  final Signature signature,
38                                  final Rtti rtti,
39                                  final JoinPointMetaData joinPointMetaData,
40                                  final AroundAdviceExecutor aroundAdviceExecutor,
41                                  final BeforeAdviceExecutor beforeAdviceExecutor,
42                                  final AfterAdviceExecutor afterAdviceExecutor) {
43          super(
44              JoinPointType.HANDLER,
45              targetClass,
46              joinPointMetaData,
47              aroundAdviceExecutor,
48              beforeAdviceExecutor,
49              afterAdviceExecutor);
50          m_signature = (CatchClauseSignature) signature;
51          m_rtti = (CatchClauseRtti) rtti;
52      }
53  
54      /***
55       * Walks through the pointcuts and invokes all its advices. When the last advice of the last pointcut has been
56       * invoked, the original method is invoked. Is called recursively.
57       * 
58       * @return the result from the next invocation
59       * @throws Throwable
60       * @TODO: which advices should we support for catch handlers? AspectJ only supports before, due to bytecode problems
61       *        (not possible to detect the end of a catch clause with 100% accuracy).
62       */
63      public Object proceed() throws Throwable {
64          if (m_beforeAdviceExecutor.hasAdvices()) {
65              m_beforeAdviceExecutor.proceed(this);
66          }
67          return null;
68      }
69  
70      /***
71       * Returns the signature for the join point.
72       * 
73       * @return the signature
74       */
75      public Signature getSignature() {
76          return m_signature;
77      }
78  
79      /***
80       * Returns the RTTI for the join point.
81       * 
82       * @return the RTTI
83       */
84      public Rtti getRtti() {
85          return m_rtti;
86      }
87  
88      /***
89       * Returns a string representation of the join point.
90       * 
91       * @return a string representation
92       * @TODO: implement toString to something meaningful
93       */
94      public String toString() {
95          return super.toString();
96      }
97  
98      public Object[] extractArguments(int[] methodToArgIndexes) {
99          return new Object[]{this};
100     }
101 
102     /***
103      * Allows to pass the RTTI to the JP. The JPBase implementation delegates getTarget to the RTTI.
104      * Since in 1.0 engine, JP are cached and shared, while the RTTI is not, we need to set the RTTI (AW-265).
105      * This method MUST not be called by the user.
106      *
107      * @param rtti
108      */
109     protected void setRtti(Rtti rtti) {
110         m_rtti = (CatchClauseRtti)rtti;
111     }
112 }