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 }