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