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.inlining;
9   
10  import org.codehaus.aspectwerkz.joinpoint.management.JoinPointType;
11  import org.codehaus.aspectwerkz.transform.Context;
12  import org.objectweb.asm.Label;
13  
14  /***
15   * A structure that keeps required information needed to regenerate a JIT joinpoint. The weaver emits this
16   * information so that we can add initalization code to the weaved class. Note that EmittedJP are really Emitted -
17   * and can be a subset of actual JP (f.e. call, where information is lost in between each weave phase).
18   *
19   * FIXME equals and hashcode are wrong if 2 JP in same withincode - should depend on line number f.e. but that won't
20   * even be enough. Muts have a static variable and trust that creation of EmittedJP is ok.
21   * Check where those are used in a map for hashcode / equals to be used.
22   *
23   *
24   * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a>
25   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
26   */
27  public final class EmittedJoinPoint {
28  
29      public final static Label NO_LINE_NUMBER = new Label();
30  
31      private final int joinPointType;
32      private final String callerClassName;
33      private final String callerMethodName;
34      private final String callerMethodDesc;
35      private final int callerMethodModifiers;
36      private final String calleeClassName;
37      private final String calleeMemberName;
38      private final String calleeMemberDesc;
39      private final int calleeMemberModifiers;
40      private final int joinPointHash;
41      private final String joinPointClassName;
42      private final Label lineNumberLabel;
43  
44      /***
45       * Line number for call / get / set / handler joinpoint
46       * The lineNumber is 0 unless available and resolveLineNumber(Context) has been called.
47       */
48      private int lineNumber = 0;
49  
50      /***
51       * Creates a new instance.
52       *
53       * @param joinPointType
54       * @param callerClassName
55       * @param callerMethodName
56       * @param callerMethodDesc
57       * @param callerMethodModifiers
58       * @param calleeClassName
59       * @param calleeMemberName
60       * @param calleeMemberDesc
61       * @param calleeMemberModifiers
62       * @param joinPointHash
63       * @param joinPointClassName
64       * @param lineNumberLabel
65       */
66      public EmittedJoinPoint(final int joinPointType,
67                              final String callerClassName,
68                              final String callerMethodName,
69                              final String callerMethodDesc,
70                              final int callerMethodModifiers,
71                              final String calleeClassName,
72                              final String calleeMemberName,
73                              final String calleeMemberDesc,
74                              final int calleeMemberModifiers,
75                              final int joinPointHash,
76                              final String joinPointClassName,
77                              final Label lineNumberLabel) {
78          this.joinPointType = joinPointType;
79          this.callerClassName = callerClassName;
80          this.callerMethodName = callerMethodName;
81          this.callerMethodDesc = callerMethodDesc;
82          this.callerMethodModifiers = callerMethodModifiers;
83          this.calleeClassName = calleeClassName;
84          this.calleeMemberName = calleeMemberName;
85          this.calleeMemberDesc = calleeMemberDesc;
86          this.calleeMemberModifiers = calleeMemberModifiers;
87          this.joinPointHash = joinPointHash;
88          this.joinPointClassName = joinPointClassName;
89          this.lineNumberLabel = lineNumberLabel;
90      }
91  
92      /***
93       * Creates a new instance.
94       *
95       * @param joinPointType
96       * @param callerClassName
97       * @param callerMethodName
98       * @param callerMethodDesc
99       * @param callerMethodModifiers
100      * @param calleeClassName
101      * @param calleeMemberName
102      * @param calleeMemberDesc
103      * @param calleeMemberModifiers
104      * @param joinPointHash
105      * @param joinPointClassName
106      */
107     public EmittedJoinPoint(final int joinPointType,
108                             final String callerClassName,
109                             final String callerMethodName,
110                             final String callerMethodDesc,
111                             final int callerMethodModifiers,
112                             final String calleeClassName,
113                             final String calleeMemberName,
114                             final String calleeMemberDesc,
115                             final int calleeMemberModifiers,
116                             final int joinPointHash,
117                             final String joinPointClassName) {
118         this(joinPointType, callerClassName, callerMethodName, callerMethodDesc, callerMethodModifiers,
119                 calleeClassName, calleeMemberName, calleeMemberDesc, calleeMemberModifiers,
120                 joinPointHash, joinPointClassName, NO_LINE_NUMBER
121         );
122     }
123 
124     public int getJoinPointType() {
125         return joinPointType;
126     }
127 
128     public String getCallerClassName() {
129         return callerClassName;
130     }
131 
132     public String getCallerMethodName() {
133         return callerMethodName;
134     }
135 
136     public String getCallerMethodDesc() {
137         return callerMethodDesc;
138     }
139 
140     public int getCallerMethodModifiers() {
141         return callerMethodModifiers;
142     }
143 
144     public String getCalleeClassName() {
145         return calleeClassName;
146     }
147 
148     public String getCalleeMemberName() {
149         return calleeMemberName;
150     }
151 
152     public String getCalleeMemberDesc() {
153         return calleeMemberDesc;
154     }
155 
156     public int getCalleeMemberModifiers() {
157         return calleeMemberModifiers;
158     }
159 
160     public int getJoinPointHash() {
161         return joinPointHash;
162     }
163 
164     public String getJoinPointClassName() {
165         return joinPointClassName;
166     }
167 
168     public int getLineNumber() {
169         return lineNumber;
170     }
171 
172     public void resolveLineNumber(Context context) {
173         lineNumber = context.resolveLineNumberInfo(lineNumberLabel);
174     }
175 
176     public boolean equals(Object o) {
177         if (this == o) {
178             return true;
179         }
180         if (!(o instanceof EmittedJoinPoint)) {
181             return false;
182         }
183 
184         final EmittedJoinPoint emittedJoinPoint = (EmittedJoinPoint) o;
185 
186         if (calleeMemberModifiers != emittedJoinPoint.calleeMemberModifiers) {
187             return false;
188         }
189         if (callerMethodModifiers != emittedJoinPoint.callerMethodModifiers) {
190             return false;
191         }
192         if (joinPointHash != emittedJoinPoint.joinPointHash) {
193             return false;
194         }
195         if (joinPointType != emittedJoinPoint.joinPointType) {
196             return false;
197         }
198         if (!calleeClassName.equals(emittedJoinPoint.calleeClassName)) {
199             return false;
200         }
201         if (!calleeMemberDesc.equals(emittedJoinPoint.calleeMemberDesc)) {
202             return false;
203         }
204         if (!calleeMemberName.equals(emittedJoinPoint.calleeMemberName)) {
205             return false;
206         }
207         if (!callerClassName.equals(emittedJoinPoint.callerClassName)) {
208             return false;
209         }
210         if (!callerMethodDesc.equals(emittedJoinPoint.callerMethodDesc)) {
211             return false;
212         }
213         if (!callerMethodName.equals(emittedJoinPoint.callerMethodName)) {
214             return false;
215         }
216         if (!joinPointClassName.equals(emittedJoinPoint.joinPointClassName)) {
217             return false;
218         }
219 
220         return true;
221     }
222 
223     public int hashCode() {
224         int result;
225         result = joinPointType;
226         result = 29 * result + callerClassName.hashCode();
227         result = 29 * result + callerMethodName.hashCode();
228         result = 29 * result + callerMethodDesc.hashCode();
229         result = 29 * result + callerMethodModifiers;
230         result = 29 * result + calleeClassName.hashCode();
231         result = 29 * result + calleeMemberName.hashCode();
232         result = 29 * result + calleeMemberDesc.hashCode();
233         result = 29 * result + calleeMemberModifiers;
234         result = 29 * result + joinPointHash;
235         result = 29 * result + joinPointClassName.hashCode();
236         return result;
237     }
238 
239     public String toString() {
240         StringBuffer sb = new StringBuffer();
241         sb.append(JoinPointType.fromInt(getJoinPointType()).toString());
242         sb.append(" , caller ");
243         sb.append(getCallerClassName());
244         sb.append('.').append(getCallerMethodName());
245         sb.append(getCallerMethodDesc());
246         sb.append(" , callee ");
247         sb.append(getCalleeClassName());
248         sb.append('.').append(getCalleeMemberName());
249         sb.append(' ').append(getCalleeMemberDesc());
250         sb.append(" , line ").append(getLineNumber());
251         return sb.toString();
252     }
253 }