1 package org.codehaus.xfire.fault;
2
3 import java.util.Iterator;
4 import java.util.Map;
5
6 import javax.xml.stream.XMLOutputFactory;
7 import javax.xml.stream.XMLStreamException;
8 import javax.xml.stream.XMLStreamWriter;
9
10 import org.codehaus.xfire.MessageContext;
11 import org.codehaus.xfire.SOAPConstants;
12 import org.codehaus.xfire.XFireRuntimeException;
13 import org.codehaus.xfire.util.DOMStreamWriter;
14 import org.w3c.dom.Element;
15 import org.w3c.dom.Node;
16 import org.w3c.dom.NodeList;
17
18 /***
19 * Creates a fault message based on an exception for SOAP 1.2 messages.
20 *
21 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22 */
23 public class SOAP12FaultHandler
24 implements FaultHandler
25 {
26 public static final String NAME = "1.2";
27
28 /***
29 * @see org.codehaus.xfire.fault.FaultHandler#handleFault(java.lang.Exception, org.codehaus.xfire.MessageContext)
30 */
31 public void handleFault(Exception e, MessageContext context)
32 {
33 XFireFault fault = createFault(e);
34
35 XMLOutputFactory factory = XMLOutputFactory.newInstance();
36 XMLStreamWriter writer;
37 try
38 {
39 writer = factory.createXMLStreamWriter( context.getResponseStream() );
40 writer.writeStartDocument();
41 writer.writeStartElement("soap:Envelope");
42 writer.writeAttribute("xmlns:soap", SOAPConstants.SOAP12_ENVELOPE_NS);
43
44 Map namespaces = fault.getNamespaces();
45 for ( Iterator itr = namespaces.keySet().iterator(); itr.hasNext(); )
46 {
47 String prefix = (String) itr.next();
48 writer.writeAttribute("xmlns:"+prefix, (String) namespaces.get(prefix));
49 }
50
51 writer.writeStartElement("soap:Body");
52 writer.writeStartElement("soap:Fault");
53
54 writer.writeStartElement("soap:Code");
55
56 writer.writeStartElement("soap:Value");
57 writer.writeCharacters( "soap:" + fault.getCode() );
58 writer.writeEndElement();
59
60 if ( fault.getSubCode() != null )
61 {
62 writer.writeStartElement("soap:SubCode");
63 writer.writeStartElement("soap:Value");
64 writer.writeCharacters( fault.getSubCode() );
65 writer.writeEndElement();
66 writer.writeEndElement();
67 }
68
69 writer.writeEndElement();
70
71 writer.writeStartElement("soap:Reason");
72 writer.writeStartElement("soap:Text");
73 writer.writeCharacters(fault.getReason());
74 writer.writeEndElement();
75 writer.writeEndElement();
76
77 if ( fault.hasDetails() )
78 {
79 Element details = fault.getDetailElement();
80
81 writer.writeStartElement("soap:Detail");
82
83 NodeList children = details.getChildNodes();
84 for ( int i = 0; i < children.getLength(); i++ )
85 {
86 Node n = children.item(i);
87 if ( n instanceof Element )
88 {
89 DOMStreamWriter.writeElement((Element)n, writer);
90 }
91 }
92
93 writer.writeEndElement();
94 }
95
96 writer.writeEndElement();
97 writer.writeEndElement();
98 writer.writeEndElement();
99 writer.writeEndDocument();
100 writer.close();
101 }
102 catch (XMLStreamException xe)
103 {
104 throw new XFireRuntimeException("Couldn't create fault.", xe);
105 }
106 }
107
108 /***
109 * @param e
110 * @return
111 */
112 private XFireFault createFault(Exception e)
113 {
114 XFireFault fault = XFireFault.createFault(e);
115
116 return fault;
117 }
118
119 }