1 27 package ch.ethz.prose.query; 28 29 import ch.ethz.jvmai.JVMAspectInterface; 31 import ch.ethz.prose.AspectManager; 32 import ch.ethz.prose.Aspect; 33 import ch.ethz.prose.crosscut.Crosscut; 34 35 import java.util.List ; 36 import java.util.Vector ; 37 import java.util.Iterator ; 38 import java.util.Comparator ; 39 import java.util.Collections ; 40 import java.util.Set ; 41 import java.util.HashSet ; 42 43 import ch.ethz.prose.engine.ExceptionThrowRequest; 44 import ch.ethz.prose.engine.FieldAccessRequest; 45 import ch.ethz.prose.engine.FieldModificationRequest; 46 import ch.ethz.prose.engine.JoinPointRequest; 47 import ch.ethz.prose.engine.MethodEntryRequest; 48 import ch.ethz.prose.engine.MethodExitRequest; 49 import ch.ethz.prose.engine.JoinPointManager; 50 51 import ch.ethz.jvmai.MethodEntryJoinPoint; 52 import ch.ethz.jvmai.MethodExitJoinPoint; 53 import ch.ethz.jvmai.FieldAccessJoinPoint; 54 import ch.ethz.jvmai.FieldModificationJoinPoint; 55 import ch.ethz.jvmai.ExceptionJoinPoint; 56 57 58 59 65 public class QueryManager 66 { 67 68 69 public static final int SELECT_ASPECT = 0x01; public static final int SELECT_CROSSCUT = 0x02; 71 public static final int SELECT_JOINPOINT = 0x04; 72 public static final int GROUP_BY_ASPECT = 0x01; 73 public static final int GROUP_BY_CROSSCUT = 0x02; 74 public static final int GROUP_BY_JOINPOINT = 0x04; 75 public static final int SELECT_ALL = SELECT_ASPECT | SELECT_CROSSCUT | SELECT_JOINPOINT; 76 77 AspectManager aspectMgr = null; 78 JoinPointManager jpMgr = null; 79 public QueryManager(AspectManager am) 80 { 81 if (am == null) 82 throw new IllegalArgumentException ("QueryManager.init: null am"); 83 aspectMgr = am; 84 jpMgr = am.getJoinPointManager(); 85 } 86 87 112 public List queryAspects(List aspectList, int selectFields, int groupBy) 113 { 114 if (selectFields == 0) 115 return new Vector (); 116 117 HashSet result = new HashSet (); 118 Iterator i = aspectList.iterator(); 119 while (i.hasNext()) 120 { 121 AspectSurrogate as = (AspectSurrogate)i.next(); 122 Aspect crtAspect = reconstructAspect(as); 123 if (crtAspect != null) 124 { 125 Iterator j = crtAspect.getCrosscuts().iterator(); 126 if (!j.hasNext()) result.add(createTuple(as,null,null,selectFields)); 127 while (j.hasNext()) 128 { 129 Crosscut crtCrosscut = (Crosscut)j.next(); 130 Iterator k = jpMgr.getJoinpoints(crtCrosscut).iterator(); 131 CrosscutSurrogate cs = new CrosscutSurrogate(as,crtCrosscut); 132 if (!k.hasNext()) result.add(createTuple(as,cs,null,selectFields)); 133 while (k.hasNext()) 134 { 135 JoinPointRequest crtJpr = (JoinPointRequest)k.next(); 136 result.add(createTuple(as,cs,crtJpr,selectFields)); 137 } 138 139 } 140 } 141 } 142 return sortTupleList(new Vector (result),groupBy); 143 } 144 145 public List queryCrosscuts(List crosscutList, int selectFields, int groupBy) 146 { 147 if (selectFields == 0) 148 return new Vector (); 149 150 HashSet result = new HashSet (); 151 Iterator i = crosscutList.iterator(); 152 while (i.hasNext()) 153 { 154 try 155 { 156 CrosscutSurrogate cs = (CrosscutSurrogate)i.next(); 157 AspectSurrogate as = cs.getOwnerSurrogate(); 158 159 Crosscut crtCrosscut = reconstructCrosscut(cs); 160 Iterator k = jpMgr.getJoinpoints(crtCrosscut).iterator(); 161 if (!k.hasNext()) result.add(createTuple(as,cs,null,selectFields)); 162 while (k.hasNext()) 163 { 164 JoinPointRequest crtJpr = (JoinPointRequest)k.next(); 165 result.add(createTuple(as,cs,crtJpr,selectFields)); 166 } 167 } 168 catch (ClassNotFoundException e) 169 { 170 } 176 177 } 178 return sortTupleList(new Vector (result),groupBy); 179 } 180 181 public List queryJoinpoints(List jpList, int selectFields, int groupBy) 182 { 183 if (selectFields == 0) 184 return new Vector (); 185 186 HashSet result = new HashSet (); 187 Iterator i = new HashSet (jpList).iterator(); 188 while (i.hasNext()) 189 { 190 try 191 { 192 JoinPointRequestSurrogate jprs = (JoinPointRequestSurrogate)i.next(); 193 JoinPointRequest jpr = reconstructRequest(jprs); 194 Iterator j = jpMgr.getCrosscuts(jpr).iterator(); 195 while (j.hasNext()) 196 { 197 Crosscut crtCrosscut = (Crosscut)j.next(); 198 Aspect crtAspect = crtCrosscut.getOwner(); 199 result.add(createTuple(crtAspect,crtCrosscut,jprs,selectFields)); 200 } 201 } 202 203 catch (ClassNotFoundException e) 209 {} 210 catch (NoSuchMethodException e) 211 {} 212 catch (NoSuchFieldException e) 213 {} 214 215 } 216 return sortTupleList(new Vector (result),groupBy); 217 } 218 219 220 public List queryAllJoinpoints() 221 { 222 Set jpSur = new HashSet (); 223 Iterator i = jpMgr.allJoinpoints().iterator(); 224 while (i.hasNext()) 225 jpSur.add(new JoinPointRequestSurrogate((JoinPointRequest)i.next())); 226 227 List jpSurList = new Vector (jpSur); 228 return jpSurList; 229 } 230 231 public List queryAllAspects() 232 { 233 Set apSur = new HashSet (); 234 Iterator i = aspectMgr.getAllAspects().iterator(); 235 while (i.hasNext()) 236 apSur.add(new AspectSurrogate((Aspect)i.next())); 237 238 return new Vector (apSur); 239 } 240 241 242 243 private List sortTupleList(List lst, int groupBy) 244 { 245 if (groupBy != 0) 246 Collections.sort(lst,new TupleComparator(groupBy)); 247 248 return lst; 249 } 250 251 static class TupleComparator implements Comparator 252 { 253 int groupBy; 254 TupleComparator(int groupBy) 255 { 256 this.groupBy=groupBy; 257 } 258 259 private int doHashCode(Object o) 260 { 261 if (o == null) 262 return 0; 263 else 264 return o.hashCode(); 265 } 266 267 private int doEquals(Object o1, Object o2) 268 { 269 int compareVal = doHashCode(o1) - doHashCode(o2); 270 if (compareVal != 0) 271 return compareVal; 272 273 if (o1 != null && o1.equals(o2)) 274 return 0; 275 else 276 return 1; 277 } 278 279 280 public int compare(Object o1, Object o2) 281 { 282 int hvalCompare; 283 Tuple t1 = (Tuple)o1; 284 Tuple t2 = (Tuple)o2; 285 switch (groupBy) 286 { 287 case GROUP_BY_ASPECT: 288 hvalCompare = 289 doEquals(t1.getAspectSurrogate(),t2.getAspectSurrogate()); 290 break; 291 case GROUP_BY_JOINPOINT: 292 hvalCompare = 293 doEquals(t1.getRequestSurrogate(),t2.getRequestSurrogate()); 294 break; 295 case GROUP_BY_CROSSCUT: 296 hvalCompare = 297 doEquals(t1.getAspectSurrogate(),t2.getAspectSurrogate()); 298 if (hvalCompare == 0) 299 hvalCompare = doEquals(t1.getCrosscutSurrogate(),t2.getCrosscutSurrogate()); 300 break; 301 default: 302 throw new IllegalArgumentException ("Illegal groupByValue"); 303 } 304 return hvalCompare; 306 } 307 } 308 309 protected Tuple createTuple(AspectSurrogate as, CrosscutSurrogate cs, JoinPointRequest jpr, int selectFields) 310 { 311 Tuple result = new Tuple(); 312 if ( (selectFields & SELECT_ASPECT) != 0 ) 313 result.setAspectSurrogate(as); 314 if ( (selectFields & SELECT_CROSSCUT) != 0 ) 315 result.setCrosscutSurrogate(cs); 316 if ( (selectFields & SELECT_JOINPOINT) != 0) 317 { 318 if (jpr == null) 319 result.setRequestSurrogate(null); 320 else 321 result.setRequestSurrogate(new JoinPointRequestSurrogate(jpr)); 322 } 323 324 return result; 325 } 326 327 protected Tuple createTuple(Aspect a, Crosscut c, JoinPointRequestSurrogate jprs, int selectFields) 328 { 329 Tuple result = new Tuple(); 330 AspectSurrogate as = null; 331 if ( (selectFields & SELECT_ASPECT) != 0 ) 332 { 333 if (a!= null) 334 as = new AspectSurrogate(a); 335 else 336 as = null; 337 result.setAspectSurrogate(as); 338 } 339 340 if ( (selectFields & SELECT_CROSSCUT) != 0 ) 341 { 342 if (as == null) 343 { 344 if (a != null) 345 as = new AspectSurrogate(a); 346 else 347 as = null; 348 } 349 result.setCrosscutSurrogate( new CrosscutSurrogate(as,c)); 350 } 351 352 if ( (selectFields & SELECT_JOINPOINT) != 0) 353 result.setRequestSurrogate(jprs); 354 return result; 355 } 356 357 358 359 360 361 362 public Aspect reconstructAspect(AspectSurrogate as) 363 { 364 List lst = aspectMgr.getAllAspects(); 365 Iterator i = lst.iterator(); 366 while (i.hasNext()) 367 { 368 Aspect crtAsp = (Aspect)(i.next()); 369 if (crtAsp.getAssociatedObject().equals(as.getAssociatedObject()) && 370 crtAsp.getClass().getName().equals(as.getAspectClassName())) 371 return crtAsp; 372 } 373 return null; 374 } 375 376 protected Crosscut reconstructCrosscut(CrosscutSurrogate cs) throws ClassNotFoundException 377 { 378 Aspect a = reconstructAspect(cs.getOwnerSurrogate()); 379 if (a == null) 380 return null; 381 return (Crosscut)a.getCrosscuts().get(cs.getIndex()); 382 } 383 384 385 395 protected JoinPointRequest reconstructRequest(JoinPointRequestSurrogate jprs) 396 throws ClassNotFoundException , NoSuchMethodException , NoSuchFieldException 397 { 398 return jpMgr.createJoinPointRequest(jprs.getKind(),jprs.getMember().toRealInstance()); 399 } 400 401 402 } 403 404 405 | Popular Tags |