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.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(); // Value
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(); // Value
66                  writer.writeEndElement(); // SubCode
67              }
68  
69              writer.writeEndElement(); // Code
70              
71              writer.writeStartElement("soap:Reason");
72              writer.writeStartElement("soap:Text");
73              writer.writeCharacters(fault.getReason());
74              writer.writeEndElement(); // Text
75              writer.writeEndElement(); // Reason
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(); // Details
94              }
95  
96              writer.writeEndElement(); // Fault
97              writer.writeEndElement(); // Body
98              writer.writeEndElement(); // Envelope
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 }