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 }