View Javadoc

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          // failed to locate component
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  }