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 javax.xml.stream.XMLStreamReader;
8   import javax.xml.stream.XMLStreamWriter;
9   
10  import org.codehaus.xfire.MessageContext;
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   * Bridges 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 DocumentBridge
23      extends AbstractMessageBridge
24  {
25  	public DocumentBridge( JavaService service, 
26                             MessageContext context,
27                             XMLStreamReader request,
28                             XMLStreamWriter response )
29      {
30  		super( service, context, request, response );
31          
32          setNamespace( getService().getDefaultNamespace() );
33  	}
34  
35      public List read()
36      {
37          List parameters = new ArrayList();
38          MessageReader reader = new LiteralReader(new DepthXMLStreamReader(getRequestReader()));
39          
40          while( reader.hasMoreChildReaders() )
41          {
42              Class clazz = getOperation().getParameterClass( reader.getLocalName() );
43  
44              // TODO: support complex type mappings...
45              Type type = getTypeMapping().getType( reader.getName() );
46  
47              parameters.add( type.readObject( reader.getNextChildReader() ) );
48          }
49          
50          setOperation( findOperation( parameters.size() ) );
51          return parameters;
52      }
53  
54  
55      protected Operation findOperation(int i)
56      {
57          for ( Iterator itr = getService().getOperations().iterator(); itr.hasNext(); )
58          {
59              Operation o = (Operation) itr.next();
60              if ( o.getParameters().size() == i )
61                  return o;
62          }
63          
64          return null;
65      }
66  
67      public void write(Object value)
68      {
69          Type type = getTypeMapping().getType( value.getClass() );
70  
71          String ns = null;
72          
73          if ( type.isComplex() )
74          {
75              ns = type.getSchemaType().getNamespace().getURI();
76          }
77          else
78          {
79          	ns = getNamespace();
80          }
81          
82          String name = getOperation().getOutParameterName();
83          LiteralWriter writer = new LiteralWriter( getResponseWriter(), name, ns );
84  
85          type.writeObject( value, writer );
86          
87          writer.close();
88      }
89  }