1 package ch.ethz.prose.crosscut; 22 import java.lang.IllegalArgumentException ; 23 import java.lang.NullPointerException ; 24 import java.lang.Class ; 25 import java.lang.Error ; 26 import java.lang.IndexOutOfBoundsException ; 27 import java.lang.IllegalAccessException ; 28 import java.util.Arrays ; 29 import ch.ethz.jvmai.JoinPoint; 30 import java.lang.InstantiationException ; 31 import java.lang.reflect.Method ; 32 import java.lang.Object ; 33 import java.lang.System ; 34 import java.lang.reflect.InvocationTargetException ; 35 36 38 class DefaultMcutAdvice extends McutAdvice 39 { 40 private final MethodCut methodCut; 41 DefaultMcutAdvice(MethodCut methodCut, JoinPoint m, MethodCutSignaturePattern a) 42 { 43 super(methodCut, m,a); 44 this.methodCut = methodCut; 45 } 46 protected void execute() throws IllegalAccessException , InvocationTargetException 47 { 48 Object actualParams[] = new Object [stackArgsLength]; 49 System.arraycopy(stackArgs,0,actualParams,0,stackArgsLength); 50 localActionImpl(methodCut, advice.methodObj, stackArgs[0], actualParams); 51 } 52 53 private void localActionImpl(Object adviceThis,Method advMethod, Object localThis, Object [] localParam) 55 throws InvocationTargetException ,IllegalAccessException 56 { 57 58 59 Object [] localPar = new Object [localParam.length -1]; 60 System.arraycopy(localParam,1,localPar,0,localParam.length -1); 61 62 Class [] adviceSignature = advMethod.getParameterTypes(); 63 Object [] actualParams = new Object [adviceSignature.length]; 64 for (int i =0; i<adviceSignature.length; i++) 65 { 66 67 Object crtLocParam = localThis; 68 if (i>0) 69 { 70 try { crtLocParam=localPar[i-1]; } 71 catch (IndexOutOfBoundsException e) 72 { 73 crtLocParam=null; 79 } 80 } 81 if (Wildcard.class.isAssignableFrom(adviceSignature[i])) 82 { 83 Wildcard oscarWild; 84 try 85 { 86 oscarWild = (Wildcard)adviceSignature[i].newInstance(); 87 if (i < localPar.length + 1 && 88 (crtLocParam == null || oscarWild.isAssignableFrom(crtLocParam.getClass()))) 89 oscarWild.setObject(crtLocParam); 90 else 91 { 92 Object rest = new Object [localPar.length - i +1]; 93 System.arraycopy(localPar,i-1,rest,0,localPar.length -i +1); 94 oscarWild.setObject(rest); 95 } 96 } 97 catch (IllegalAccessException noConstructor) 101 { 102 103 throw new Error (noConstructor.toString() + "/" + adviceSignature[i]); 104 } 105 catch (InstantiationException wrongConstructor) 106 { 107 throw new Error (wrongConstructor.toString()); 108 } 109 110 actualParams[i] = oscarWild; 111 } 112 else 113 { 114 actualParams[i] = crtLocParam; 115 } 116 } 117 118 try 120 { 121 advMethod.invoke(adviceThis, actualParams); 122 } 123 catch (IllegalArgumentException wrongArgs) 124 { 125 throw new Error ("MethodCut.joinPointAction: " + wrongArgs + ". Actual arguments" + 126 Arrays.asList(actualParams) + " Expected arguments: " + advMethod); 127 } 128 catch (IllegalAccessException wrongMethod) 129 { 130 throw new IllegalAccessException ("Advice method (" + advMethod + ") not visible"); 131 } 132 catch(NullPointerException noReceiver) 133 { 134 throw new Error ("MethodCut.joinPointAction:" + noReceiver.toString()); 135 } 136 } 137 138 } 139 | Popular Tags |