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  /**
14   * Acknowledged Messages extension.
15   * 
16   * Installing this extension in a bayeux server allows it to handle 
17   * the ack extension if a client also supports it.
18   * 
19   * The main role of this extension is to install the {@link AcknowledgedMessagesClientExtension}
20   * on the {@link Client} instances created during handshake for clients that
21   * also support the ack extension.
22   *
23   */
24  public class AcknowledgedMessagesExtension implements Extension
25  {
26      JSON.Literal _replyExt = new JSON.Literal("{\"ack\":true}");
27      
28      public Message rcv(Client from, Message message)
29      {
30          return message;
31      }
32  
33      public Message rcvMeta(Client from, Message message)
34      {
35          return message;
36      }
37  
38      public Message send(Client from, Message message)
39      {
40          return message;
41      }
42  
43      public Message sendMeta(Client from, Message message)
44      {
45          if (message.getChannel().equals(Bayeux.META_HANDSHAKE) && Boolean.TRUE.equals(message.get(Bayeux.SUCCESSFUL_FIELD)))
46          {
47              Message rcv = message.getAssociated();
48              
49              Map<String, Object> ext = rcv.getExt(false);
50              boolean clientRequestedAcks = ext != null && ext.get("ack")==Boolean.TRUE;
51  
52              if (clientRequestedAcks && from!=null) {
53                  Log.info("Enabled message acknowledgement for client " + from);
54                  from.addExtension(new AcknowledgedMessagesClientExtension(from));
55                  ((ClientImpl)from).setMetaConnectDeliveryOnly(true);
56              }
57              
58              message.put(Bayeux.EXT_FIELD, _replyExt);
59          }
60  
61          return message;
62      }
63  
64  }