1 package org.codehaus.xfire.java.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.handler.dom.Message;
9 import org.codehaus.xfire.java.JavaService;
10 import org.codehaus.xfire.java.type.Type;
11 import org.codehaus.xfire.util.NamespaceHelper;
12 import org.dom4j.Element;
13 import org.dom4j.Namespace;
14 import org.dom4j.QName;
15
16 /***
17 * Reads RPC/Literal style messages.
18 *
19 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
20 * @since Apr 7, 2004
21 */
22 public class RPCLiteralBridge
23 extends AbstractMessageBridge
24 {
25 private Element payload;
26
27 public RPCLiteralBridge( JavaService service,
28 MessageContext context,
29 Message request,
30 Message response )
31 {
32 super( service, context, request, response );
33
34 setNamespace( getPayload().getNamespaceURI() );
35 String methodName = getPayload().getName();
36
37 setOperation( getService().getOperation( methodName, getNamespace() ) );
38 }
39
40 /***
41 * @return Returns the payload.
42 */
43 public Element getPayload()
44 {
45 if ( payload == null )
46 {
47 payload = (Element) getRequest().elements().get(0);
48 }
49
50 return payload;
51 }
52
53 public List read()
54 {
55 List parameters = new ArrayList();
56
57 for ( Iterator itr = getPayload().elementIterator(); itr.hasNext(); )
58 {
59 Element element = (Element) itr.next();
60
61 Class clazz = operation.getParameterClass( element.getName() );
62
63 Type type = getTypeMapping().getType( clazz );
64
65 parameters.add( type.readObject( new LiteralReader( element ) ) );
66 }
67
68 return parameters;
69 }
70
71 /***
72 * @see org.codehaus.xfire.java.message.MessageBridge#write(java.lang.Object)
73 */
74 public void write(Object value)
75 {
76 Namespace ns = NamespaceHelper.getNamespace( getResponse(), getNamespace() );
77
78 QName responseQ = new QName( getOperation().getName() + "Response", ns );
79 Element methodResponse = getResponse().addElement( responseQ );
80
81 QName outQ = new QName( "out", ns );
82 Element out = methodResponse.addElement( outQ );
83
84 Type type = getTypeMapping().getType( value.getClass() );
85
86 type.writeObject( value, new LiteralWriter( out ) );
87 }
88 }