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.type.Type; 11 import org.codehaus.xfire.util.NamespaceHelper; 12 import org.dom4j.Element; 13 import org.dom4j.Namespace; 14 import org.dom4j.QName; 15 16 /*** 17 * Reads RPC/Literal style messages. 18 * 19 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 20 * @since Apr 7, 2004 21 */ 22 public class RPCLiteralBridge 23 extends AbstractMessageBridge 24 { 25 private Element payload; 26 27 public RPCLiteralBridge( JavaService service, 28 MessageContext context, 29 Message request, 30 Message response ) 31 { 32 super( service, context, request, response ); 33 34 setNamespace( getPayload().getNamespaceURI() ); 35 String methodName = getPayload().getName(); 36 37 setOperation( getService().getOperation( methodName, getNamespace() ) ); 38 } 39 40 /*** 41 * @return Returns the payload. 42 */ 43 public Element getPayload() 44 { 45 if ( payload == null ) 46 { 47 payload = (Element) getRequest().elements().get(0); 48 } 49 50 return payload; 51 } 52 53 public List read() 54 { 55 List parameters = new ArrayList(); 56 57 for ( Iterator itr = getPayload().elementIterator(); itr.hasNext(); ) 58 { 59 Element element = (Element) itr.next(); 60 61 Class clazz = operation.getParameterClass( element.getName() ); 62 63 Type type = getTypeMapping().getType( clazz ); 64 65 parameters.add( type.readObject( new LiteralReader( element ) ) ); 66 } 67 68 return parameters; 69 } 70 71 /*** 72 * @see org.codehaus.xfire.java.message.MessageBridge#write(java.lang.Object) 73 */ 74 public void write(Object value) 75 { 76 Namespace ns = NamespaceHelper.getNamespace( getResponse(), getNamespace() ); 77 78 QName responseQ = new QName( getOperation().getName() + "Response", ns ); 79 Element methodResponse = getResponse().addElement( responseQ ); 80 81 QName outQ = new QName( "out", ns ); 82 Element out = methodResponse.addElement( outQ ); 83 84 Type type = getTypeMapping().getType( value.getClass() ); 85 86 type.writeObject( value, new LiteralWriter( out ) ); 87 } 88 }