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 javax.xml.namespace.QName; 8 9 import org.codehaus.xfire.MessageContext; 10 import org.codehaus.xfire.fault.XFireFault; 11 import org.codehaus.xfire.service.object.Operation; 12 import org.codehaus.xfire.service.object.Parameter; 13 import org.codehaus.xfire.util.DepthXMLStreamReader; 14 15 /*** 16 * Bridges Document/Literal style messages. 17 * 18 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 19 * @since Apr 7, 2004 20 */ 21 public class DocumentBridge 22 extends AbstractMessageBridge 23 { 24 public DocumentBridge(MessageContext context) 25 { 26 super(context); 27 } 28 29 public List read() 30 throws XFireFault 31 { 32 List parameters = new ArrayList(); 33 DepthXMLStreamReader dr = new DepthXMLStreamReader(getRequestReader()); 34 MessageReader topReader = new LiteralReader(dr); 35 36 while( topReader.hasMoreChildReaders() ) 37 { 38 MessageReader reader = topReader.getNextChildReader(); 39 40 Parameter p = findParameter(reader.getName()); 41 42 if (p == null) 43 { 44 throw new XFireFault("Parameter " + reader.getName() + " does not exist!", 45 XFireFault.SENDER); 46 } 47 48 parameters.add(p.read(reader, getContext())); 49 } 50 51 setOperation( findOperation( parameters.size() ) ); 52 return parameters; 53 } 54 55 protected Parameter findParameter(QName name) 56 { 57 for ( Iterator itr = getService().getOperations().iterator(); itr.hasNext(); ) 58 { 59 Operation op = (Operation) itr.next(); 60 Parameter p = op.getInParameter(name); 61 62 if ( p != null ) 63 return p; 64 } 65 return null; 66 } 67 68 protected Operation findOperation(int i) 69 { 70 for ( Iterator itr = getService().getOperations().iterator(); itr.hasNext(); ) 71 { 72 Operation o = (Operation) itr.next(); 73 if ( o.getInParameters().size() == i ) 74 return o; 75 } 76 77 return null; 78 } 79 80 public void write(Object[] values) 81 throws XFireFault 82 { 83 int i = 0; 84 for(Iterator itr = getOperation().getOutParameters().iterator(); itr.hasNext();) 85 { 86 Parameter outParam = (Parameter) itr.next(); 87 88 outParam.write(values[i], new LiteralWriter(getResponseWriter()), getContext()); 89 i++; 90 } 91 } 92 }