1 27 package ch.ethz.prose.crosscut; 28 29 import java.lang.reflect.Field ; 31 import java.util.HashMap ; 32 33 import ch.ethz.jvmai.ExceptionJoinPoint; 34 import ch.ethz.jvmai.FieldAccessJoinPoint; 35 import ch.ethz.jvmai.FieldModificationJoinPoint; 36 import ch.ethz.jvmai.JoinPoint; 37 import ch.ethz.jvmai.MethodEntryJoinPoint; 38 import ch.ethz.jvmai.MethodExitJoinPoint; 39 import ch.ethz.prose.engine.FieldAccessRequest; 40 41 42 62 public abstract class GetCut extends AbstractCrosscut { 63 private static class SetGetArgs 64 { 65 Object [] cc; 66 Object [] cw; 67 Object [] wc; 68 Object [] ww; 69 SetGetArgs() 70 { 71 cc = new Object [2]; 72 cw = new Object [2]; cw[1]=new ANY(); 73 wc = new Object [2]; wc[0]=new ANY(); 74 ww = new Object [2]; ww[0]=new ANY(); ww[1]=new ANY(); 75 } 76 } 77 78 79 private ThreadLocal threadLocalArgs; 80 81 85 protected void GET_ARGS(){} 86 87 88 private transient SetGetSignaturePattern advicePattern; 89 90 91 static class SetGetThreadLocal extends ThreadLocal implements java.io.Serializable 92 { 93 protected Object initialValue() 94 { 95 return new SetGetArgs(); 96 } 97 }; 98 protected GetCut() 99 { 100 threadLocalArgs = new SetGetThreadLocal(); 101 initState(); 102 } 103 104 private void initState() 105 { 106 if (advicePattern == null) 107 { 108 advicePattern = new SetGetSignaturePattern(this); 109 toStringSignature = advicePattern.toString(); 110 } 111 } 112 113 String toStringSignature = null; 114 public void insertionAction(boolean isBeforeInsertion) 115 { 116 if (isBeforeInsertion) 117 initState(); 118 } 119 120 protected void joinPointAction(FieldAccessJoinPoint ev) 121 { 122 Object [] args = null; 123 SetGetArgs setGetArgs=(SetGetArgs)threadLocalArgs.get(); 124 125 switch (advicePattern.signatureCathegory) 126 { 127 case SignaturePattern.SIGNATURE__EMPTY: break; 129 case SignaturePattern.SIGNATURE__CONCRETE__CONCRETE: 130 args = setGetArgs.cc; 131 args[0]= ev.getTarget(); 132 args[1] = ev.getValue(); 133 break; 134 case SignaturePattern.SIGNATURE__WILDCARD__CONCRETE: 135 args=setGetArgs.wc; 136 ((ANY)args[0]).setObject(ev.getTarget()); 137 args[1]=ev.getValue(); 138 break; 139 case SignaturePattern.SIGNATURE__CONCRETE__WILDCARD: 140 args=setGetArgs.cw; 141 args[0]=ev.getTarget(); 142 ((ANY)args[1]).setObject(ev.getValue()); 143 break; 144 case SignaturePattern.SIGNATURE__WILDCARD__WILDCARD: 145 args=setGetArgs.ww; 146 ((ANY)args[0]).setObject(ev.getTarget()); 147 ((ANY)args[1]).setObject(ev.getValue()); 148 break; 149 default: 150 throw new Error ("Wrong pattern signature in " + this); 151 } 152 try 153 { 154 advicePattern.methodObj.invoke(this,args); 155 } 156 catch (IllegalAccessException e) 157 { 158 throw new RuntimeException (); 159 } 160 catch (java.lang.reflect.InvocationTargetException e) 161 { 162 throw new RuntimeException (); 163 } 164 165 } 166 167 168 174 protected CrosscutRequest doCreateRequest(Class c) 175 throws SecurityException 176 { 177 Field [] declaredFields = null; 180 CrosscutRequest result = new CrosscutRequest(); 181 182 try { declaredFields = c.getDeclaredFields(); } 183 catch (NoClassDefFoundError e) 184 { 185 return result; 186 } 187 for ( int i = 0; i < declaredFields.length; i++ ) 188 { 189 if (advicePattern.matchesOperationOnField(declaredFields[i])) 190 result.add(requestFactory.createJoinPointRequest(FieldAccessJoinPoint.KIND,declaredFields[i])); 191 } 192 193 return result; 194 } 195 196 199 public String toString() 200 { 201 return " Crosscut: 'GetCut' \n" + 202 " Advice:" + toStringSignature + "\n" + 203 " PointCutter: " + getSpecializer() + "\n"; 204 } 205 } 206 207 208 | Popular Tags |