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.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 * Bridges 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 DocumentBridge
24 extends AbstractMessageBridge
25 {
26 public DocumentBridge( JavaService service,
27 MessageContext context,
28 Message request,
29 Message response )
30 {
31 super( service, context, request, response );
32
33 setNamespace( getService().getDefaultNamespace() );
34 findOperation();
35 }
36
37 private void findOperation()
38 {
39 Namespace ns = NamespaceHelper.getNamespace( getRequest(),
40 getNamespace() );
41 boolean found = false;
42
43 for( Iterator itr = getService().getOperations().iterator(); itr.hasNext(); )
44 {
45 Operation op = (Operation) itr.next();
46
47 if ( op.getParameters().size() == getRequest().elements().size() )
48 {
49 found = true;
50
51 for ( Iterator pitr = op.getParameters().iterator(); pitr.hasNext(); )
52 {
53 String param = (String) pitr.next();
54
55 Element element = getRequest().element( new QName(param, ns) );
56
57 if ( element == null )
58 {
59 found = false;
60 break;
61 }
62 }
63
64 if ( found )
65 {
66 setOperation( op );
67 found = false;
68 }
69 }
70 }
71 }
72
73 public List read()
74 {
75 List parameters = new ArrayList();
76
77 for ( Iterator itr = getRequest().elementIterator(); itr.hasNext(); )
78 {
79 Element element = (Element) itr.next();
80
81 Class clazz = getOperation().getParameterClass( element.getName() );
82
83
84 Type type = getTypeMapping().getType( clazz );
85
86 parameters.add( type.readObject( new LiteralReader( element ) ) );
87 }
88
89 return parameters;
90 }
91
92 public void write(Object value)
93 {
94 Type type = getTypeMapping().getType( value.getClass() );
95
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 = getResponse().addElement( outQ );
109
110 type.writeObject( value, new LiteralWriter( out ) );
111 }
112 }