1 package org.codehaus.xfire.message; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 import org.codehaus.xfire.MessageContext; 8 import org.codehaus.xfire.fault.XFireFault; 9 import org.codehaus.xfire.service.object.Operation; 10 import org.codehaus.xfire.service.object.Parameter; 11 import org.codehaus.xfire.util.DepthXMLStreamReader; 12 13 /*** 14 * Reads Document/Literal style messages. 15 * 16 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 17 * @since Apr 7, 2004 18 */ 19 public class WrappedBridge 20 extends AbstractMessageBridge 21 { 22 public WrappedBridge(MessageContext context) 23 { 24 super(context); 25 } 26 27 public List read() 28 throws XFireFault 29 { 30 List parameters = new ArrayList(); 31 LiteralReader reader = new LiteralReader(new DepthXMLStreamReader(getRequestReader())); 32 33 if ( !reader.hasMoreChildReaders() ) 34 throw new XFireFault("There must be a method name element.", XFireFault.SENDER); 35 36 MessageReader methodReader = reader.getNextChildReader(); 37 38 setOperation(getService().getOperation( methodReader.getLocalName() )); 39 40 Operation op = getOperation(); 41 42 if (op == null) 43 { 44 throw new XFireFault("Invalid operation.", XFireFault.SENDER); 45 } 46 47 while(methodReader.hasMoreChildReaders()) 48 { 49 MessageReader cReader = methodReader.getNextChildReader(); 50 51 Parameter p = op.getInParameter(cReader.getName()); 52 53 if (p == null) 54 { 55 throw new XFireFault("Parameter " + cReader.getName() + " does not exist!", 56 XFireFault.SENDER); 57 } 58 59 parameters.add(p.read(cReader, getContext())); 60 } 61 62 return parameters; 63 } 64 65 /*** 66 * @see org.codehaus.xfire.message.MessageBridge#write(java.lang.Object) 67 */ 68 public void write(Object[] values) 69 throws XFireFault 70 { 71 String name = getOperation().getName() + "Response"; 72 LiteralWriter writer = new LiteralWriter( 73 getResponseWriter(), 74 name, 75 getService().getDefaultNamespace() ); 76 77 int i = 0; 78 for(Iterator itr = getOperation().getOutParameters().iterator(); itr.hasNext();) 79 { 80 Parameter outParam = (Parameter) itr.next(); 81 82 outParam.write(values[i], writer, getContext()); 83 i++; 84 } 85 86 writer.close(); 87 } 88 }