1 package org.codehaus.xfire.service.binding;
2
3 import javax.xml.parsers.DocumentBuilder;
4 import javax.xml.parsers.DocumentBuilderFactory;
5 import javax.xml.stream.XMLStreamException;
6 import javax.xml.stream.XMLStreamReader;
7 import javax.xml.stream.XMLStreamWriter;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.codehaus.xfire.MessageContext;
12 import org.codehaus.xfire.XFireRuntimeException;
13 import org.codehaus.xfire.fault.XFireFault;
14 import org.codehaus.xfire.service.MessageHeaderInfo;
15 import org.codehaus.xfire.service.MessagePartInfo;
16 import org.codehaus.xfire.service.Service;
17 import org.codehaus.xfire.util.STAXUtils;
18 import org.codehaus.xfire.wsdl.SchemaType;
19 import org.codehaus.yom.Element;
20 import org.codehaus.yom.Node;
21 import org.codehaus.yom.stax.StaxBuilder;
22 import org.codehaus.yom.stax.StaxSerializer;
23 import org.w3c.dom.Document;
24
25 public class MessageBindingProvider
26 implements BindingProvider
27 {
28 private static final Log logger = LogFactory.getLog(MessageBindingProvider.class);
29
30 public void initialize(Service newParam)
31 {
32 }
33
34 public Object readParameter(MessagePartInfo p, XMLStreamReader reader, MessageContext context)
35 throws XFireFault
36 {
37 if (p.getTypeClass().isAssignableFrom(XMLStreamReader.class))
38 {
39 return context.getInMessage().getXMLStreamReader();
40 }
41 else if (p.getTypeClass().isAssignableFrom(Element.class))
42 {
43 StaxBuilder builder = new StaxBuilder();
44 try
45 {
46 return builder.buildElement(null, context.getInMessage().getXMLStreamReader());
47 }
48 catch (XMLStreamException e)
49 {
50 throw new XFireFault("Couldn't parse stream.", e, XFireFault.SENDER);
51 }
52 }
53 else if (Document.class.isAssignableFrom(p.getTypeClass()))
54 {
55 try
56 {
57 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
58 DocumentBuilder builder = factory.newDocumentBuilder();
59
60 return STAXUtils.read(builder, reader);
61 }
62 catch(Exception e)
63 {
64 throw new XFireFault("Couldn't read message.", e, XFireFault.SENDER);
65 }
66 }
67 else if (p.getTypeClass().isAssignableFrom(MessageContext.class))
68 {
69 return context;
70 }
71 else
72 {
73 logger.warn("Unknown type for serialization: " + p.getTypeClass());
74 return null;
75 }
76 }
77
78 public void writeParameter(MessagePartInfo p,
79 XMLStreamWriter writer,
80 MessageContext context,
81 Object value)
82 throws XFireFault
83 {
84 if (value instanceof Element)
85 {
86 StaxSerializer serializer = new StaxSerializer();
87 try
88 {
89 serializer.writeElement((Element) value, writer);
90 }
91 catch (XMLStreamException e)
92 {
93 throw new XFireRuntimeException("Couldn't write to stream.", e);
94 }
95 }
96 else
97 {
98 logger.warn("Unknown type for serialization: " + p.getTypeClass());
99 }
100 }
101
102 public SchemaType getSchemaType(Service service, MessagePartInfo param)
103 {
104 return null;
105 }
106
107 public Object readHeader(MessageHeaderInfo p, MessageContext context)
108 throws XFireFault
109 {
110 return context.getInMessage().getHeader().getFirstChildElement(p.getName().getLocalPart(),
111 p.getName().getNamespaceURI());
112 }
113
114 public void writeHeader(MessagePartInfo p, MessageContext context, Object value)
115 throws XFireFault
116 {
117 context.getOutMessage().getHeader().appendChild((Node) value);
118 }
119 }