1 package demo.ws_rm.common; 2 3 4 import java.util.Iterator ; 5 6 import javax.xml.soap.Name ; 7 import javax.xml.soap.SOAPException ; 8 import javax.xml.soap.SOAPHeader ; 9 import javax.xml.soap.SOAPHeaderElement ; 10 import javax.xml.ws.handler.soap.SOAPMessageContext; 11 12 13 18 public class MessageLossSimulator extends HandlerBase { 19 20 23 private static final int LOSS_FACTOR = 2; 24 private int inboundMessageCount; 25 26 public boolean handleMessage(SOAPMessageContext context) { 27 return continueProcessing(context); 28 } 29 30 public boolean handleFault(SOAPMessageContext context) { 31 return true; 32 } 33 34 37 private synchronized boolean continueProcessing(SOAPMessageContext context) { 38 if (!(isOutbound(context) || isRMOutOfBand(context)) 39 && ++inboundMessageCount % LOSS_FACTOR == 0) { 40 discardWSHeaders(context); 41 System.out.println("*** Discarding current inbound message ***"); 42 return false; 43 } 44 return true; 45 } 46 47 50 protected boolean isRMOutOfBand(SOAPMessageContext context) { 51 String action = getAction(context); 52 return action != null && action.startsWith(WSRM_NAMESPACE_URI); 53 } 54 55 58 private void discardWSHeaders(SOAPMessageContext context) { 59 try { 60 SOAPHeader header = 61 context.getMessage().getSOAPPart().getEnvelope().getHeader(); 62 Iterator headerElements = header.examineAllHeaderElements(); 63 while (headerElements.hasNext()) { 64 SOAPHeaderElement headerElement = 65 (SOAPHeaderElement )headerElements.next(); 66 Name headerName = headerElement.getElementName(); 67 if (WSRM_NAMESPACE_URI.equals(headerName.getURI()) 68 || WSRM_NAMESPACE_URI.equals(headerName.getURI())) { 69 headerElement.detachNode(); 70 } 71 } 72 } catch (SOAPException e) { 73 System.out.println("discard WS headers failed: " + e); 74 } 75 } 76 } 77 | Popular Tags |