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 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(); // Fault
73              writer.writeEndElement(); // Body
74              writer.writeEndElement(); // Envelope
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  }