View Javadoc

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.1 messages.
20   * 
21   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22   */
23  public class SOAP11FaultHandler
24  	implements FaultHandler
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( Exception e, 
32                               MessageContext context )
33      {
34          XFireFault fault = createFault(e);
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", SOAPConstants.SOAP11_ENVELOPE_NS);
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                  Element details = fault.getDetailElement();
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                          DOMStreamWriter.writeElement((Element)n, writer);
91                      }
92                  }
93                  
94                  writer.writeEndElement(); // Details
95              }
96              
97              writer.writeEndElement(); // Fault
98              writer.writeEndElement(); // Body
99              writer.writeEndElement(); // Envelope
100             writer.writeEndDocument(); 
101             writer.close();
102         }
103         catch (XMLStreamException xe)
104         {
105             throw new XFireRuntimeException("Couldn't create fault.", xe);
106         }
107     }
108 
109     /***
110 	 * @param e
111 	 * @return
112 	 */
113 	private XFireFault createFault(Exception e)
114 	{
115 		XFireFault fault = XFireFault.createFault(e);
116         
117 		return fault;
118 	}
119 
120 }