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 the ack
17   * extension if a client also supports it.
18   * 
19   * The main role of this extension is to install the
20   * {@link AcknowledgedMessagesClientExtension} on the {@link Client} instances
21   * created during handshake for clients that 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              {
54                  Log.info("Enabled message acknowledgement for client " + from);
55                  from.addExtension(new AcknowledgedMessagesClientExtension(from));
56                  ((ClientImpl)from).setMetaConnectDeliveryOnly(true);
57              }
58  
59              message.put(Bayeux.EXT_FIELD,_replyExt);
60          }
61  
62          return message;
63      }
64  
65  }