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 }