1 package org.codehaus.xfire.fault;
2
3 import java.util.List;
4 import javax.xml.stream.XMLOutputFactory;
5 import javax.xml.stream.XMLStreamException;
6 import javax.xml.stream.XMLStreamWriter;
7 import org.codehaus.xfire.MessageContext;
8 import org.codehaus.xfire.SOAPConstants;
9 import org.codehaus.xfire.XFireRuntimeException;
10
11 /***
12 * Creates a fault message based on an exception for SOAP 1.2 messages.
13 *
14 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
15 */
16 public class SOAP12FaultHandler
17 implements FaultHandler
18 {
19 public static final String NAME = "1.2";
20
21 /***
22 * @see org.codehaus.xfire.fault.FaultHandler#handleFault(java.lang.Exception, org.codehaus.xfire.MessageContext)
23 */
24 public void handleFault(Exception e, MessageContext context)
25 {
26 XFireFault fault = createFault(e);
27
28 XMLOutputFactory factory = XMLOutputFactory.newInstance();
29 XMLStreamWriter writer;
30 try
31 {
32 writer = factory.createXMLStreamWriter( context.getResponseStream() );
33 writer.writeStartDocument();
34 writer.writeStartElement("soap:Envelope");
35 writer.writeAttribute("xmlns:soap", SOAPConstants.SOAP12_ENVELOPE_NS);
36
37 writer.writeStartElement("soap:Body");
38 writer.writeStartElement("soap:Fault");
39
40 writer.writeStartElement("soap:Code");
41 writer.writeStartElement("soap:Value");
42 writer.writeCharacters( "soap:" + fault.getCode() );
43 if ( fault.getSubCode() != null )
44 {
45
46 }
47 writer.writeEndElement();
48 writer.writeEndElement();
49
50 writer.writeStartElement("soap:Reason");
51 writer.writeStartElement("soap:Text");
52 writer.writeCharacters(fault.getReason());
53 writer.writeEndElement();
54 writer.writeEndElement();
55
56 writer.writeStartElement("soap:Detail");
57 if ( fault.getDetail() != null )
58 {
59 List detail = fault.getDetail();
60
61 }
62 writer.writeEndElement();
63
64 writer.writeEndElement();
65 writer.writeEndElement();
66 writer.writeEndElement();
67 writer.writeEndDocument();
68 writer.close();
69 }
70 catch (XMLStreamException xe)
71 {
72 throw new XFireRuntimeException("Couldn't create fault.", xe);
73 }
74 }
75
76 /***
77 * @param e
78 * @return
79 */
80 private XFireFault createFault(Exception e)
81 {
82 XFireFault fault = XFireFault.createFault(e);
83
84 return fault;
85 }
86
87 }