View Javadoc

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  }