View Javadoc

1   // ========================================================================
2   // Copyright 2007 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // Licensed under the Apache License, Version 2.0 (the "License");
5   // you may not use this file except in compliance with the License.
6   // You may obtain a copy of the License at 
7   // http://www.apache.org/licenses/LICENSE-2.0
8   // Unless required by applicable law or agreed to in writing, software
9   // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
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  /** Main class for cometd demo.
51   * 
52   * @author gregw
53   *
54   */
55  public class CometdDemo
56  {
57      private static int _testHandshakeFailure;
58      
59      /* ------------------------------------------------------------ */
60      /**
61       * @param args
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          // Manually contruct context to avoid hassles with webapp classloaders for now.
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          // SocketConnector connector=new SocketConnector();
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         // Cometd servlet
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         // Demo lazy messages
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         // Demo lazy messages
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 }