View Javadoc

1   package org.mortbay.cometd.ext;
2   
3   import java.util.Map;
4   
5   import org.cometd.Bayeux;
6   import org.cometd.Client;
7   import org.cometd.Extension;
8   import org.cometd.Message;
9   import org.mortbay.cometd.ClientImpl;
10  import org.mortbay.log.Log;
11  import org.mortbay.util.ajax.JSON;
12  
13  public class AcknowledgedMessagesExtension implements Extension
14  {
15      JSON.Literal _replyExt = new JSON.Literal("{\"ack\":\"true\"}");
16      
17      public Message rcv(Client from, Message message)
18      {
19          return message;
20      }
21  
22      public Message rcvMeta(Client from, Message message)
23      {
24          return message;
25      }
26  
27      public Message send(Client from, Message message)
28      {
29          return message;
30      }
31  
32      public Message sendMeta(Client from, Message message)
33      {
34          if (message.getChannel().equals(Bayeux.META_HANDSHAKE) && Boolean.TRUE.equals(message.get(Bayeux.SUCCESSFUL_FIELD)))
35          {
36              Message rcv = message.getAssociated();
37              
38              Map<String, Object> ext = rcv.getExt(false);
39              boolean clientRequestedAcks = ext != null && ext.get("ack") != null;
40  
41              if (clientRequestedAcks && from!=null) {
42                  Log.info("Enabled message acknowledgement for client " + from);
43                  from.addExtension(new AcknowledgedMessagesClientExtension());
44                  ((ClientImpl)from).setDeliverViaMetaConnectOnly(true);
45              }
46              
47              message.put(Bayeux.EXT_FIELD, _replyExt);
48          }
49  
50          return message;
51      }
52  
53  }