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.XFireRuntimeException;
12  import org.codehaus.xfire.soap.Soap12;
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.2 messages.
20   * 
21   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
22   */
23  public class Soap12FaultHandler
24  	extends AbstractFaultHandler
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(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", Soap12.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("soap:Code");
56              
57              writer.writeStartElement("soap:Value");
58              writer.writeCharacters( "soap:" + fault.getCode() );
59              writer.writeEndElement(); // Value
60              
61              if ( fault.getSubCode() != null )
62              {
63                  writer.writeStartElement("soap:SubCode");
64                  writer.writeStartElement("soap:Value");
65                  writer.writeCharacters( fault.getSubCode() );
66                  writer.writeEndElement(); // Value
67                  writer.writeEndElement(); // SubCode
68              }
69  
70              writer.writeEndElement(); // Code
71              
72              writer.writeStartElement("soap:Reason");
73              writer.writeStartElement("soap:Text");
74              writer.writeCharacters(fault.getReason());
75              writer.writeEndElement(); // Text
76              writer.writeEndElement(); // Reason
77  
78              if ( fault.getRole() != null )
79              {
80                  writer.writeStartElement("soap:Role");
81                  writer.writeCharacters( fault.getRole() );
82                  writer.writeEndElement();
83              }
84              
85              if ( fault.hasDetails() )
86              {
87                  Node details = fault.getDetail();
88                  
89                  writer.writeStartElement("soap:Detail");
90                  
91                  NodeList children = details.getChildNodes();
92                  for ( int i = 0; i < children.getLength(); i++ )
93                  {
94                      Node n = children.item(i);
95                      if ( n instanceof Element )
96                      {
97                          STAXUtils.writeElement((Element)n, writer);
98                      }
99                  }
100                 
101                 writer.writeEndElement(); // Details
102             }
103 
104             writer.writeEndElement(); // Fault
105             writer.writeEndElement(); // Body
106             writer.writeEndElement(); // Envelope
107             writer.writeEndDocument();
108             writer.close();
109         }
110         catch (XMLStreamException xe)
111         {
112             throw new XFireRuntimeException("Couldn't create fault.", xe);
113         }
114     }
115 }