1 package org.codehaus.xfire.soap.handler;
2
3 import javax.xml.namespace.QName;
4
5 import org.codehaus.xfire.MessageContext;
6 import org.codehaus.xfire.fault.XFireFault;
7 import org.codehaus.xfire.handler.AbstractHandler;
8 import org.codehaus.xfire.handler.Phase;
9 import org.codehaus.xfire.soap.SoapVersion;
10 import org.codehaus.yom.Element;
11 import org.codehaus.yom.Elements;
12
13 /***
14 * Validates that headers flagged as "mustUnderstand" are understood.
15 *
16 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
17 */
18 public class ValidateHeadersHandler
19 extends AbstractHandler
20 {
21 public String getPhase()
22 {
23 return Phase.PRE_INVOKE;
24 }
25
26 /***
27 * Validates that the mustUnderstand and role headers are processed correctly.
28 *
29 * @param context
30 * @throws XFireFault
31 */
32 public void invoke(MessageContext context)
33 throws Exception
34 {
35 if (context.getInMessage().getHeader() == null)
36 return;
37
38 SoapVersion version = context.getInMessage().getSoapVersion();
39 Elements elements = context.getInMessage().getHeader().getChildElements();
40 for (int i = 0; i < elements.size(); i++)
41 {
42 Element e = elements.get(i);
43 String mustUnderstand = e.getAttributeValue("mustUnderstand",
44 version.getNamespace());
45
46 if (mustUnderstand != null && mustUnderstand.equals("1"))
47 {
48 assertUnderstandsHeader(context, new QName(e.getNamespaceURI(), e.getLocalName()));
49 }
50 }
51 }
52
53 /***
54 * Assert that a service understands a particular header. If not, a fault is thrown.
55 *
56 * @param context
57 * @param name
58 * @throws XFireFault
59 */
60 protected void assertUnderstandsHeader(MessageContext context, QName name)
61 throws XFireFault
62 {
63 if (context.getInPipeline().understands(name))
64 return;
65
66 if (context.getOutPipeline().understands(name))
67 return;
68
69
70
71 throw new XFireFault("Header {" + name.getLocalPart() + "}" + name.getNamespaceURI()
72 + " was not undertsood by the service.", XFireFault.MUST_UNDERSTAND);
73 }
74
75 }