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