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.XFireRuntimeException;
12 import org.codehaus.xfire.soap.Soap11;
13 import org.codehaus.xfire.util.STAXUtils;
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.1 messages.
20 *
21 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22 */
23 public class Soap11FaultHandler
24 extends AbstractFaultHandler
25 {
26 public static final String NAME = "1.1";
27
28 /***
29 * @see org.codehaus.xfire.fault.FaultHandler#handleFault(java.lang.Exception, org.codehaus.xfire.MessageContext)
30 */
31 public void handleFault(XFireFault fault,
32 MessageContext context)
33 {
34 super.handleFault(fault, context);
35
36 XMLOutputFactory factory = XMLOutputFactory.newInstance();
37 XMLStreamWriter writer;
38 try
39 {
40 writer = factory.createXMLStreamWriter( context.getResponseStream() );
41 writer.writeStartDocument();
42 writer.writeStartElement("soap:Envelope");
43 writer.writeAttribute("xmlns:soap", Soap11.getInstance().getNamespace());
44
45 Map namespaces = fault.getNamespaces();
46 for ( Iterator itr = namespaces.keySet().iterator(); itr.hasNext(); )
47 {
48 String prefix = (String) itr.next();
49 writer.writeAttribute("xmlns:"+prefix, (String) namespaces.get(prefix));
50 }
51
52 writer.writeStartElement("soap:Body");
53 writer.writeStartElement("soap:Fault");
54
55 writer.writeStartElement("faultcode");
56
57 String codeString = fault.getCode();
58 if ( codeString.equals( XFireFault.RECEIVER ) )
59 {
60 codeString = "Server";
61 }
62 if ( codeString.equals( XFireFault.SENDER ) )
63 {
64 codeString = "Server";
65 }
66 else if ( codeString.equals( XFireFault.DATA_ENCODING_UNKNOWN ) )
67 {
68 codeString = "Client";
69 }
70
71 writer.writeCharacters( codeString );
72 writer.writeEndElement();
73
74 writer.writeStartElement("faultstring");
75 writer.writeCharacters( fault.getMessage() );
76 writer.writeEndElement();
77
78 if ( fault.hasDetails() )
79 {
80 Node details = fault.getDetail();
81
82 writer.writeStartElement("detail");
83
84 NodeList children = details.getChildNodes();
85 for ( int i = 0; i < children.getLength(); i++ )
86 {
87 Node n = children.item(i);
88 if ( n instanceof Element )
89 {
90 STAXUtils.writeElement((Element)n, writer);
91 }
92 }
93
94 writer.writeEndElement();
95 }
96
97 if ( fault.getRole() != null )
98 {
99 writer.writeStartElement("faultactor");
100 writer.writeCharacters( fault.getRole() );
101 writer.writeEndElement();
102 }
103
104 writer.writeEndElement();
105 writer.writeEndElement();
106 writer.writeEndElement();
107 writer.writeEndDocument();
108 writer.close();
109 }
110 catch (XMLStreamException xe)
111 {
112 throw new XFireRuntimeException("Couldn't create fault.", xe);
113 }
114 }
115 }