1 package org.codehaus.xfire.service.binding;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
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.exchange.InMessage;
13 import org.codehaus.xfire.exchange.OutMessage;
14 import org.codehaus.xfire.fault.XFireFault;
15 import org.codehaus.xfire.service.MessagePartInfo;
16 import org.codehaus.xfire.service.OperationInfo;
17 import org.codehaus.xfire.service.Service;
18 import org.codehaus.xfire.soap.SoapConstants;
19 import org.codehaus.xfire.util.STAXUtils;
20 import org.codehaus.xfire.util.stax.DepthXMLStreamReader;
21
22 /***
23 * Handles messages.
24 *
25 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse </a>
26 * @since Feb 18, 2004
27 */
28 public class MessageBinding
29 extends AbstractBinding
30 {
31 private static final Log logger = LogFactory.getLog(MessageBinding.class.getName());
32
33 public MessageBinding()
34 {
35 setStyle(SoapConstants.STYLE_MESSAGE);
36 setUse(SoapConstants.USE_LITERAL);
37 }
38
39 public void readMessage(InMessage message, MessageContext context)
40 throws XFireFault
41 {
42 final Service endpoint = context.getService();
43
44 OperationInfo operation = context.getExchange().getOperation();
45
46 if (context.getExchange().getOperation() == null)
47 {
48 operation = (OperationInfo) endpoint.getServiceInfo().getOperations().iterator().next();
49
50 setOperation(operation, context);
51 }
52
53 DepthXMLStreamReader dr = new DepthXMLStreamReader(message.getXMLStreamReader());
54
55 STAXUtils.toNextElement(dr);
56
57 final List params = new ArrayList();
58
59 for (Iterator itr = operation.getInputMessage().getMessageParts().iterator(); itr.hasNext();)
60 {
61 MessagePartInfo p = (MessagePartInfo) itr.next();
62 params.add( getBindingProvider().readParameter(p, message.getXMLStreamReader(), context) );
63 nextEvent(message.getXMLStreamReader());
64 }
65
66 message.setBody( params );
67 }
68
69 public void writeMessage(OutMessage message, XMLStreamWriter writer, MessageContext context)
70 throws XFireFault
71 {
72 Object[] values = (Object[]) message.getBody();
73 final OperationInfo operation = context.getExchange().getOperation();
74
75 int i = 0;
76 for (Iterator itr = operation.getOutputMessage().getMessageParts().iterator(); itr.hasNext();)
77 {
78 MessagePartInfo p = (MessagePartInfo) itr.next();
79
80 getBindingProvider().writeParameter(p, writer, context, values[i]);
81 i++;
82 }
83 }
84
85 public Object clone()
86 {
87 MessageBinding binding = new MessageBinding();
88 binding.setBindingProvider(getBindingProvider());
89
90 return binding;
91 }
92 }