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 }