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 }