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