1 package org.objectweb.celtix.bus.ws.rm; 2 3 import java.io.IOException ; 4 import java.util.Collection ; 5 import java.util.HashMap ; 6 import java.util.Map ; 7 import java.util.logging.Level ; 8 import java.util.logging.Logger ; 9 10 import org.objectweb.celtix.bus.configuration.wsrm.AcksPolicyType; 11 import org.objectweb.celtix.bus.configuration.wsrm.DestinationPolicyType; 12 import org.objectweb.celtix.common.i18n.Message; 13 import org.objectweb.celtix.common.logging.LogUtils; 14 import org.objectweb.celtix.ws.rm.Identifier; 15 import org.objectweb.celtix.ws.rm.SequenceType; 16 import org.objectweb.celtix.ws.rm.persistence.RMDestinationSequence; 17 import org.objectweb.celtix.ws.rm.persistence.RMStore; 18 import org.objectweb.celtix.ws.rm.wsdl.SequenceFault; 19 20 public class RMDestination extends RMEndpoint { 21 22 private static final Logger LOG = LogUtils.getL7dLogger(RMDestination.class); 23 private static final String DESTINATION_POLICIES_PROPERTY_NAME = "destinationPolicies"; 24 25 private Map <String , DestinationSequence> map; 26 27 RMDestination(RMHandler h) { 28 super(h); 29 map = new HashMap <String , DestinationSequence>(); 30 } 31 32 public DestinationSequence getSequence(Identifier id) { 33 return map.get(id.getValue()); 34 } 35 36 public void addSequence(DestinationSequence seq) { 37 addSequence(seq, true); 38 } 39 40 public void addSequence(DestinationSequence seq, boolean persist) { 41 seq.setDestination(this); 42 map.put(seq.getIdentifier().getValue(), seq); 43 if (persist) { 44 getHandler().getStore().createDestinationSequence(seq); 45 } 46 } 47 48 public void removeSequence(DestinationSequence seq) { 49 map.remove(seq.getIdentifier().getValue()); 50 getHandler().getStore().removeDestinationSequence(seq.getIdentifier()); 51 } 52 53 public Collection <DestinationSequence> getAllSequences() { 54 return map.values(); 55 } 56 57 public DestinationPolicyType getDestinationPolicies() { 58 DestinationPolicyType dp = getHandler().getConfiguration() 59 .getObject(DestinationPolicyType.class, DESTINATION_POLICIES_PROPERTY_NAME); 60 if (null == dp) { 61 dp = RMUtils.getWSRMConfFactory().createDestinationPolicyType(); 62 } 63 return dp; 64 } 65 66 public AcksPolicyType getAcksPolicy() { 67 DestinationPolicyType dp = getDestinationPolicies(); 68 assert null != dp; 69 AcksPolicyType ap = dp.getAcksPolicy(); 70 if (null == ap) { 71 ap = RMUtils.getWSRMConfFactory().createAcksPolicyType(); 72 } 73 return ap; 74 } 75 76 77 87 public void acknowledge(SequenceType sequenceType, String replyToAddress) 88 throws SequenceFault { 89 DestinationSequence seq = getSequence(sequenceType.getIdentifier()); 90 if (null != seq) { 91 seq.acknowledge(sequenceType.getMessageNumber()); 92 93 if (null != sequenceType.getLastMessage()) { 94 95 seq.setLastMessageNumber(sequenceType.getMessageNumber()); 96 97 seq.scheduleImmediateAcknowledgement(); 98 99 102 if (!(seq.getAcksTo().getAddress().getValue().equals(replyToAddress) 103 || seq.canPiggybackAckOnPartialResponse())) { 104 try { 105 getHandler().getProxy().acknowledge(seq); 106 } catch (IOException ex) { 107 Message msg = new Message("SEQ_ACK_SEND_EXC", LOG, seq); 108 LOG.log(Level.SEVERE, msg.toString(), ex); 109 } 110 } 111 } 112 } else { 113 throw DestinationSequence.createUnknownSequenceFault(sequenceType.getIdentifier()); 114 } 115 } 116 117 void restore() { 118 RMStore store = getHandler().getStore(); 119 120 Collection <RMDestinationSequence> dss = store.getDestinationSequences(getEndpointId()); 121 for (RMDestinationSequence ds : dss) { 122 addSequence((DestinationSequence)ds, false); 123 } 124 } 125 } 126 | Popular Tags |