1 package org.objectweb.celtix.systest.ws.rm; 2 3 import java.io.ByteArrayOutputStream ; 4 import java.util.Iterator ; 5 import java.util.List ; 6 7 import javax.xml.namespace.QName ; 8 import javax.xml.soap.Name ; 9 import javax.xml.soap.SOAPElement ; 10 import javax.xml.soap.SOAPEnvelope ; 11 import javax.xml.soap.SOAPHeader ; 12 import javax.xml.soap.SOAPHeaderElement ; 13 import javax.xml.soap.SOAPMessage ; 14 import javax.xml.ws.handler.LogicalMessageContext; 15 16 import junit.framework.Assert; 17 18 import org.objectweb.celtix.bus.ws.addressing.ContextUtils; 19 import org.objectweb.celtix.bus.ws.rm.Names; 20 import org.objectweb.celtix.bus.ws.rm.RMContextUtils; 21 import org.objectweb.celtix.ws.addressing.AddressingProperties; 22 import org.objectweb.celtix.ws.rm.RMProperties; 23 import org.objectweb.celtix.ws.rm.SequenceAcknowledgement; 24 import org.objectweb.celtix.ws.rm.SequenceType; 25 26 27 public class MessageFlow extends Assert { 28 private List <SOAPMessage > outboundMessages; 29 private List <LogicalMessageContext> inboundContexts; 30 31 public MessageFlow(List <SOAPMessage > o, List <LogicalMessageContext> i) { 32 outboundMessages = o; 33 inboundContexts = i; 34 } 35 36 public List <SOAPMessage > getOutboundMessages() { 37 return outboundMessages; 38 } 39 40 public List <LogicalMessageContext> getInboundContexts() { 41 return inboundContexts; 42 } 43 44 public void clear() { 45 getOutboundMessages().clear(); 46 getInboundContexts().clear(); 47 } 48 49 public void verifyActions(String [] expectedActions, boolean outbound) throws Exception { 50 51 assertEquals(expectedActions.length, outbound ? outboundMessages.size() : inboundContexts.size()); 52 53 for (int i = 0; i < expectedActions.length; i++) { 54 String action = outbound ? getAction(outboundMessages.get(i)) : getAction(inboundContexts.get(i)); 55 if (null == expectedActions[i]) { 56 assertNull((outbound ? "Outbound " : "Inbound") + " message " + i 57 + " has unexpected action: " + action, action); 58 } else { 59 assertEquals((outbound ? "Outbound " : "Inbound") + " message " + i 60 + " does not contain expected action header" 61 + System.getProperty("line.separator"), expectedActions[i], action); 62 } 63 } 64 } 65 66 public boolean checkActions(String [] expectedActions, boolean outbound) throws Exception { 67 68 if (expectedActions.length != (outbound ? outboundMessages.size() : inboundContexts.size())) { 69 return false; 70 } 71 72 for (int i = 0; i < expectedActions.length; i++) { 73 String action = outbound ? getAction(outboundMessages.get(i)) : getAction(inboundContexts.get(i)); 74 if (null == expectedActions[i]) { 75 if (action != null) { 76 return false; 77 } 78 } else { 79 if (!expectedActions[i].equals(action)) { 80 return false; 81 } 82 } 83 } 84 return true; 85 } 86 87 88 public void verifyMessageNumbers(String [] expectedMessageNumbers, boolean outbound) throws Exception { 89 90 assertEquals(expectedMessageNumbers.length, outbound ? outboundMessages.size() 91 : inboundContexts.size()); 92 93 for (int i = 0; i < expectedMessageNumbers.length; i++) { 94 if (outbound) { 95 SOAPElement se = getSequence(outboundMessages.get(i)); 96 if (null == expectedMessageNumbers[i]) { 97 assertNull("Outbound message " + i + " contains unexpected message number ", se); 98 } else { 99 assertEquals("Outbound message " + i + " does not contain expected message number " 100 + expectedMessageNumbers[i], expectedMessageNumbers[i], 101 getMessageNumber(se)); 102 } 103 } else { 104 SequenceType s = getSequence(inboundContexts.get(i)); 105 String messageNumber = null == s ? null : s.getMessageNumber().toString(); 106 if (null == expectedMessageNumbers[i]) { 107 assertNull("Inbound message " + i + " contains unexpected message number ", 108 messageNumber); 109 } else { 110 assertEquals("Inbound message " + i + " does not contain expected message number " 111 + expectedMessageNumbers[i], expectedMessageNumbers[i], messageNumber); 112 } 113 } 114 } 115 } 116 117 public void verifyLastMessage(boolean[] expectedLastMessages, boolean outbound) throws Exception { 118 119 assertEquals(expectedLastMessages.length, outbound ? outboundMessages.size() 120 : inboundContexts.size()); 121 122 for (int i = 0; i < expectedLastMessages.length; i++) { 123 boolean lastMessage; 124 if (outbound) { 125 SOAPElement se = getSequence(outboundMessages.get(i)); 126 lastMessage = null == se ? false : getLastMessage(se); 127 } else { 128 SequenceType s = getSequence(inboundContexts.get(i)); 129 lastMessage = null == s ? false : null != s.getLastMessage(); 130 } 131 assertEquals("Outbound message " + i 132 + (expectedLastMessages[i] ? " does not contain expected last message element." 133 : " contains last message element."), 134 expectedLastMessages[i], lastMessage); 135 136 } 137 } 138 139 public void verifyAcknowledgements(boolean[] expectedAcks, boolean outbound) throws Exception { 140 assertEquals(expectedAcks.length, outbound ? outboundMessages.size() 141 : inboundContexts.size()); 142 143 for (int i = 0; i < expectedAcks.length; i++) { 144 boolean ack = outbound ? (null != getAcknowledgment(outboundMessages.get(i))) 145 : (null != getAcknowledgment(inboundContexts.get(i))); 146 147 if (expectedAcks[i]) { 148 assertTrue((outbound ? "Outbound" : "Inbound") + " message " + i 149 + " does not contain expected acknowledgement", ack); 150 } else { 151 assertFalse((outbound ? "Outbound" : "Inbound") + " message " + i 152 + " contains unexpected acknowledgement", ack); 153 } 154 } 155 } 156 157 public void verifyAckRequestedOutbound() throws Exception { 158 boolean found = false; 159 for (SOAPMessage m : outboundMessages) { 160 SOAPElement se = getAckRequested(m); 161 if (se != null) { 162 found = true; 163 break; 164 } 165 } 166 assertTrue("expected AckRequested", found); 167 } 168 169 public void verifyAckRequestedInbound(List <LogicalMessageContext> contexts) throws Exception { 170 boolean found = false; 171 for (LogicalMessageContext context : contexts) { 172 RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false); 173 if (null != rmps 174 && rmps.getAcksRequested() != null 175 && rmps.getAcksRequested().size() > 0) { 176 found = true; 177 break; 178 } 179 } 180 assertTrue("expected AckRequested", found); 181 } 182 183 protected String getAction(SOAPMessage msg) throws Exception { 184 SOAPEnvelope env = msg.getSOAPPart().getEnvelope(); 185 SOAPHeader header = env.getHeader(); 186 Iterator headerElements = header.examineAllHeaderElements(); 187 while (headerElements.hasNext()) { 188 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 189 Name headerName = headerElement.getElementName(); 190 String localName = headerName.getLocalName(); 191 if ((headerName.getURI().equals(org.objectweb.celtix.bus.ws.addressing.Names.WSA_NAMESPACE_NAME) 192 || headerName.getURI().equals(org.objectweb.celtix.bus.ws.addressing.VersionTransformer 193 .Names200408.WSA_NAMESPACE_NAME)) 194 && localName.equals(org.objectweb.celtix.bus.ws.addressing.Names.WSA_ACTION_NAME)) { 195 return headerElement.getTextContent(); 196 } 197 } 198 return null; 199 } 200 201 protected String getAction(LogicalMessageContext context) { 202 AddressingProperties maps = ContextUtils.retrieveMAPs(context, false, false); 203 if (null != maps && null != maps.getAction()) { 204 return maps.getAction().getValue(); 205 } 206 return null; 207 } 208 209 protected SOAPElement getSequence(SOAPMessage msg) throws Exception { 210 SOAPEnvelope env = msg.getSOAPPart().getEnvelope(); 211 SOAPHeader header = env.getHeader(); 212 Iterator headerElements = header.examineAllHeaderElements(); 213 while (headerElements.hasNext()) { 214 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 215 Name headerName = headerElement.getElementName(); 216 String localName = headerName.getLocalName(); 217 if (headerName.getURI().equals(Names.WSRM_NAMESPACE_NAME) 218 && localName.equals(Names.WSRM_SEQUENCE_NAME)) { 219 return (SOAPElement )header.getChildElements().next(); 220 } 221 } 222 return null; 223 } 224 225 public String getMessageNumber(SOAPElement elem) throws Exception { 226 SOAPElement se = (SOAPElement )elem.getChildElements( 227 new QName (Names.WSRM_NAMESPACE_NAME, 228 "MessageNumber")).next(); 229 return se.getTextContent(); 230 } 231 232 protected SequenceType getSequence(LogicalMessageContext context) { 233 RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false); 234 return rmps == null ? null : rmps.getSequence(); 235 } 236 237 private boolean getLastMessage(SOAPElement elem) throws Exception { 238 return elem.getChildElements(new QName (Names.WSRM_NAMESPACE_NAME, "LastMessage")).hasNext(); 239 } 240 241 protected SOAPElement getAcknowledgment(SOAPMessage msg) throws Exception { 242 SOAPEnvelope env = msg.getSOAPPart().getEnvelope(); 243 SOAPHeader header = env.getHeader(); 244 Iterator headerElements = header.examineAllHeaderElements(); 245 while (headerElements.hasNext()) { 246 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 247 Name headerName = headerElement.getElementName(); 248 String localName = headerName.getLocalName(); 249 if (headerName.getURI().equals(Names.WSRM_NAMESPACE_NAME) 250 && localName.equals(Names.WSRM_SEQUENCE_ACK_NAME)) { 251 return (SOAPElement )header.getChildElements().next(); 252 } 253 } 254 return null; 255 } 256 257 protected SequenceAcknowledgement getAcknowledgment(LogicalMessageContext context) { 258 RMProperties rmps = RMContextUtils.retrieveRMProperties(context, false); 259 if (null != rmps && null != rmps.getAcks() && rmps.getAcks().size() > 0) { 260 return rmps.getAcks().iterator().next(); 261 } 262 return null; 263 } 264 265 private SOAPElement getAckRequested(SOAPMessage msg) throws Exception { 266 SOAPEnvelope env = msg.getSOAPPart().getEnvelope(); 267 SOAPHeader header = env.getHeader(); 268 Iterator headerElements = header.examineAllHeaderElements(); 269 while (headerElements.hasNext()) { 270 SOAPHeaderElement headerElement = (SOAPHeaderElement )headerElements.next(); 271 Name headerName = headerElement.getElementName(); 272 String localName = headerName.getLocalName(); 273 if (headerName.getURI().equals(Names.WSRM_NAMESPACE_NAME) 274 && localName.equals(Names.WSRM_ACK_REQUESTED_NAME)) { 275 return (SOAPElement )header.getChildElements().next(); 276 } 277 } 278 return null; 279 } 280 281 public void verifyMessages(int nExpected, boolean outbound) { 282 if (outbound) { 283 assertEquals("Unexpected number of outbound messages" + outboundDump(), 284 nExpected, outboundMessages.size()); 285 } else { 286 assertEquals("Unexpected number of inbound messages", nExpected, inboundContexts.size()); 287 } 288 } 289 290 public void verifyMessages(int nExpected, boolean outbound, int interval, int attempts) { 291 for (int i = 0; i < attempts; i++) { 292 if ((outbound && outboundMessages.size() < nExpected) 293 || (!outbound && inboundContexts.size() < nExpected)) { 294 try { 295 Thread.sleep(1000); 296 } catch (InterruptedException ex) { 297 } 299 } else { 300 break; 301 } 302 } 303 if (outbound) { 304 assertEquals("Did not send the expected number of outbound messages." + outboundDump(), 305 nExpected, outboundMessages.size()); 306 } else { 307 assertEquals("Did not receive the expected number of inbound messages.", 308 nExpected, inboundContexts.size()); 309 } 310 } 311 312 public void purgePartialResponses() { 313 for (int i = inboundContexts.size() - 1; i >= 0; i--) { 314 if (null == getAction(inboundContexts.get(i))) { 315 inboundContexts.remove(i); 316 } 317 } 318 } 319 320 private String outboundDump() { 321 StringBuffer buf = new StringBuffer (); 322 try { 323 buf.append(System.getProperty("line.separator")); 324 for (int i = 0; i < outboundMessages.size(); i++) { 325 SOAPMessage sm = outboundMessages.get(i); 326 buf.append("["); 327 buf.append(i); 328 buf.append("] : "); 329 ByteArrayOutputStream bos = new ByteArrayOutputStream (); 330 sm.writeTo(bos); 331 buf.append(bos.toString()); 332 buf.append(System.getProperty("line.separator")); 333 } 334 } catch (Exception ex) { 335 return ""; 336 } 337 338 return buf.toString(); 339 } 340 } 341 | Popular Tags |