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