View Javadoc

1   package org.neo.swarm.core.aop.silc;
2   
3   import java.util.HashMap;
4   import java.util.Iterator;
5   import java.util.LinkedList;
6   import java.util.List;
7   import java.util.Map;
8   
9   import org.neo.swarm.core.aop.Aspect;
10  import org.neo.swarm.core.aop.AspectComponent;
11  import org.neo.swarm.core.aop.AspectContainer;
12  import org.neo.swarm.core.aop.silc.comp.AspectComponentImpl;
13  import org.neo.swarm.core.aop.silc.comp.JavaDynamicProxyFactory;
14  import org.neo.swarm.core.aop.silc.comp.MethodInterceptor;
15  
16  /***
17   * @author damiang
18   */
19  public class SilcAspectContainer implements AspectContainer {
20      private List aspects;
21      private List orthogonal;
22  
23      public SilcAspectContainer() {
24          aspects = new LinkedList();
25          orthogonal = new LinkedList();
26      }
27  
28      public void addApplicationAspect(Aspect aspect) {
29          if (!aspects.contains(aspect)) {
30              aspects.add(aspect);
31          }
32      }
33  
34      public void addOrthogonalAspect(Aspect aspect) {
35          if (!orthogonal.contains(aspect)) {
36              orthogonal.add(aspect);
37          }
38      }
39  
40      public void start() {
41          applyOrthogonalAspects();
42      }
43  
44      public void weave(AspectComponent instance) {    	
45          for (int i = 0; i < aspects.size(); i++) {
46              Aspect aspect = (Aspect) aspects.get(i);
47              aspect.advise(instance);
48          }
49          applyOrthogonalAspects();
50      }
51  
52      private void applyOrthogonalAspects() {
53  		Class[] intf = { MethodInterceptor.class };
54  		Map map = new HashMap(aspects.size());
55  		for (int i = 0; i < orthogonal.size(); i++) {
56  			Aspect aspect = (Aspect) orthogonal.get(i);
57  			adviseAspects(map, intf, aspect);
58  		}
59  		if (map.size() != 0) {
60  			replaceInterceptors(map);
61  		}
62  	}
63  
64      private void replaceInterceptors(Map map) {
65  		for (int i = 0; i < aspects.size(); i++) {
66  			Aspect aspect = (Aspect) aspects.get(i);
67  			AspectComponent ac = (AspectComponent) map.get(aspect);
68  			aspect.replaceInterceptor((MethodInterceptor) ac.getProxy());
69  		}
70  	}
71  
72  	private void adviseAspects(Map map, Class[] intf, Aspect aspect) {
73  		for (Iterator iter = aspects.iterator(); iter.hasNext();) {
74  			Aspect aspectA = (Aspect) iter.next();
75  			AspectComponent ac = retrieveAspectedComponent(map, aspectA, intf);
76  			aspect.advise(ac);
77  		}
78  	}
79  
80  	private AspectComponent retrieveAspectedComponent(Map map, Aspect aspectA, Class[] intf) {
81  		AspectComponent ac = (AspectComponent) map.get(aspectA);
82  		if (ac == null) {
83  			ac = new AspectComponentImpl(aspectA.toString(), intf, aspectA.getInterceptor(), new JavaDynamicProxyFactory());
84  			map.put(aspectA, ac);
85  		}
86  		return ac;
87  	}
88  
89  
90  }