1 package org.codehaus.xfire.soap;
2
3 import javax.xml.namespace.QName;
4 import javax.xml.stream.XMLStreamException;
5 import javax.xml.stream.XMLStreamWriter;
6
7 import org.codehaus.xfire.MessageContext;
8 import org.codehaus.xfire.exchange.AbstractMessage;
9 import org.codehaus.xfire.exchange.InMessage;
10 import org.codehaus.xfire.exchange.MessageSerializer;
11 import org.codehaus.xfire.exchange.OutMessage;
12 import org.codehaus.xfire.fault.XFireFault;
13 import org.codehaus.yom.Element;
14 import org.codehaus.yom.Elements;
15 import org.codehaus.yom.stax.StaxSerializer;
16
17 public class SoapSerializer
18 implements MessageSerializer
19 {
20 public static final String SERIALIZE_PROLOG = "xfire.serializeProlog";
21 private MessageSerializer serializer;
22
23 public SoapSerializer(MessageSerializer serializer)
24 {
25 this.serializer = serializer;
26 }
27
28 public MessageSerializer getSerializer()
29 {
30 return serializer;
31 }
32
33 /***
34 * Sends a message wrapped in a SOAP Envelope and Body.
35 *
36 * @param message
37 * @param writer
38 * @param context
39 * @throws XFireFault
40 */
41
42 public void writeMessage(OutMessage message, XMLStreamWriter writer, MessageContext context)
43 throws XFireFault
44 {
45 try
46 {
47 QName env = message.getSoapVersion().getEnvelope();
48
49 Boolean serializeObj = (Boolean) context.getProperty(SERIALIZE_PROLOG);
50 boolean serializeProlog = (serializeObj != null) ? serializeObj.booleanValue() : true;
51 if (serializeProlog)
52 writer.writeStartDocument(message.getEncoding(), "1.0");
53
54 writer.setPrefix(env.getPrefix(), env.getNamespaceURI());
55 writer.writeStartElement(env.getPrefix(),
56 env.getLocalPart(),
57 env.getNamespaceURI());
58 writer.writeNamespace(env.getPrefix(), env.getNamespaceURI());
59
60 if (message.getHeader() != null && message.getHeader().getChildCount() > 0)
61 {
62 QName header = message.getSoapVersion().getHeader();
63 writer.writeStartElement(header.getPrefix(),
64 header.getLocalPart(),
65 header.getNamespaceURI());
66
67 writeHeaders(message, writer);
68
69 writer.writeEndElement();
70 }
71
72 QName body = message.getSoapVersion().getBody();
73 writer.writeStartElement(body.getPrefix(),
74 body.getLocalPart(),
75 body.getNamespaceURI());
76
77 serializer.writeMessage(message, writer, context);
78
79 writer.writeEndElement();
80 writer.writeEndElement();
81
82 if (serializeProlog)
83 writer.writeEndDocument();
84
85 writer.close();
86 }
87 catch (XMLStreamException e)
88 {
89 throw new XFireFault("Couldn't write message.", e, XFireFault.RECEIVER);
90 }
91 }
92
93 protected void writeHeaders(AbstractMessage msg, XMLStreamWriter writer)
94 throws XMLStreamException
95 {
96 StaxSerializer ser = new StaxSerializer();
97
98 Elements elements = msg.getHeader().getChildElements();
99 for (int i = 0; i < elements.size(); i++)
100 {
101 Element e = elements.get(i);
102
103 ser.writeElement(e, writer);
104 }
105 }
106
107 public void readMessage(InMessage message, MessageContext context)
108 throws XFireFault
109 {
110 throw new UnsupportedOperationException();
111 }
112 }