KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > bus > ws > rm > soap > RMSoapHandlerTest


1 package org.objectweb.celtix.bus.ws.rm.soap;
2
3 import java.io.IOException JavaDoc;
4 import java.math.BigInteger JavaDoc;
5 import java.util.ArrayList JavaDoc;
6 import java.util.Collection JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.Set JavaDoc;
9
10 import javax.xml.namespace.QName JavaDoc;
11 import javax.xml.soap.MessageFactory JavaDoc;
12 import javax.xml.soap.Name JavaDoc;
13 import javax.xml.soap.SOAPEnvelope JavaDoc;
14 import javax.xml.soap.SOAPException JavaDoc;
15 import javax.xml.soap.SOAPHeader JavaDoc;
16 import javax.xml.soap.SOAPHeaderElement JavaDoc;
17 import javax.xml.soap.SOAPMessage JavaDoc;
18 import javax.xml.ws.handler.soap.SOAPMessageContext;
19
20 import static javax.xml.ws.handler.MessageContext.MESSAGE_OUTBOUND_PROPERTY;
21
22 import junit.framework.TestCase;
23
24 import org.objectweb.celtix.bus.bindings.TestInputStreamContext;
25 import org.objectweb.celtix.bus.bindings.soap.SOAPBindingImpl;
26 import org.objectweb.celtix.bus.bindings.soap.W3CConstants;
27 import org.objectweb.celtix.bus.ws.rm.Names;
28 import org.objectweb.celtix.bus.ws.rm.RMContextUtils;
29 import org.objectweb.celtix.bus.ws.rm.RMEndpointTest;
30 import org.objectweb.celtix.bus.ws.rm.RMPropertiesImpl;
31 import org.objectweb.celtix.bus.ws.rm.RMUtils;
32 import org.objectweb.celtix.context.ObjectMessageContext;
33 import org.objectweb.celtix.context.ObjectMessageContextImpl;
34 import org.objectweb.celtix.ws.rm.AckRequestedType;
35 import org.objectweb.celtix.ws.rm.Identifier;
36 import org.objectweb.celtix.ws.rm.RMProperties;
37 import org.objectweb.celtix.ws.rm.SequenceAcknowledgement;
38 import org.objectweb.celtix.ws.rm.SequenceAcknowledgement.AcknowledgementRange;
39 import org.objectweb.celtix.ws.rm.SequenceType;
40
41
42
43
44 public class RMSoapHandlerTest extends TestCase {
45
46     private static final String JavaDoc SEQ_IDENTIFIER = "http://Business456.com/RM/ABC";
47     private static final BigInteger JavaDoc MSG1_MESSAGE_NUMBER = BigInteger.ONE;
48     private static final BigInteger JavaDoc MSG2_MESSAGE_NUMBER = BigInteger.ONE.add(BigInteger.ONE);
49
50     SequenceType s1;
51     SequenceType s2;
52     SequenceAcknowledgement ack1;
53     SequenceAcknowledgement ack2;
54     AckRequestedType ar1;
55     AckRequestedType ar2;
56     SOAPBindingImpl sb = new SOAPBindingImpl(false);
57
58     public void testGetHeaders() throws Exception JavaDoc {
59
60         RMSoapHandler codec = new RMSoapHandler();
61         codec.init(null);
62         Set JavaDoc<QName JavaDoc> headers = codec.getHeaders();
63         assertTrue("expected Sequence header", headers.contains(Names.WSRM_SEQUENCE_QNAME));
64         assertTrue("expected SequenceAcknowledgment header", headers.contains(Names.WSRM_SEQUENCE_ACK_QNAME));
65         assertTrue("expected AckRequested header", headers.contains(Names.WSRM_ACK_REQUESTED_QNAME));
66     }
67
68     public void testOutbound() throws Exception JavaDoc {
69
70         setUpOutbound();
71         SOAPMessageContext context = null;
72         RMSoapHandler codec = new RMSoapHandler();
73
74         // no RM headers
75

76         context = setupOutboundContext();
77         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
78         verifyHeaders(context, new String JavaDoc[] {});
79         codec.close(context);
80
81         // one sequence header
82

83         context = setupOutboundContext();
84         
85         RMProperties rmps = RMContextUtils.retrieveRMProperties(context, true);
86         rmps.setSequence(s1);
87         
88         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
89         verifyHeaders(context, new String JavaDoc[] {Names.WSRM_SEQUENCE_NAME});
90         codec.close(context);
91
92         // one acknowledgment header
93

94         context = setupOutboundContext();
95         rmps = RMContextUtils.retrieveRMProperties(context, true);
96         
97         Collection JavaDoc<SequenceAcknowledgement> acks = new ArrayList JavaDoc<SequenceAcknowledgement>();
98         acks.add(ack1);
99         rmps.setAcks(acks);
100         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
101         verifyHeaders(context, new String JavaDoc[] {Names.WSRM_SEQUENCE_ACK_NAME});
102
103         // two acknowledgment headers
104

105         context = setupOutboundContext();
106         rmps = RMContextUtils.retrieveRMProperties(context, true);
107         
108         acks.add(ack2);
109         rmps.setAcks(acks);
110         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
111         verifyHeaders(context, new String JavaDoc[] {Names.WSRM_SEQUENCE_ACK_NAME, Names.WSRM_SEQUENCE_ACK_NAME});
112
113         // one ack requested header
114

115         context = setupOutboundContext();
116         rmps = RMContextUtils.retrieveRMProperties(context, true);
117         
118         Collection JavaDoc<AckRequestedType> requested = new ArrayList JavaDoc<AckRequestedType>();
119         requested.add(ar1);
120         rmps.setAcksRequested(requested);
121         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
122         verifyHeaders(context, new String JavaDoc[] {Names.WSRM_ACK_REQUESTED_NAME});
123
124         // two ack requested headers
125

126         context = setupOutboundContext();
127         rmps = RMContextUtils.retrieveRMProperties(context, true);
128         
129         requested.add(ar2);
130         rmps.setAcksRequested(requested);
131         assertTrue("expected dispatch to proceed", codec.handleMessage(context));
132         verifyHeaders(context, new String JavaDoc[] {Names.WSRM_ACK_REQUESTED_NAME, Names.WSRM_ACK_REQUESTED_NAME});
133     }
134
135     public void testInboundSequence() throws IOException JavaDoc {
136         RMSoapHandler codec = new RMSoapHandler();
137         TestInputStreamContext istreamCtx = new TestInputStreamContext();
138         istreamCtx.setInputStream(RMEndpointTest.class
139             .getResourceAsStream("resources/spec/Message1.xml"));
140         sb = new SOAPBindingImpl(false);
141         ObjectMessageContext objectCtx = new ObjectMessageContextImpl();
142         SOAPMessageContext context = (SOAPMessageContext)sb.createBindingMessageContext(objectCtx);
143         sb.read(istreamCtx, context);
144         assertTrue(codec.handleMessage(context));
145         RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false);
146         SequenceType st = rmps.getSequence();
147         assertNotNull(st);
148         assertEquals(st.getIdentifier().getValue(), SEQ_IDENTIFIER);
149         assertEquals(st.getMessageNumber(), MSG1_MESSAGE_NUMBER);
150         
151         assertNull(rmps.getAcks());
152         assertNull(rmps.getAcksRequested());
153
154     }
155
156     public void testInboundAcknowledgements() throws IOException JavaDoc {
157         RMSoapHandler codec = new RMSoapHandler();
158         TestInputStreamContext istreamCtx = new TestInputStreamContext();
159         istreamCtx.setInputStream(RMEndpointTest.class
160             .getResourceAsStream("resources/spec/Acknowledgment.xml"));
161         sb = new SOAPBindingImpl(false);
162         ObjectMessageContext objectCtx = new ObjectMessageContextImpl();
163         SOAPMessageContext context = (SOAPMessageContext)sb.createBindingMessageContext(objectCtx);
164         sb.read(istreamCtx, context);
165         
166         assertTrue(codec.handleMessage(context));
167         RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false);
168         Collection JavaDoc<SequenceAcknowledgement> acks = rmps.getAcks();
169         assertNotNull(acks);
170         assertEquals(1, acks.size());
171         SequenceAcknowledgement ack = acks.iterator().next();
172         assertNotNull(ack);
173         assertEquals(ack.getIdentifier().getValue(), SEQ_IDENTIFIER);
174         assertEquals(2, ack.getAcknowledgementRange().size());
175         assertNull(rmps.getSequence());
176         assertNull(rmps.getAcksRequested());
177     }
178
179     public void testInboundAcksRequested() throws IOException JavaDoc {
180         RMSoapHandler codec = new RMSoapHandler();
181         TestInputStreamContext istreamCtx = new TestInputStreamContext();
182         istreamCtx.setInputStream(RMEndpointTest.class
183             .getResourceAsStream("resources/spec/Retransmission.xml"));
184         sb = new SOAPBindingImpl(false);
185         ObjectMessageContext objectCtx = new ObjectMessageContextImpl();
186         SOAPMessageContext context = (SOAPMessageContext)sb.createBindingMessageContext(objectCtx);
187         sb.read(istreamCtx, context);
188         
189         assertTrue(codec.handleMessage(context));
190         RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false);
191         Collection JavaDoc<AckRequestedType> requested = rmps.getAcksRequested();
192         assertNotNull(requested);
193         assertEquals(1, requested.size());
194         AckRequestedType ar = requested.iterator().next();
195         assertNotNull(ar);
196         assertEquals(ar.getIdentifier().getValue(), SEQ_IDENTIFIER);
197
198         SequenceType s = rmps.getSequence();
199         assertNotNull(s);
200         assertEquals(s.getIdentifier().getValue(), SEQ_IDENTIFIER);
201         assertEquals(s.getMessageNumber(), MSG2_MESSAGE_NUMBER);
202
203         assertNull(rmps.getAcks());
204     }
205
206     private void setUpOutbound() {
207         org.objectweb.celtix.ws.rm.ObjectFactory factory = RMUtils.getWSRMFactory();
208         s1 = factory.createSequenceType();
209         Identifier sid = factory.createIdentifier();
210         sid.setValue("sequence1");
211         s1.setIdentifier(sid);
212         s1.setMessageNumber(BigInteger.ONE);
213         s2 = factory.createSequenceType();
214         sid = factory.createIdentifier();
215         sid.setValue("sequence2");
216         s2.setIdentifier(sid);
217         s2.setMessageNumber(BigInteger.TEN);
218
219         ack1 = factory.createSequenceAcknowledgement();
220         AcknowledgementRange r = factory.createSequenceAcknowledgementAcknowledgementRange();
221         r.setLower(BigInteger.ONE);
222         r.setUpper(BigInteger.ONE);
223         ack1.getAcknowledgementRange().add(r);
224         ack1.setIdentifier(s1.getIdentifier());
225
226         ack2 = factory.createSequenceAcknowledgement();
227         r = factory.createSequenceAcknowledgementAcknowledgementRange();
228         r.setLower(BigInteger.ONE);
229         r.setUpper(BigInteger.TEN);
230         ack2.getAcknowledgementRange().add(r);
231         ack2.setIdentifier(s2.getIdentifier());
232
233         ar1 = factory.createAckRequestedType();
234         ar1.setIdentifier(s1.getIdentifier());
235
236         ar2 = factory.createAckRequestedType();
237         ar2.setIdentifier(s2.getIdentifier());
238
239         sb = new SOAPBindingImpl(false);
240     }
241
242     private SOAPMessageContext setupOutboundContext() throws Exception JavaDoc {
243         ObjectMessageContext objectCtx = new ObjectMessageContextImpl();
244         objectCtx.put(ObjectMessageContext.MESSAGE_INPUT, Boolean.FALSE);
245         objectCtx.put(MESSAGE_OUTBOUND_PROPERTY, Boolean.TRUE);
246         SOAPMessageContext context = (SOAPMessageContext)sb.createBindingMessageContext(objectCtx);
247
248         MessageFactory JavaDoc msgFactory = MessageFactory.newInstance();
249         SOAPMessage JavaDoc msg = msgFactory.createMessage();
250         msg.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
251         msg.getSOAPPart().getEnvelope().addNamespaceDeclaration(W3CConstants.NP_SCHEMA_XSD,
252                                                                 W3CConstants.NU_SCHEMA_XSD);
253         msg.getSOAPPart().getEnvelope().addNamespaceDeclaration(W3CConstants.NP_SCHEMA_XSI,
254                                                                 W3CConstants.NU_SCHEMA_XSI);
255         context.setMessage(msg);
256         
257         RMPropertiesImpl rmps = new RMPropertiesImpl();
258         RMContextUtils.storeRMProperties(context, rmps, true);
259         return context;
260     }
261
262     private void verifyHeaders(SOAPMessageContext context, String JavaDoc... names) throws SOAPException JavaDoc {
263         SOAPMessage JavaDoc message = context.getMessage();
264         SOAPEnvelope JavaDoc env = message.getSOAPPart().getEnvelope();
265         SOAPHeader JavaDoc header = env.getHeader();
266
267         // check all expected headers are present
268

269         for (String JavaDoc name : names) {
270             boolean found = false;
271             Iterator JavaDoc headerElements = header.examineAllHeaderElements();
272             while (headerElements.hasNext()) {
273                 SOAPHeaderElement JavaDoc headerElement = (SOAPHeaderElement JavaDoc)headerElements.next();
274                 Name JavaDoc headerName = headerElement.getElementName();
275                 String JavaDoc localName = headerName.getLocalName();
276                 if (headerName.getURI().equals(RMUtils.getRMConstants().getNamespaceURI())
277                     && localName.equals(name)) {
278                     found = true;
279                     break;
280                 } else if (headerName.getURI().equals(
281                     org.objectweb.celtix.bus.ws.addressing.Names.WSA_NAMESPACE_NAME)
282                     && localName.equals(name)) {
283                     found = true;
284                     break;
285                 }
286             }
287             assertTrue("Could not find header element " + name, found);
288         }
289
290         // no other headers should be present
291

292         Iterator JavaDoc headerElements = header.examineAllHeaderElements();
293         while (headerElements.hasNext()) {
294             SOAPHeaderElement JavaDoc headerElement = (SOAPHeaderElement JavaDoc)headerElements.next();
295             Name JavaDoc headerName = headerElement.getElementName();
296             String JavaDoc localName = headerName.getLocalName();
297             assertTrue(RMUtils.getRMConstants().getNamespaceURI().equals(headerName.getURI())
298                 || org.objectweb.celtix.bus.ws.addressing.Names.WSA_NAMESPACE_NAME
299                 .equals(headerName.getURI()));
300             boolean found = false;
301             for (String JavaDoc name : names) {
302                 if (localName.equals(name)) {
303                     found = true;
304                     break;
305                 }
306             }
307             assertTrue("Unexpected header element " + localName, found);
308         }
309     }
310 }
311
Popular Tags