1 package org.codehaus.xfire.java.message;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.xml.stream.XMLStreamReader;
7 import javax.xml.stream.XMLStreamWriter;
8
9 import org.codehaus.xfire.MessageContext;
10 import org.codehaus.xfire.fault.XFireFault;
11 import org.codehaus.xfire.java.JavaService;
12 import org.codehaus.xfire.java.Operation;
13 import org.codehaus.xfire.java.type.Type;
14 import org.codehaus.xfire.util.DepthXMLStreamReader;
15
16 /***
17 * Reads Document/Literal style messages.
18 *
19 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
20 * @since Apr 7, 2004
21 */
22 public class WrappedBridge
23 extends AbstractMessageBridge
24 {
25 public WrappedBridge( JavaService service,
26 MessageContext context,
27 XMLStreamReader request,
28 XMLStreamWriter response )
29 {
30 super( service, context, request, response );
31
32 setNamespace( request.getNamespaceURI() );
33 String methodName = request.getLocalName();
34
35 setOperation( getService().getOperation( methodName, getNamespace() ) );
36 }
37
38 public List read() throws XFireFault
39 {
40 List parameters = new ArrayList();
41 LiteralReader reader = new LiteralReader(new DepthXMLStreamReader(getRequestReader()));
42 Operation op = getOperation();
43
44 if ( op == null )
45 {
46 throw new XFireFault("Invalid operation.", XFireFault.SENDER);
47 }
48
49 while( reader.hasMoreChildReaders() )
50 {
51 MessageReader cReader = reader.getNextChildReader();
52
53 Class clazz = op.getParameterClass( cReader.getLocalName() );
54
55 if ( clazz == null )
56 {
57 throw new XFireFault("Invalid parameter: " + cReader.getName(), XFireFault.SENDER);
58 }
59
60 Type type = getTypeMapping().getType( clazz );
61
62 parameters.add( type.readObject( cReader ) );
63 }
64
65 return parameters;
66 }
67
68 /***
69 * @see org.codehaus.xfire.java.message.MessageBridge#write(java.lang.Object)
70 */
71 public void write(Object value)
72 {
73 String name = getOperation().getName() + "Response";
74 LiteralWriter writer = new LiteralWriter( getResponseWriter(),
75 name,
76 getService().getDefaultNamespace() );
77
78 Type type = getTypeMapping().getType( value.getClass() );
79 String ns = null;
80
81 if ( type.isComplex() )
82 {
83 ns = type.getSchemaType().getNamespace().getURI();
84 }
85 else
86 {
87 ns = getNamespace();
88 }
89
90 MessageWriter retWriter = writer.getChildWriter( getOperation().getOutParameterName(),
91 ns );
92 System.out.println("namespace: " + ns );
93 type.writeObject( value, retWriter );
94
95 retWriter.close();
96 writer.close();
97 }
98 }