View Javadoc

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                  //code.add( fault.getSubCode() );
46              }
47              writer.writeEndElement(); // Value
48              writer.writeEndElement(); // Code
49              
50              writer.writeStartElement("soap:Reason");
51              writer.writeStartElement("soap:Text");
52              writer.writeCharacters(fault.getReason());
53              writer.writeEndElement(); // Text
54              writer.writeEndElement(); // Reason
55  
56              writer.writeStartElement("soap:Detail");
57              if ( fault.getDetail() != null )
58              {
59                  List detail = fault.getDetail();
60                  // TODO: handle fault detail.
61              }
62              writer.writeEndElement(); // Detail
63              
64              writer.writeEndElement(); // Fault
65              writer.writeEndElement(); // Body
66              writer.writeEndElement(); // Envelope
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  }