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 }