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
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 }