| 1 18 19 package org.objectweb.jac.core; 20 21 import java.io.FileNotFoundException ; 22 import java.io.Serializable ; 23 import java.lang.reflect.InvocationTargetException ; 24 import java.lang.reflect.Method ; 25 import java.util.Arrays ; 26 import java.util.Collection ; 27 import java.util.HashSet ; 28 import java.util.Iterator ; 29 import java.util.List ; 30 import java.util.Map ; 31 import java.util.Set ; 32 import java.util.Vector ; 33 import org.apache.log4j.Logger; 34 import org.objectweb.jac.core.rtti.*; 35 import org.objectweb.jac.util.WeakHashSet; 36 import org.objectweb.jac.util.WrappedThrowableException; 37 38 54 55 public class AspectComponent 56 implements Serializable , BaseProgramListener 57 { 58 static Logger logger = Logger.getLogger("aspects"); 59 static Logger loggerConf = Logger.getLogger("aspects.config"); 60 static Logger loggerWrap = Logger.getLogger("wrappers"); 61 static Logger loggerWuni = Logger.getLogger("wuni"); 62 static Logger loggerPerf = Logger.getLogger("perf"); 63 64 protected static final boolean SHARED = false; 65 protected static final boolean NOT_SHARED = true; 66 67 protected static final ClassRepository cr = ClassRepository.get(); 68 69 75 76 public static boolean defines(String methodName) { 77 if (ClassRepository.getDirectMethodAccess(AspectComponent.class, 78 methodName )[0] != null) 79 return true; 80 return false; 81 } 82 83 94 95 public void defineTimer(final long period, final MethodItem callback, 96 final Object [] args) { 97 final AspectComponent ac=this; 98 new Thread () { 99 public void run() { 100 while(true) { 101 try { 102 sleep(period); 103 } catch(Exception e) { 104 e.printStackTrace(); 105 } 106 callback.invoke(ac,args); 107 } 108 } 109 }.start(); 110 } 111 112 117 118 120 127 128 public int firstCall = -1; 129 130 134 135 public Class startWeavingType; 136 137 142 public String startWeavingMethod; 143 144 151 public int startWeavingCount; 152 153 159 public int startWeavingCCount; 160 161 167 protected transient WeakHashSet wrappers; 168 169 173 protected boolean systemListener = false; 174 175 183 public void setSystemListener(boolean systemListener) { 184 this.systemListener = systemListener; 185 } 186 187 193 public boolean isSystemListener() { 194 return systemListener; 195 } 196 197 206 public AspectComponent() { 207 logger.debug("New AC: "+this); 208 wrappers = new WeakHashSet(); 209 firstCall = -1; 210 startWeavingType = null; 211 startWeavingMethod = null; 212 startWeavingCount = 0; 213 startWeavingCCount = 0; 214 init(); 215 } 217 218 222 public void init() { 223 loggerWrap.debug("clearing wrappers (was "+wrappers+")"); 225 wrappers.clear(); 226 } 227 228 protected String application=null; 229 230 237 public String getApplication() { 238 return application; 239 } 240 241 250 251 public void setApplication(String application) { 252 this.application = application; 253 } 254 255 264 265 public Collection getWrappers() { 266 return wrappers; 267 } 268 269 282 283 public void addWrapper(Wrapper wrapper) { 284 wrappers.add(wrapper); 285 } 286 287 323 324 public void weave() { 325 Iterator it = ObjectRepository.getMemoryObjects().iterator(); 326 while (it.hasNext()) { 327 simulateUsingNewInstance((Wrappee)it.next()); 328 } 329 } 330 331 394 public void whenUsingNewInstance(Interaction interaction) { 395 ClassItem cli = interaction.getClassItem(); 398 AbstractMethodItem method = interaction.method; 400 401 loggerWuni.debug("whenUsingNewInstance("+interaction+"); pointcuts: "+pointcuts.size()); 402 int i = 0; 403 Iterator it = pointcuts.iterator(); 404 while (it.hasNext()) { 405 loggerWuni.debug(" pointcut "+i++); 406 ((Pointcut)it.next()).applyTo(interaction.wrappee, cli); 407 } 408 } 409 410 public void whenUsingNewClass(ClassItem cli) { 411 Iterator it = pointcuts.iterator(); 412 int i = 0; 413 loggerWuni.debug(this+".whenUsingNewClass"+cli); 414 while (it.hasNext()) { 415 ((Pointcut)it.next()).applyTo(null, cli); 416 } 417 } 418 419 427 428 protected void simulateUsingNewInstance(Wrappee wrappee) { 429 430 Collaboration collab = Collaboration.get(); 432 whenUsingNewInstance(new Interaction(null,wrappee,null,null)); 434 435 } 437 438 452 453 455 469 public void whenRemoteInstantiation(Wrappee newInstance, 470 String name) {} 471 472 483 protected final void unwrapAll() { 484 loggerWrap.debug("unwrap all"); 485 loggerWrap.debug(wrappers.size()+" wrappers: " + wrappers); 486 Iterator it = ObjectRepository.getMemoryObjects().iterator(); 487 while (it.hasNext()) { 488 Object o = it.next(); 489 if (o instanceof Wrappee) { 490 Wrappee wrappee = (Wrappee)o; 491 ClassItem wrappeeClass = cr.getClass(wrappee); 492 loggerWrap.debug("testing wrappee " + wrappee); 493 Wrapping.unwrap(wrappee,wrappeeClass,wrappers); 494 Wrapping.unwrap(null,wrappeeClass,wrappers); 495 } 496 } 497 wrappers.clear(); 498 } 499 500 509 510 public void unweave() { 511 logger.info("--- unweaving "+this+" ---"); 512 long start = System.currentTimeMillis(); 513 unwrapAll(); 514 pointcuts.clear(); 515 loggerPerf.info("unweaved "+this+" in "+(System.currentTimeMillis()-start)+"ms"); 516 } 517 518 521 522 public void whenClone(Wrappee cloned, Wrappee clone) {} 523 524 541 542 public Wrappee whenSerialized(Wrappee orgObject, 543 SerializedJacObject finalObject) { 544 return orgObject; 545 } 546 547 565 566 public Wrappee whenDeserialized(SerializedJacObject orgObject, 567 Wrappee finalObject) { 568 return finalObject; 569 } 570 571 572 public void onExit() {} 573 574 595 public boolean beforeRunningWrapper(Wrapper wrapper, 596 String wrappingMethod) { 597 return true; 598 } 599 600 616 public void afterRunningWrapper(Wrapper wrapper, 617 String wrappingMethod) {} 618 619 622 623 public void afterWrap(Wrappee wrappee, Wrapper wrapper, 624 String [] wrapping_methods, 625 String [][] wrapped_methods) {} 626 627 642 643 public void whenGetObjects(Collection objects, ClassItem cl) {} 644 645 public String whenNameObject(Object object,String name) { 646 return name; 647 } 648 649 public void getNameCounters(Map counters) { 650 } 651 652 public void updateNameCounters(Map counters) { 653 } 654 655 673 674 public void whenObjectMiss(String name) {} 675 676 public void whenDeleted(Wrappee object) {} 677 678 public void whenFree(Wrappee object) {} 679 680 public void afterApplicationStarted() {} 681 682 public void whenCloseDisplay(Display display) {} 683 684 public void whenTopologyChanged() {} 685 686 689 public void whenReload() {} 690 public void beforeReload() {} 691 692 696 697 public void whenConfigured() {} 698 699 702 public void beforeConfiguration() throws Exception { 703 } 704 705 public String getName() { 706 return ACManager.getACM().getName(this); 707 } 708 709 714 public void doRegister() { 715 } 716 717 722 public void doUnregister() { 723 } 724 725 726 Vector pointcuts = new Vector (); 727 728 745 public Pointcut pointcut(String wrappeeExpr, 746 String wrappeeClassExpr, 747 String wrappeeMethodExpr, 748 String wrappingClassName, 749 String exceptionHandler, 750 boolean one2one) { 751 752 MethodPointcut pc = new MethodPointcut( this, 753 wrappeeExpr, 754 wrappeeClassExpr, 755 wrappeeMethodExpr, 756 null, 757 wrappingClassName, 758 null, 759 null, 760 "ALL", 761 exceptionHandler, 762 one2one ); 763 pointcuts.add(pc); 764 return pc; 765 } 766 767 787 public Pointcut pointcut(String wrappeeExpr, 788 String wrappeeClassExpr, 789 String wrappeeMethodExpr, 790 String wrappingClassName, 791 Object [] initParameters, 792 String exceptionHandler, 793 boolean one2One) { 794 795 MethodPointcut pc = new MethodPointcut( this, 796 wrappeeExpr, 797 wrappeeClassExpr, 798 wrappeeMethodExpr, 799 null, 800 wrappingClassName, 801 null, 802 initParameters, 803 "ALL", 804 exceptionHandler, 805 one2One ); 806 pointcuts.add(pc); 807 return pc; 808 } 809 810 830 831 public Pointcut pointcut(String wrappeeExpr, 832 String wrappeeClassExpr, 833 String wrappeeMethodExpr, 834 String wrappingClassName, 835 String hostExpr, 836 String exceptionHandler, 837 boolean one2One) { 838 839 MethodPointcut pc = new MethodPointcut(this, 840 wrappeeExpr, 841 wrappeeClassExpr, 842 wrappeeMethodExpr, 843 null, 844 wrappingClassName, 845 null, 846 null, 847 hostExpr, 848 exceptionHandler, 849 one2One); 850 pointcuts.add(pc); 851 return pc; 852 } 853 854 878 public Pointcut pointcut(String wrappeeExpr, 879 String wrappeeClassExpr, 880 String wrappeeMethodExpr, 881 String wrappingClassName, 882 Object [] initParameters, 883 String hostExpr, 884 String exceptionHandler, 885 boolean one2One) { 886  
|