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.DepthXMLStreamReader;
20 import org.codehaus.xfire.util.STAXUtils;
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 Invoker invoker = getInvoker();
58
59 final List params = new ArrayList();
60
61 for (Iterator itr = operation.getInputMessage().getMessageParts().iterator(); itr.hasNext();)
62 {
63 MessagePartInfo p = (MessagePartInfo) itr.next();
64 params.add( getBindingProvider().readParameter(p, message.getXMLStreamReader(), context) );
65 nextEvent(message.getXMLStreamReader());
66 }
67
68 message.setBody( params );
69 }
70
71 public void writeMessage(OutMessage message, XMLStreamWriter writer, MessageContext context)
72 throws XFireFault
73 {
74 Object[] values = (Object[]) message.getBody();
75 final OperationInfo operation = context.getExchange().getOperation();
76
77 int i = 0;
78 for (Iterator itr = operation.getOutputMessage().getMessageParts().iterator(); itr.hasNext();)
79 {
80 MessagePartInfo p = (MessagePartInfo) itr.next();
81
82 getBindingProvider().writeParameter(p, writer, context, values[i]);
83 i++;
84 }
85 }
86
87 public Object clone()
88 {
89 MessageBinding binding = new MessageBinding();
90 binding.setBindingProvider(getBindingProvider());
91
92 return binding;
93 }
94 }