1 package org.objectweb.celtix.bus.ws.rm.soap; 2 3 import java.io.IOException ; 4 import java.math.BigInteger ; 5 import java.util.ArrayList ; 6 import java.util.Collection ; 7 import java.util.Iterator ; 8 import java.util.Set ; 9 10 import javax.xml.namespace.QName ; 11 import javax.xml.soap.MessageFactory ; 12 import javax.xml.soap.Name ; 13 import javax.xml.soap.SOAPEnvelope ; 14 import javax.xml.soap.SOAPException ; 15 import javax.xml.soap.SOAPHeader ; 16 import javax.xml.soap.SOAPHeaderElement ; 17 import javax.xml.soap.SOAPMessage ; 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 SEQ_IDENTIFIER = "http://Business456.com/RM/ABC"; 47 private static final BigInteger MSG1_MESSAGE_NUMBER = BigInteger.ONE; 48 private static final BigInteger 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 { 59 60 RMSoapHandler codec = new RMSoapHandler(); 61 codec.init(null); 62 Set <QName > 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 { 69 70 setUpOutbound(); 71 SOAPMessageContext context = null; 72 RMSoapHandler codec = new RMSoapHandler(); 73 74 76 context = setupOutboundContext(); 77 assertTrue("expected dispatch to proceed", codec.handleMessage(context)); 78 verifyHeaders(context, new String [] {}); 79 codec.close(context); 80 81 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 [] {Names.WSRM_SEQUENCE_NAME}); 90 codec.close(context); 91 92 94 context = setupOutboundContext(); 95 rmps = RMContextUtils.retrieveRMProperties(context, true); 96 97 Collection <SequenceAcknowledgement> acks = new ArrayList <SequenceAcknowledgement>(); 98 acks.add(ack1); 99 rmps.setAcks(acks); 100 assertTrue("expected dispatch to proceed", codec.handleMessage(context)); 101 verifyHeaders(context, new String [] {Names.WSRM_SEQUENCE_ACK_NAME}); 102 103 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 [] {Names.WSRM_SEQUENCE_ACK_NAME, Names.WSRM_SEQUENCE_ACK_NAME}); 112 113 115 context = setupOutboundContext(); 116 rmps = RMContextUtils.retrieveRMProperties(context, true); 117 118 Collection <AckRequestedType> requested = new ArrayList <AckRequestedType>(); 119 requested.add(ar1); 120 rmps.setAcksRequested(requested); 121 assertTrue("expected dispatch to proceed", codec.handleMessage(context)); 122 verifyHeaders(context, new String [] {Names.WSRM_ACK_REQUESTED_NAME}); 123 124 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 [] {Names.WSRM_ACK_REQUESTED_NAME, Names.WSRM_ACK_REQUESTED_NAME}); 133 } 134 135 public void testInboundSequence() throws IOException { 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 { 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 <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 { 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 <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 { 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 msgFactory = MessageFactory.newInstance(); 249 SOAPMessage 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 ... names) throws SOAPException { 263 SOAPMessage message = context.getMessage(); 264 SOAPEnvelope env = message.getSOAPPart().getEnvelope(); 265 SOAPHeader header = env.getHeader(); 266 267 269 for (String name : names) { 270 boolean found = false; 271 Iterator headerElements = header.examineAllHeaderElements(); 272 while (headerElements.hasNext()) { 273 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 274 Name headerName = headerElement.getElementName(); 275 String 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 292 Iterator headerElements = header.examineAllHeaderElements(); 293 while (headerElements.hasNext()) { 294 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 295 Name headerName = headerElement.getElementName(); 296 String 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 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 |