001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.codehaus.activesoap.handler.xstream;
019    
020    import com.thoughtworks.xstream.XStream;
021    import com.thoughtworks.xstream.io.xml.StaxDriver;
022    import com.thoughtworks.xstream.io.xml.StaxWriter;
023    import org.codehaus.activesoap.Handler;
024    import org.codehaus.activesoap.MessageExchange;
025    
026    import javax.xml.stream.XMLStreamReader;
027    import javax.xml.stream.XMLStreamWriter;
028    
029    /**
030     * Generates a REST/SOAP invocation body from a method call with arguments.
031     *
032     * @version $Revision: 1.4 $
033     */
034    public class XStreamOutputHandler implements Handler {
035        private XStream xstream;
036        private StaxDriver driver;
037        private Object[] args;
038    
039        public XStreamOutputHandler(StaxDriver driver, Object[] args) {
040            this.xstream = new XStream(driver);
041            this.driver = driver;
042            this.args = args;
043        }
044    
045        public XStreamOutputHandler(Object[] args) {
046            this(new StaxDriver(), args);
047        }
048    
049        public XStreamOutputHandler(Object argument) {
050            this(new Object[]{argument});
051        }
052    
053        public void invoke(MessageExchange exchange) throws Exception {
054            XMLStreamReader in = exchange.getIn();
055            XMLStreamWriter out = exchange.getOut();
056    
057            int size = args.length;
058            if (size > 0) {
059                StaxWriter writer = driver.createStaxWriter(out);
060                for (int i = 0; i < size; i++) {
061                    Object arg = args[i];
062                    xstream.marshal(arg, writer);
063                }
064                writer.close();
065            }
066        }
067    }