View Javadoc

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  }