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 org.codehaus.activesoap.MessageExchange;
021
022 import javax.xml.stream.XMLStreamWriter;
023 import java.lang.reflect.Method;
024
025 /**
026 * @version $Revision: 1.3 $
027 */
028 public class XStreamInvokeMethodHandler extends XStreamHandler {
029 private Class serviceClass;
030 private Method method;
031
032 public XStreamInvokeMethodHandler(Class serviceClass, Method method) {
033 this.serviceClass = serviceClass;
034 this.method = method;
035 }
036
037 // Implementation methods
038 //-------------------------------------------------------------------------
039 protected void handleBody(MessageExchange exchange, Object body, XMLStreamWriter out) throws Exception {
040 Object instance = createService();
041 invokeService(body, exchange, out, instance);
042 }
043
044 /**
045 * Invokes the service on the given serviceInstance
046 */
047 protected void invokeService(Object body, MessageExchange exchange, XMLStreamWriter out, Object serviceInstance) throws Exception {
048 Object answer = method.invoke(serviceInstance, new Object[]{body});
049 if (answer != null) {
050 xstream.marshal(answer, driver.createStaxWriter(out));
051 }
052 }
053
054 /**
055 * Factory method to create a new instance temporary instance of the service
056 *
057 * @return
058 */
059 protected Object createService() throws Exception {
060 return serviceClass.newInstance();
061 }
062 }