View Javadoc

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 }