View Javadoc

1   /*
2    * Created on Feb 3, 2004
3    *
4    */
5   package org.neo.swarm.config;
6   
7   import java.net.InetAddress;
8   import java.net.UnknownHostException;
9   
10  import org.neo.swarm.ApplicationContext;
11  import org.neo.swarm.DefaultSwarmContainer;
12  import org.neo.swarm.SwarmApplicationContext;
13  import org.neo.swarm.SwarmContainer;
14  import org.neo.swarm.core.aop.AspectContainer;
15  import org.neo.swarm.core.aop.silc.SilcAspectContainer;
16  import org.neo.swarm.core.container.ComponentContainer;
17  import org.neo.swarm.core.container.pico.PicoComponentContainer;
18  import org.neo.swarm.core.container.pico.SilcComponentAdapterFactory;
19  import org.neo.swarm.core.container.pico.SilcComponentAdapterFactoryImpl;
20  import org.neo.swarm.interceptor.appContext.GetMethodConvertor;
21  import org.neo.swarm.interceptor.logging.JavaLogger;
22  import org.neo.swarm.interceptor.logging.Tracer;
23  import org.neo.swarm.interceptor.tcp.TcpClient;
24  import org.neo.swarm.services.binding.BindingService;
25  import org.neo.swarm.services.binding.DynamicRunnable;
26  import org.neo.swarm.services.multicast.MulticastServer;
27  import org.neo.swarm.services.tcp.ServerCompRouter;
28  import org.neo.swarm.services.tcp.TcpServer;
29  import org.neo.swarm.util.network.multicast.MulticastReader;
30  import org.neo.swarm.util.network.multicast.MulticastSender;
31  import org.neo.swarm.util.network.tcp.ListenCallback;
32  import org.neo.swarm.util.network.tcp.client.TcpSenderFactory;
33  import org.neo.swarm.util.serialize.Serializer;
34  import org.neo.swarm.util.serialize.XMLSerializer;
35  import org.neo.swarm.util.threads.OswegoThreadPool;
36  import org.neo.swarm.util.threads.ThreadPool;
37  
38  import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
39  
40  /***
41   * Provides simple setup of the SwarmContainer.
42   *  @author navery
43   */
44  public class DynamicConfig implements Config {
45  
46  	SwarmContainer container;
47  	InetAddress address;
48  	int myPort;
49  	Serializer serializer;
50  	boolean enableLogging;
51  	InetAddress multicastAddress;
52  	int multicastPort = 5000;
53  	int multicastTimeout = 5 * 1000;
54  	int bindSleepPeriod = 3 * 1000;
55  	int threadPoolSize = 2;
56  	String uri;
57  	
58  	
59  	public DynamicConfig(String uri, InetAddress myAddress, int port, boolean enableLogging) {
60  		
61  		this.uri = uri;
62  		this.address = myAddress;
63  		try {
64  			this.multicastAddress = InetAddress.getByName("225.0.0.1");
65  		} catch (UnknownHostException e) {
66  			e.printStackTrace();
67  		}
68  		this.myPort = port;
69  		
70  		this.serializer = new XMLSerializer();		
71  		this.enableLogging = enableLogging;
72  	}
73  	
74  	/* (non-Javadoc)
75  	 * @see org.neo.swarm.config.Config#setup()
76  	 */
77  	public SwarmContainer setup() throws Exception {
78  		// tricky part cause of cyclic relationship...how can something create itself if it hasnt been created. 
79          SilcAspectContainer serviceAspects = new SilcAspectContainer();
80          SilcAspectContainer appContextAspects = new SilcAspectContainer();
81          SwarmApplicationContext appContexts = createAppContext(appContextAspects);	    
82          container = new DefaultSwarmContainer(appContexts, createAppContext(serviceAspects));
83          container.registerServiceInstance(SwarmContainer.class.toString(), container);
84  
85  		container.addServiceAspect(new Tracer(this.enableLogging));
86  		setupAppContext(container);
87  		setupTcpService((ApplicationContext) appContexts.retrieveComponent(uri));
88  		
89  		return container;
90  	}
91  
92      protected SwarmApplicationContext createAppContext(SilcAspectContainer aspectContainer) {
93          SilcComponentAdapterFactory factory = new SilcComponentAdapterFactoryImpl(aspectContainer);
94          PicoComponentContainer componentContainer = new PicoComponentContainer(factory);
95          SwarmApplicationContext appContext = new SwarmApplicationContext(uri, componentContainer, aspectContainer);
96          return appContext;
97      }
98  
99  	protected void setupAppContext(SwarmContainer container) {
100 		
101 		// Setup the AppContext in the first container
102         AspectContainer aspects = new SilcAspectContainer();
103         ComponentContainer compContainer = createComponentContainer(aspects);
104 		container.registerServiceComponent(uri, SwarmApplicationContext.class, new Object [] {uri, compContainer, aspects});
105 		ApplicationContext ac = (ApplicationContext) container.lookupService(uri);
106 		container.registerAppContext(uri, ac);
107         ac.addPreConstructedComponent(uri, ac);
108 
109 		// Setup a RemotePerspective and Aspects for the AppContext
110 		ac.addAspect(new JavaLogger(this.enableLogging));
111 	//	ac.addAspect(new RemoteTracer());
112 		ac.addAspect(new GetMethodConvertor());
113 		ac.addAspect(new TcpClient(this.address, this.myPort, new TcpSenderFactory(), this.serializer));
114 		ac.addPreConstructedComponent("container", container);
115 	}
116 
117     private ComponentContainer createComponentContainer(AspectContainer aspects) {
118         return new PicoComponentContainer(new SilcComponentAdapterFactoryImpl(aspects));
119     }
120 
121 	protected void setupTcpService(ApplicationContext context) throws Exception  {
122     	container.registerServiceComponent("threadpool", OswegoThreadPool.class, new Object[] { new PooledExecutor(), new Integer(1), new Integer(this.threadPoolSize)});
123 		container.registerServiceComponent("scr", ServerCompRouter.class, new Object [] {context, this.serializer});
124 		container.registerServiceComponent("tcpServer", TcpServer.class, new Object [] { this.address, new Integer(myPort), container.lookupService("scr"), container.lookupService("threadpool")} );
125 
126         DynamicRunnable dr = new DynamicRunnable((ApplicationContext) container.getComponent(uri), new MulticastSender(this.multicastAddress, this.multicastPort, false), this.serializer, this.bindSleepPeriod);
127 		BindingService dynamicBinding = new BindingService("BindingService", dr, (ThreadPool) container.lookupService("threadpool")); 
128         container.registerServiceInstance("dynamicBinding", dynamicBinding);
129         
130         MulticastServer mcastServer = new MulticastServer(new MulticastReader(this.multicastAddress, this.multicastPort, 10000), (ListenCallback) container.lookupService("scr"), (ThreadPool) container.lookupService("threadpool"));
131         container.registerServiceInstance("mcastServer", mcastServer);
132 	}	
133 }