KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > bus > ws > rm > RMDestination


1 package org.objectweb.celtix.bus.ws.rm;
2
3 import java.io.IOException JavaDoc;
4 import java.util.Collection JavaDoc;
5 import java.util.HashMap JavaDoc;
6 import java.util.Map JavaDoc;
7 import java.util.logging.Level JavaDoc;
8 import java.util.logging.Logger JavaDoc;
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 JavaDoc LOG = LogUtils.getL7dLogger(RMDestination.class);
23     private static final String JavaDoc DESTINATION_POLICIES_PROPERTY_NAME = "destinationPolicies";
24   
25     private Map JavaDoc<String JavaDoc, DestinationSequence> map;
26     
27     RMDestination(RMHandler h) {
28         super(h);
29         map = new HashMap JavaDoc<String JavaDoc, 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 JavaDoc<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    /**
78     * Acknowledges receipt of a message. If the message is the last in the sequence,
79     * sends an out-of-band SequenceAcknowledgement unless there a response will be sent
80     * to the acksTo address onto which the acknowldegment can be piggybacked.
81     *
82     * @param sequenceType the sequenceType object that includes identifier and message number
83     * (and possibly a lastMessage element) for the message to be acknowledged)
84     * @param replyToAddress the replyTo address of the message that carried this sequence information
85     * @throws SequenceFault if the sequence specified in <code>sequenceType</code> does not exist
86     */

87     public void acknowledge(SequenceType sequenceType, String JavaDoc 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                 // if we cannot expect an outgoing message to which the acknowledgement
100
// can be added we need to send an out-of-band SequenceAcknowledgement message
101

102                 if (!(seq.getAcksTo().getAddress().getValue().equals(replyToAddress)
103                     || seq.canPiggybackAckOnPartialResponse())) {
104                     try {
105                         getHandler().getProxy().acknowledge(seq);
106                     } catch (IOException JavaDoc 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 JavaDoc<RMDestinationSequence> dss = store.getDestinationSequences(getEndpointId());
121         for (RMDestinationSequence ds : dss) {
122             addSequence((DestinationSequence)ds, false);
123         }
124     }
125 }
126
Popular Tags