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 }