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.Set;
19  
20  import org.mortbay.cometd.AbstractBayeux;
21  import org.mortbay.cometd.ClientImpl;
22  import org.mortbay.cometd.MessageImpl;
23  import org.mortbay.cometd.continuation.ContinuationCometdServlet;
24  import org.mortbay.cometd.ext.TimesyncExtension;
25  import org.mortbay.jetty.Server;
26  import org.mortbay.jetty.bio.SocketConnector;
27  import org.mortbay.jetty.handler.ContextHandlerCollection;
28  import org.mortbay.jetty.handler.MovedContextHandler;
29  import org.mortbay.jetty.nio.SelectChannelConnector;
30  import org.mortbay.jetty.security.SslSelectChannelConnector;
31  import org.mortbay.jetty.security.SslSocketConnector;
32  import org.mortbay.jetty.servlet.Context;
33  import org.mortbay.jetty.servlet.ServletHolder;
34  import org.mortbay.resource.Resource;
35  import org.mortbay.resource.ResourceCollection;
36  import org.mortbay.thread.QueuedThreadPool;
37  
38  import org.cometd.Client;
39  import org.cometd.Extension;
40  import org.cometd.Message;
41  
42  
43  /* ------------------------------------------------------------ */
44  /** Main class for cometd demo.
45   * 
46   * @author gregw
47   *
48   */
49  public class CometdDemo
50  {
51      private static int _testHandshakeFailure;
52      
53      /* ------------------------------------------------------------ */
54      /**
55       * @param args
56       */
57      public static void main(String[] args) throws Exception
58      {
59          int port = args.length==0?8080:Integer.parseInt(args[0]);
60       
61          String base="../../..";
62          
63          // Manually contruct context to avoid hassles with webapp classloaders for now.
64          Server server = new Server();
65          QueuedThreadPool qtp = new QueuedThreadPool();
66          qtp.setMinThreads(5);
67          qtp.setMaxThreads(200);
68          server.setThreadPool(qtp);
69          
70          SelectChannelConnector connector=new SelectChannelConnector();
71          // SocketConnector connector=new SocketConnector();
72          connector.setPort(port);
73          server.addConnector(connector);
74          SocketConnector bconnector=new SocketConnector();
75          bconnector.setPort(port+1);
76          server.addConnector(bconnector);
77          
78          SslSelectChannelConnector connector2=new SslSelectChannelConnector();
79          // SslSocketConnector connector2=new SslSocketConnector();
80          connector2.setPort(port-80+443);
81          connector2.setKeystore(base+"/etc/keystore");
82          connector2.setPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
83          connector2.setKeyPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
84          connector2.setTruststore(base+"/etc/keystore");
85          connector2.setTrustPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
86          server.addConnector(connector2);  
87  
88          ContextHandlerCollection contexts = new ContextHandlerCollection();
89          server.setHandler(contexts);
90          
91          MovedContextHandler moved = new MovedContextHandler(contexts,"/","/cometd");
92          moved.setDiscardPathInfo(true);
93          
94          Context context = new Context(contexts,"/cometd",Context.NO_SECURITY|Context.SESSIONS);
95          
96          context.setBaseResource(new ResourceCollection(new Resource[]
97          {
98              Resource.newResource("./src/main/webapp/"),
99              Resource.newResource("./target/cometd-demo-6.1-SNAPSHOT/"),
100         }));
101         
102         // Demo bayeux session manager
103         // context.getSessionHandler().setSessionManager(new BayeuxSessionManager());
104         // context.addServlet(com.acme.SessionDump.class,"/session");
105         // context.addServlet(com.acme.Dump.class,"/dump");
106         
107         // Cometd servlet
108         ContinuationCometdServlet cometd_servlet=new ContinuationCometdServlet();
109         ServletHolder cometd_holder = new ServletHolder(cometd_servlet);
110         cometd_holder.setInitParameter("filters","/WEB-INF/filters.json");
111         cometd_holder.setInitParameter("timeout","180000");
112         cometd_holder.setInitParameter("interval","100");
113         cometd_holder.setInitParameter("maxInterval","60000");
114         cometd_holder.setInitParameter("multiFrameInterval","5000");
115         cometd_holder.setInitParameter("logLevel","1");
116         
117         context.addServlet(cometd_holder, "/cometd/*");
118         context.addServlet("org.mortbay.jetty.servlet.DefaultServlet", "/");
119         context.addEventListener(new BayeuxServicesListener());
120         
121         server.start();
122         
123         AbstractBayeux bayeux = cometd_servlet.getBayeux();
124         
125         bayeux.setSecurityPolicy(new AbstractBayeux.DefaultPolicy(){
126             public boolean canHandshake(Message message)
127             {
128                 if (_testHandshakeFailure<0)
129                 {
130                     _testHandshakeFailure++;
131                     return false;
132                 }
133                 return true;
134             }    
135         });
136         
137         // Demo lazy messages
138         if (Boolean.getBoolean("LAZY"))
139         {
140             bayeux.addExtension(new Extension()
141             {
142                 public Message rcv(Client from, Message message)
143                 {
144                     if (message.getChannel().startsWith("/chat/") && message.getData()!=null && message.getData().toString().indexOf("lazy")>=0)
145                         ((MessageImpl)message).setLazy(true);
146                     return message;
147                 }
148                 public Message rcvMeta(Client from, Message message)
149                 {
150                     return message;
151                 }
152                 public Message send(Client from, Message message)
153                 {
154                     return message;
155                 }
156                 public Message sendMeta(Client from, Message message)
157                 {
158                     return message;
159                 }
160             });
161         }
162         
163     }
164 }