View Javadoc

1   package org.mortbay.cometd.client.ext;
2   
3   import java.util.Map;
4   
5   import org.cometd.Client;
6   import org.cometd.Extension;
7   import org.cometd.Message;
8   import org.mortbay.util.ajax.JSON;
9   
10  public class TimesyncClientExtension implements Extension
11  {
12      volatile int _lag;
13      volatile int _offset;
14      
15      public Message rcv(Client from, Message message)
16      {
17          return message;
18      }
19  
20      public Message rcvMeta(Client from, Message message)
21      {
22          Map<String,Object> ext=message.getExt(false);
23          if (ext!=null)
24          {
25              Map<String,Object> sync=(Map<String,Object>)ext.get("timesync");
26              if (sync!=null)
27              {
28                  long now = System.currentTimeMillis();
29  
30                  final long tc=((Number)sync.get("tc")).longValue();
31                  final long ts=((Number)sync.get("ts")).longValue();
32                  final int p=((Number)sync.get("p")).intValue();
33                  final int a=((Number)sync.get("a")).intValue();
34  
35                  int l=(int)(now-tc-p)/2-a;
36                  int o=(int)(ts-tc)-l;
37  
38                  _lag=(_lag+l)/2;
39                  _offset=(_offset+o)/2;   
40              }
41          }
42              
43          return message;
44      }
45  
46      public Message send(Client from, Message message)
47      {
48          return message;
49      }
50  
51      public Message sendMeta(Client from, Message message)
52      {
53          Map<String,Object> ext=message.getExt(true);
54          long now = System.currentTimeMillis();
55          JSON.Literal timesync=new JSON.Literal("{\"tc\":"+now+",\"l\":"+_lag+",\"o\":"+_offset+"}");
56          ext.put("timesync",timesync);
57          return message;
58      }
59  
60      public int getOffset()
61      {
62          return _offset;
63      }
64  
65      public int getLag()
66      {
67          return _lag;
68      }
69  
70      public long getServerTime()
71      {
72          return System.currentTimeMillis()+_offset;
73      }
74      
75  }