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 }