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 SOAP11FaultHandler
17 implements FaultHandler
18 {
19 public static final String NAME = "1.1";
20
21 /***
22 * @see org.codehaus.xfire.fault.FaultHandler#handleFault(java.lang.Exception, org.codehaus.xfire.MessageContext)
23 */
24 public void handleFault( Exception e,
25 MessageContext context )
26 {
27 XFireFault fault = createFault(e);
28
29 XMLOutputFactory factory = XMLOutputFactory.newInstance();
30 XMLStreamWriter writer;
31 try
32 {
33 writer = factory.createXMLStreamWriter( context.getResponseStream() );
34 writer.writeStartDocument();
35 writer.writeStartElement("soap:Envelope");
36 writer.writeAttribute("xmlns:soap", SOAPConstants.SOAP11_ENVELOPE_NS);
37
38 writer.writeStartElement("soap:Body");
39 writer.writeStartElement("soap:Fault");
40
41 writer.writeStartElement("faultcode");
42
43 String codeString = fault.getCode();
44 if ( codeString.equals( XFireFault.RECEIVER ) )
45 {
46 codeString = "Server";
47 }
48 if ( codeString.equals( XFireFault.SENDER ) )
49 {
50 codeString = "Server";
51 }
52 else if ( codeString.equals( XFireFault.DATA_ENCODING_UNKNOWN ) )
53 {
54 codeString = "Client";
55 }
56
57 writer.writeCharacters( codeString );
58 writer.writeEndElement();
59
60 writer.writeStartElement("faultstring");
61 writer.writeCharacters( fault.getMessage() );
62 writer.writeEndElement();
63
64 writer.writeStartElement("detail");
65 if ( fault.getDetail() != null )
66 {
67 List detail = fault.getDetail();
68
69 }
70 writer.writeEndElement();
71
72 writer.writeEndElement();
73 writer.writeEndElement();
74 writer.writeEndElement();
75 writer.writeEndDocument();
76 }
77 catch (XMLStreamException xe)
78 {
79 throw new XFireRuntimeException("Couldn't create fault.", xe);
80 }
81 }
82
83 /***
84 * @param e
85 * @return
86 */
87 private XFireFault createFault(Exception e)
88 {
89 XFireFault fault = XFireFault.createFault(e);
90
91 return fault;
92 }
93
94 }