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
15
16
17
18
19
20
21
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() == null)
46 return message;
47
48 if (message.getChannel().equals(Bayeux.META_HANDSHAKE) && Boolean.TRUE.equals(message.get(Bayeux.SUCCESSFUL_FIELD)))
49 {
50 Message rcv=message.getAssociated();
51
52 Map<String,Object> ext=rcv.getExt(false);
53 boolean clientRequestedAcks=ext != null && ext.get("ack") == Boolean.TRUE;
54
55 if (clientRequestedAcks && from != null)
56 {
57 Log.info("Enabled message acknowledgement for client " + from);
58 from.addExtension(new AcknowledgedMessagesClientExtension(from));
59 ((ClientImpl)from).setMetaConnectDeliveryOnly(true);
60 }
61
62 message.put(Bayeux.EXT_FIELD,_replyExt);
63 }
64
65 return message;
66 }
67
68 }