1 package org.codehaus.xfire.fault;
2
3 import java.util.Iterator;
4 import java.util.Map;
5
6 import javax.xml.stream.XMLStreamException;
7 import javax.xml.stream.XMLStreamReader;
8 import javax.xml.stream.XMLStreamWriter;
9
10 import org.codehaus.xfire.MessageContext;
11 import org.codehaus.xfire.XFireRuntimeException;
12 import org.codehaus.xfire.exchange.InMessage;
13 import org.codehaus.xfire.exchange.MessageSerializer;
14 import org.codehaus.xfire.exchange.OutMessage;
15 import org.codehaus.yom.Element;
16 import org.codehaus.yom.Elements;
17 import org.codehaus.yom.stax.StaxBuilder;
18 import org.codehaus.yom.stax.StaxSerializer;
19
20 public class Soap11FaultSerializer
21 implements MessageSerializer
22 {
23 private StaxBuilder builder = new StaxBuilder();
24
25 public void readMessage(InMessage message, MessageContext context)
26 throws XFireFault
27 {
28 XFireFault fault = new XFireFault();
29
30 XMLStreamReader reader = message.getXMLStreamReader();
31
32 try
33 {
34 boolean end = false;
35 while (!end && reader.hasNext())
36 {
37 int event = reader.next();
38 switch (event)
39 {
40 case XMLStreamReader.START_DOCUMENT:
41 String encoding = reader.getCharacterEncodingScheme();
42 message.setEncoding(encoding);
43 break;
44 case XMLStreamReader.END_DOCUMENT:
45 end = true;
46 break;
47 case XMLStreamReader.END_ELEMENT:
48 break;
49 case XMLStreamReader.START_ELEMENT:
50 if (reader.getLocalName().equals("faultcode"))
51 {
52 fault.setFaultCode(reader.getElementText());
53 }
54 else if (reader.getLocalName().equals("faultstring"))
55 {
56 fault.setMessage(reader.getElementText());
57 }
58 else if (reader.getLocalName().equals("faultactor"))
59 {
60 fault.setRole(reader.getElementText());
61 }
62 else if (reader.getLocalName().equals("detail"))
63 {
64 fault.setDetail(builder.buildElement(null, reader));
65 }
66 break;
67 default:
68 break;
69 }
70 }
71 }
72 catch (XMLStreamException e)
73 {
74 throw new XFireFault("Could not parse message.", e, XFireFault.SENDER);
75 }
76 message.setBody(fault);
77 }
78
79 public void writeMessage(OutMessage message, XMLStreamWriter writer, MessageContext context)
80 throws XFireFault
81 {
82 XFireFault fault = (XFireFault) message.getBody();
83
84 try
85 {
86 Map namespaces = fault.getNamespaces();
87 for (Iterator itr = namespaces.keySet().iterator(); itr.hasNext();)
88 {
89 String prefix = (String) itr.next();
90 writer.writeAttribute("xmlns:" + prefix, (String) namespaces.get(prefix));
91 }
92
93 writer.writeStartElement("soap:Fault");
94
95 writer.writeStartElement("faultcode");
96
97 String codeString = fault.getFaultCode();
98 if (codeString.equals(XFireFault.RECEIVER))
99 {
100 codeString = "Server";
101 }
102 if (codeString.equals(XFireFault.SENDER))
103 {
104 codeString = "Server";
105 }
106 else if (codeString.equals(XFireFault.DATA_ENCODING_UNKNOWN))
107 {
108 codeString = "Client";
109 }
110
111 writer.writeCharacters(codeString);
112 writer.writeEndElement();
113
114 writer.writeStartElement("faultstring");
115 writer.writeCharacters(fault.getMessage());
116 writer.writeEndElement();
117
118 if (fault.hasDetails())
119 {
120 Element detail = fault.getDetail();
121
122 writer.writeStartElement("detail");
123
124 StaxSerializer serializer = new StaxSerializer();
125 Elements details = detail.getChildElements();
126 for (int i = 0; i < details.size(); i++)
127 {
128 serializer.writeElement(details.get(i), writer);
129 }
130
131 writer.writeEndElement();
132 }
133
134 if (fault.getRole() != null)
135 {
136 writer.writeStartElement("faultactor");
137 writer.writeCharacters(fault.getRole());
138 writer.writeEndElement();
139 }
140
141 writer.writeEndElement();
142 }
143 catch (XMLStreamException xe)
144 {
145 throw new XFireRuntimeException("Couldn't create fault.", xe);
146 }
147 }
148 }