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 }