1 package org.neo.swarm.core.container.pico;
2
3 import java.io.Serializable;
4 import java.util.Collection;
5 import java.util.Iterator;
6 import java.util.LinkedList;
7
8 import org.neo.swarm.core.aop.silc.SilcAspectComponentAdapter;
9 import org.neo.swarm.core.aop.silc.comp.Perspective;
10 import org.neo.swarm.core.container.ComponentContainer;
11 import org.neo.swarm.core.container.CreationType;
12 import org.picocontainer.MutablePicoContainer;
13 import org.picocontainer.defaults.DefaultPicoContainer;
14
15 /***
16 * @author damiang
17 */
18 public class PicoComponentContainer implements ComponentContainer, Serializable {
19 private final transient MutablePicoContainer container;
20 private final transient SilcComponentAdapterFactory componentAdapterFactory;
21
22 public PicoComponentContainer(SilcComponentAdapterFactory componentInstantiatorFactory) {
23 this.componentAdapterFactory = componentInstantiatorFactory;
24 container = new DefaultPicoContainer();
25 }
26
27 public void registerComponentInstance(String name, Object object) {
28 container.registerComponent(componentAdapterFactory.createInstanceComponentAdapter(name, object));
29 }
30
31 public void registerComponent(Object key, Class impl, CreationType creationType) {
32 if (CreationType.MULTI == creationType) {
33 container.registerComponent(componentAdapterFactory.createConstructorComponentAdapter(key, impl));
34 } else {
35 container.registerComponent(componentAdapterFactory.createCachingComponentAdapter(key, impl));
36 }
37 }
38
39 public void registerComponent(Object key, Class impl, Object[] args, CreationType creationType) {
40 if (CreationType.MULTI == creationType) {
41 container.registerComponent(componentAdapterFactory.createConstructorComponentAdapter(key, impl, args));
42 } else {
43 container.registerComponent(componentAdapterFactory.createCachingComponentAdapter(key, impl, args));
44 }
45 }
46
47 public Collection getComponentsOfType(Class type) {
48 return getComponentsOfType(Perspective.DEFAULT, type);
49 }
50
51 public Collection getComponentsOfType(Perspective perspective, Class type) {
52 Collection c = container.getComponentAdapters();
53 Collection componentList = new LinkedList();
54 for (Iterator iter = c.iterator(); iter.hasNext();) {
55 SilcAspectComponentAdapter adapter = (SilcAspectComponentAdapter) iter.next();
56 if (type.isAssignableFrom(adapter.getComponentImplementation())) {
57 componentList.add(adapter.getComponentInstance(perspective));
58 }
59 }
60 return componentList;
61 }
62
63 public Object getComponent(Object key) {
64 return container.getComponentInstance(key);
65 }
66
67 public void removeComponent(Object key) {
68 container.unregisterComponent(key);
69 }
70
71 public Object getComponent(Perspective perspective, Object key) {
72 SilcAspectComponentAdapter adapter = (SilcAspectComponentAdapter) container.getComponentAdapter(key);
73
74 if (adapter == null) return null;
75 return adapter.getComponentInstance(perspective);
76 }
77
78 public void stop() {
79 container.stop();
80 }
81
82 public void start() {
83 container.start();
84 }
85 }