1 package org.codehaus.xfire.java.message; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import javax.xml.stream.XMLStreamReader; 7 import javax.xml.stream.XMLStreamWriter; 8 9 import org.codehaus.xfire.MessageContext; 10 import org.codehaus.xfire.fault.XFireFault; 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 * Reads 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 WrappedBridge 23 extends AbstractMessageBridge 24 { 25 public WrappedBridge( JavaService service, 26 MessageContext context, 27 XMLStreamReader request, 28 XMLStreamWriter response ) 29 { 30 super( service, context, request, response ); 31 32 setNamespace( request.getNamespaceURI() ); 33 String methodName = request.getLocalName(); 34 35 setOperation( getService().getOperation( methodName, getNamespace() ) ); 36 } 37 38 public List read() throws XFireFault 39 { 40 List parameters = new ArrayList(); 41 LiteralReader reader = new LiteralReader(new DepthXMLStreamReader(getRequestReader())); 42 Operation op = getOperation(); 43 44 if ( op == null ) 45 { 46 throw new XFireFault("Invalid operation.", XFireFault.SENDER); 47 } 48 49 while( reader.hasMoreChildReaders() ) 50 { 51 MessageReader cReader = reader.getNextChildReader(); 52 53 Class clazz = op.getParameterClass( cReader.getLocalName() ); 54 55 if ( clazz == null ) 56 { 57 throw new XFireFault("Invalid parameter: " + cReader.getName(), XFireFault.SENDER); 58 } 59 60 Type type = getTypeMapping().getType( clazz ); 61 62 parameters.add( type.readObject( cReader ) ); 63 } 64 65 return parameters; 66 } 67 68 /*** 69 * @see org.codehaus.xfire.java.message.MessageBridge#write(java.lang.Object) 70 */ 71 public void write(Object value) 72 { 73 String name = getOperation().getName() + "Response"; 74 LiteralWriter writer = new LiteralWriter( getResponseWriter(), 75 name, 76 getService().getDefaultNamespace() ); 77 78 Type type = getTypeMapping().getType( value.getClass() ); 79 String ns = null; 80 81 if ( type.isComplex() ) 82 { 83 ns = type.getSchemaType().getNamespace().getURI(); 84 } 85 else 86 { 87 ns = getNamespace(); 88 } 89 90 MessageWriter retWriter = writer.getChildWriter( getOperation().getOutParameterName(), 91 ns ); 92 System.out.println("namespace: " + ns ); 93 type.writeObject( value, retWriter ); 94 95 retWriter.close(); 96 writer.close(); 97 } 98 }