1   // ========================================================================
2   // Copyright 2006 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.mortbay.cometd;
16  
17  import java.util.Timer;
18  import java.util.TimerTask;
19  
20  import javax.servlet.ServletContext;
21  
22  import org.mortbay.cometd.AbstractBayeux;
23  import org.mortbay.cometd.ClientImpl;
24  import org.mortbay.thread.Timeout;
25  import org.mortbay.thread.Timeout.Task;
26  
27  /* ------------------------------------------------------------ */
28  /**
29   * Extension of Bayeux that uses {@link SuspendingClient}s.
30   * @author gregw
31   *
32   */
33  public class SuspendingBayeux extends AbstractBayeux
34  {
35      private static int __id;
36      private transient Timer _tick;
37      private transient Timeout _timeout;
38      private long _now;
39      
40      
41      /* ------------------------------------------------------------ */
42      /* (non-Javadoc)
43       * @see org.mortbay.cometd.AbstractBayeux#newClient(java.lang.String, dojox.io.cometd.Destination)
44       */
45      public ClientImpl newRemoteClient()
46      {
47          return new SuspendingClient(this);
48      }
49  
50      /* ------------------------------------------------------------ */
51      /* (non-Javadoc)
52       * @see org.mortbay.cometd.AbstractBayeux#initialize(javax.servlet.ServletContext)
53       */
54      protected void initialize(ServletContext context)
55      {
56          super.initialize(context);
57          
58          _tick=new Timer("SuspendingBayeux-"+__id++, true);
59          _timeout=new Timeout(this);
60          _timeout.setDuration(getMaxInterval());
61      
62          _tick.schedule(new TimerTask()
63          {
64              public void run()
65              {
66                  _timeout.setNow();
67                  _now=_timeout.getNow();
68                  _timeout.tick();
69              }
70          },500L,500L);
71      }
72  
73      /* ------------------------------------------------------------ */
74      long getNow()
75      {
76          return _now;
77      }
78      
79      /* ------------------------------------------------------------ */
80      public void setMaxInterval(long ms)
81      {
82          _timeout.setDuration(ms);
83          super.setMaxInterval(ms);
84      }
85  
86      /* ------------------------------------------------------------ */
87      /* (non-Javadoc)
88       * @see org.mortbay.cometd.AbstractBayeux#initialize(javax.servlet.ServletContext)
89       */
90      public void destroy()
91      {
92          _tick.cancel();
93      }
94  
95      /* ------------------------------------------------------------ */
96      void startTimeout(Task timeout,long delay)
97      {
98          if (delay==0)
99              _timeout.schedule(timeout);
100         else
101             _timeout.schedule(timeout,delay);
102     }
103 
104     /* ------------------------------------------------------------ */
105     public void cancelTimeout(Task timeout)
106     {
107         if (timeout!=null)
108             timeout.cancel();
109     }
110     
111 }