View Javadoc

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 RPCEncodedBridge
20      extends AbstractMessageBridge
21  {
22      public RPCEncodedBridge(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          String opName = methodReader.getLocalName();
39          Operation operation = getService().getOperation( opName );
40          if (operation == null)
41          {
42              // Determine the operation name which is in the form of:
43              // xxxxRequest where xxxx is the operation.
44              int index = opName.indexOf("Request");
45              if (index > 0)
46              {
47                  operation = getService().getOperation( opName.substring(0, index) );
48              }
49          }
50  
51          setOperation( operation );
52  
53          Operation op = getOperation();
54  
55          if ( op == null )
56          {
57              throw new XFireFault("Invalid operation: "+opName, XFireFault.SENDER);
58          }
59  
60          while( methodReader.hasMoreChildReaders() )
61          {
62              MessageReader cReader = methodReader.getNextChildReader();
63              
64              Parameter p =  op.getInParameter(cReader.getName());
65  
66              if (p == null)
67              {
68                  throw new XFireFault("No such IN parameter: "+cReader.getName(), XFireFault.SENDER);
69              }
70  
71              parameters.add(p.read(cReader, getContext()));
72          }
73          
74          return parameters;
75      }
76  
77      /***
78       * @see org.codehaus.xfire.message.MessageBridge#write(java.lang.Object)
79       */
80      public void write(Object[] values)
81      	throws XFireFault
82      {
83          String name = getOperation().getName() + "Response";
84          LiteralWriter writer = new LiteralWriter( 
85                  getResponseWriter(), 
86                  name, 
87                  getService().getDefaultNamespace() );
88          
89          int i = 0;
90          for(Iterator itr = getOperation().getOutParameters().iterator(); itr.hasNext();)
91          {
92              Parameter outParam = (Parameter) itr.next();
93              outParam.write(values[i], writer, getContext());
94              i++;
95          }
96          
97          writer.close();
98      }
99  }