KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > demo > ws_rm > common > MessageLossSimulator


1 package demo.ws_rm.common;
2
3
4 import java.util.Iterator JavaDoc;
5
6 import javax.xml.soap.Name JavaDoc;
7 import javax.xml.soap.SOAPException JavaDoc;
8 import javax.xml.soap.SOAPHeader JavaDoc;
9 import javax.xml.soap.SOAPHeaderElement JavaDoc;
10 import javax.xml.ws.handler.soap.SOAPMessageContext;
11
12
13 /**
14  * Discards a protion of inbound application-level messages to simulate
15  * message loss. Note that out-of-band WS-RM protocol messages are always
16  * left intact.
17  */

18 public class MessageLossSimulator extends HandlerBase {
19
20     /**
21      * Discard every second message
22      */

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     /**
35      * @return true if the current message should not be discarded
36      */

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     /**
48      * @return true if this is a WS-RM out-of-band protocol message
49      */

50     protected boolean isRMOutOfBand(SOAPMessageContext context) {
51         String JavaDoc action = getAction(context);
52         return action != null && action.startsWith(WSRM_NAMESPACE_URI);
53     }
54
55     /**
56      * Discard any WS-* headers from the message
57      */

58     private void discardWSHeaders(SOAPMessageContext context) {
59         try {
60             SOAPHeader JavaDoc header =
61                 context.getMessage().getSOAPPart().getEnvelope().getHeader();
62             Iterator JavaDoc headerElements = header.examineAllHeaderElements();
63             while (headerElements.hasNext()) {
64                 SOAPHeaderElement JavaDoc headerElement =
65                     (SOAPHeaderElement JavaDoc)headerElements.next();
66                 Name JavaDoc 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 JavaDoc e) {
73             System.out.println("discard WS headers failed: " + e);
74         }
75     }
76 }
77
Popular Tags