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 }