1
2
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
75
76
77 public SwarmContainer setup() throws Exception {
78
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
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
110 ac.addAspect(new JavaLogger(this.enableLogging));
111
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 }