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.FieldModificationRequest; 40 41 42 43 62 public abstract class SetCut extends AbstractCrosscut { 63 64 65 private static class SetGetArgs 66 { 67 68 Object [] cc; 69 Object [] cw; 70 Object [] wc; 71 Object [] ww; 72 SetGetArgs() 73 { 74 cc = new Object [2]; 75 cw = new Object [2]; cw[1]=new ANY(); 76 wc = new Object [2]; wc[0]=new ANY(); 77 ww = new Object [2]; ww[0]=new ANY(); ww[1]=new ANY(); 78 } 79 } 80 81 private ThreadLocal threadLocalArgs; 82 private transient SetGetSignaturePattern advicePattern; 83 84 protected void SET_ARGS() {} 85 86 static class SetGetThreadLocal extends ThreadLocal implements java.io.Serializable 87 { 88 protected Object initialValue() 89 { 90 return new SetGetArgs(); 91 } 92 }; 93 94 protected SetCut() 95 { 96 initState(); 97 threadLocalArgs = new SetGetThreadLocal(); 98 } 99 100 101 102 public void insertionAction(boolean isBeforeInsertion) 103 { 104 if (isBeforeInsertion) 105 initState(); 106 } 107 108 String toStringSignature; 109 private void initState() 110 { 111 if (advicePattern == null) 112 { 113 advicePattern= new SetGetSignaturePattern(this); 114 toStringSignature = advicePattern.toString(); 115 } 116 } 117 118 126 127 128 129 130 132 protected void joinPointAction(FieldModificationJoinPoint ev) 133 { 134 135 Object [] args = null; 136 SetGetArgs setGetArgs=(SetGetArgs)threadLocalArgs.get(); 137 138 switch (advicePattern.signatureCathegory) 139 { 140 case SignaturePattern.SIGNATURE__EMPTY: break; 142 case SignaturePattern.SIGNATURE__CONCRETE__CONCRETE: 143 args = setGetArgs.cc; 144 args[0]= ev.getTarget(); 145 args[1] = ev.getValue(); 146 break; 147 case SignaturePattern.SIGNATURE__WILDCARD__CONCRETE: 148 args=setGetArgs.wc; 149 ((ANY)args[0]).setObject(ev.getTarget()); 150 args[1]=ev.getValue(); 151 break; 152 case SignaturePattern.SIGNATURE__CONCRETE__WILDCARD: 153 args=setGetArgs.cw; 154 args[0]=ev.getTarget(); 155 ((ANY)args[1]).setObject(ev.getValue()); 156 break; 157 case SignaturePattern.SIGNATURE__WILDCARD__WILDCARD: 158 args=setGetArgs.ww; 159 ((ANY)args[0]).setObject(ev.getTarget()); 160 ((ANY)args[1]).setObject(ev.getValue()); 161 break; 162 default: 163 throw new Error ("Wrong pattern signature in " + this); 164 } 165 try 166 { 167 advicePattern.methodObj.invoke(this,args); 168 } 169 catch (IllegalAccessException e) 170 { 171 throw new RuntimeException (); 172 } 173 catch (java.lang.reflect.InvocationTargetException e) 174 { 175 throw new RuntimeException (); 176 } 177 178 } 179 180 181 187 protected CrosscutRequest doCreateRequest(Class c) 188 throws SecurityException 189 { 190 Field [] declaredFields = null; 193 CrosscutRequest result = new CrosscutRequest(); 194 195 try 196 { declaredFields = c.getDeclaredFields(); } 197 catch (NoClassDefFoundError e) 198 { return result; } 199 200 201 for ( int i = 0; i < declaredFields.length; i++ ) 202 { 203 if (advicePattern.matchesOperationOnField(declaredFields[i])) 204 result.add(requestFactory.createJoinPointRequest(FieldModificationJoinPoint.KIND,declaredFields[i])); 205 } 206 207 return result; 208 } 209 210 213 public String toString() 214 { 215 return " Crosscut: 'SetCut' \n" + 216 " Advice:" + toStringSignature + "\n" + 217 " PointCutter: " + getSpecializer() + "\n"; 218 } 219 220 } 221 222 223 | Popular Tags |