1 package org.codehaus.xfire.handler; 2 3 import javax.xml.stream.XMLStreamConstants; 4 import javax.xml.stream.XMLStreamReader; 5 import javax.xml.stream.XMLStreamWriter; 6 import org.codehaus.xfire.MessageContext; 7 import org.codehaus.xfire.XFireRuntimeException; 8 import org.codehaus.xfire.fault.XFireFault; 9 10 /*** 11 * A handler which echoes the SOAP Body back. 12 * 13 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a> 14 * @since Feb 18, 2004 15 */ 16 public class EchoHandler 17 extends AbstractHandler 18 { 19 /*** 20 * @see org.codehaus.xfire.handler.Handler#invoke(org.codehaus.xfire.MessageContext, javax.xml.stream.XMLStreamReader) 21 */ 22 public void invoke( MessageContext context, XMLStreamReader parser ) 23 throws XFireFault 24 { 25 XMLStreamWriter writer = null; 26 try 27 { 28 writer = getXMLStreamWriter(context); 29 30 boolean done = false; 31 int attribute = 0; 32 int namespace = 0; 33 34 while ( !done ) 35 { 36 int event = parser.next(); 37 switch( event ) 38 { 39 case XMLStreamConstants.START_DOCUMENT: 40 writer.writeStartDocument(); 41 break; 42 case XMLStreamConstants.END_DOCUMENT: 43 writer.writeEndDocument(); 44 done = true; 45 break; 46 case XMLStreamConstants.ATTRIBUTE: 47 break; 48 case XMLStreamConstants.NAMESPACE: 49 break; 50 case XMLStreamConstants.START_ELEMENT: 51 writer.writeStartElement( 52 parser.getPrefix(), 53 parser.getLocalName(), 54 parser.getNamespaceURI()); 55 56 for ( int i = 0; i < parser.getAttributeCount(); i++ ) 57 { 58 writer.writeAttribute( 59 parser.getAttributeNamespace(i), 60 parser.getAttributeLocalName(i), 61 parser.getAttributeValue(i)); 62 } 63 64 for ( int i = 0; i < parser.getAttributeCount(); i++ ) 65 { 66 writer.writeNamespace( 67 parser.getNamespacePrefix(i), 68 parser.getNamespaceURI(i)); 69 } 70 71 break; 72 case XMLStreamConstants.END_ELEMENT: 73 writer.writeEndElement(); 74 break; 75 case XMLStreamConstants.CHARACTERS: 76 writer.writeCharacters( parser.getText() ); 77 break; 78 default: 79 break; 80 } 81 } 82 } 83 catch (Exception e) 84 { 85 throw new XFireRuntimeException("Error processing document.", e); 86 } 87 finally 88 { 89 if ( writer != null ) 90 { 91 try 92 { 93 writer.close(); 94 context.getResponseStream().flush(); 95 } 96 catch (Exception e) 97 { 98 throw new XFireRuntimeException("Error closing stream.", e); 99 } 100 } 101 102 } 103 } 104 }