1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.cometd.demo;
16
17
18 import java.util.Date;
19 import java.util.Set;
20 import java.util.Timer;
21 import java.util.TimerTask;
22
23 import org.mortbay.cometd.AbstractBayeux;
24 import org.mortbay.cometd.ChannelImpl;
25 import org.mortbay.cometd.ClientImpl;
26 import org.mortbay.cometd.MessageImpl;
27 import org.mortbay.cometd.continuation.ContinuationCometdServlet;
28 import org.mortbay.cometd.ext.TimesyncExtension;
29 import org.mortbay.jetty.Server;
30 import org.mortbay.jetty.bio.SocketConnector;
31 import org.mortbay.jetty.handler.ContextHandlerCollection;
32 import org.mortbay.jetty.handler.MovedContextHandler;
33 import org.mortbay.jetty.nio.SelectChannelConnector;
34 import org.mortbay.jetty.security.SslSelectChannelConnector;
35 import org.mortbay.jetty.security.SslSocketConnector;
36 import org.mortbay.jetty.servlet.Context;
37 import org.mortbay.jetty.servlet.DefaultServlet;
38 import org.mortbay.jetty.servlet.ServletHolder;
39 import org.mortbay.resource.Resource;
40 import org.mortbay.resource.ResourceCollection;
41 import org.mortbay.thread.QueuedThreadPool;
42 import org.mortbay.util.ajax.JSON;
43
44 import org.cometd.Client;
45 import org.cometd.Extension;
46 import org.cometd.Message;
47
48
49
50
51
52
53
54
55 public class CometdDemo
56 {
57 private static int _testHandshakeFailure;
58
59
60
61
62
63 public static void main(String[] args) throws Exception
64 {
65 int port = args.length==0?8080:Integer.parseInt(args[0]);
66
67 String base="../../..";
68
69
70 Server server = new Server();
71 QueuedThreadPool qtp = new QueuedThreadPool();
72 qtp.setMinThreads(5);
73 qtp.setMaxThreads(200);
74 server.setThreadPool(qtp);
75
76 SelectChannelConnector connector=new SelectChannelConnector();
77
78 connector.setPort(port);
79 server.addConnector(connector);
80 SocketConnector bconnector=new SocketConnector();
81 bconnector.setPort(port+1);
82 server.addConnector(bconnector);
83
84
85
86 SslSelectChannelConnector ssl_connector=new SslSelectChannelConnector();
87 ssl_connector.setPort(port-80+443);
88 ssl_connector.setKeystore(base+"/etc/keystore");
89 ssl_connector.setPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
90 ssl_connector.setKeyPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
91 ssl_connector.setTruststore(base+"/etc/keystore");
92 ssl_connector.setTrustPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
93 server.addConnector(ssl_connector);
94
95
96 ContextHandlerCollection contexts = new ContextHandlerCollection();
97 server.setHandler(contexts);
98
99 MovedContextHandler moved = new MovedContextHandler(contexts,"/","/cometd");
100 moved.setDiscardPathInfo(true);
101
102 Context context = new Context(contexts,"/cometd",Context.NO_SECURITY|Context.SESSIONS);
103
104 String version = Server.getVersion();
105 if (Server.UNKNOWN_VERSION.equals(version))
106 version=Server.SNAPSHOT_VERSION;
107 context.setBaseResource(new ResourceCollection(new Resource[]
108 {
109 Resource.newResource("./src/main/webapp/"),
110 Resource.newResource("./target/cometd-demo-"+version+"/"),
111 }));
112
113
114
115
116 ServletHolder dftServlet = context.addServlet(DefaultServlet.class, "/");
117 dftServlet.setInitOrder(1);
118
119 ServletHolder comet = context.addServlet(ContinuationCometdServlet.class, "/cometd/*");
120 comet.setInitParameter("filters","/WEB-INF/filters.json");
121 comet.setInitParameter("timeout","20000");
122 comet.setInitParameter("interval","100");
123 comet.setInitParameter("maxInterval","10000");
124 comet.setInitParameter("multiFrameInterval","5000");
125 comet.setInitParameter("logLevel","0");
126 comet.setInitOrder(2);
127
128
129 ServletHolder demo=context.addServlet(CometdDemoServlet.class, "/demo");
130 demo.setInitOrder(3);
131
132 server.start();
133
134 final AbstractBayeux bayeux = ((ContinuationCometdServlet)comet.getServlet()).getBayeux();
135
136 bayeux.setSecurityPolicy(new AbstractBayeux.DefaultPolicy()
137 {
138 public boolean canHandshake(Message message)
139 {
140 if (_testHandshakeFailure<0)
141 {
142 _testHandshakeFailure++;
143 return false;
144 }
145 return true;
146 }
147 });
148
149
150 if (Boolean.getBoolean("LAZY"))
151 {
152 bayeux.addExtension(new Extension()
153 {
154 public Message rcv(Client from, Message message)
155 {
156 if (message.getChannel().startsWith("/chat/") && message.getData()!=null && message.getData().toString().indexOf("lazy")>=0)
157 ((MessageImpl)message).setLazy(true);
158 return message;
159 }
160 public Message rcvMeta(Client from, Message message)
161 {
162 return message;
163 }
164 public Message send(Client from, Message message)
165 {
166 return message;
167 }
168 public Message sendMeta(Client from, Message message)
169 {
170 return message;
171 }
172 });
173 }
174
175
176 if (Boolean.getBoolean("LAZYCHAT"))
177 {
178 final ChannelImpl chat_demo = (ChannelImpl)bayeux.getChannel("/chat/demo",true);
179 chat_demo.setLazy(true);
180 chat_demo.setPersistent(true);
181
182 Timer timer = new Timer();
183 timer.schedule(new TimerTask()
184 {
185 public void run()
186 {
187 chat_demo.publish(null,new JSON.Literal("{\"user\":\"TICK\",\"chat\":\""+new Date()+"\"}"),null);
188 }
189 },2000,2000);
190 }
191
192 }
193 }