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 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  }