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.xmlbeans;
019
020 import org.apache.xmlbeans.XmlObject;
021 import org.codehaus.activesoap.MessageExchange;
022
023 import javax.xml.stream.XMLStreamException;
024 import javax.xml.stream.XMLStreamWriter;
025 import java.lang.reflect.Method;
026
027 /**
028 * @version $Revision: 1.3 $
029 */
030 public class XMLBeansInvokeMethodHandler extends XMLBeansHandler {
031 private Class serviceClass;
032 private Object instance;
033 private Method method;
034
035 public XMLBeansInvokeMethodHandler(Class serviceClass, Method method) {
036 this.serviceClass = serviceClass;
037 this.method = method;
038 }
039
040 public XMLBeansInvokeMethodHandler(Object instance, Method method) {
041 this.instance = instance;
042 this.method = method;
043 if (instance == null) {
044 throw new IllegalArgumentException("instance should not be null");
045 }
046 this.serviceClass = instance.getClass();
047 }
048
049 public XMLBeansInvokeMethodHandler(Class serviceClass, Object instance, Method method) {
050 this.serviceClass = serviceClass;
051 this.instance = instance;
052 this.method = method;
053 }
054
055 // Implementation methods
056 //-------------------------------------------------------------------------
057 protected void handleBody(MessageExchange exchange, XmlObject body, XMLStreamWriter out) throws Exception {
058 Object instance = createService(exchange);
059 invokeService(body, exchange, out, instance);
060 }
061
062 /**
063 * Invokes the service on the given serviceInstance
064 */
065 protected void invokeService(XmlObject body, MessageExchange exchange, XMLStreamWriter out, Object serviceInstance) throws Exception {
066 Object answer = method.invoke(serviceInstance, new Object[]{body});
067 if (answer != null) {
068 if (answer instanceof XmlObject) {
069 reply(exchange, (XmlObject) answer, out);
070 }
071 else {
072 outputServiceResult(exchange, out, body, answer);
073 }
074 }
075 }
076
077 /**
078 * Handles the result of a service invocation which is non null and is not an XMLBeans object.
079 * The default implementation just outputs the String value
080 */
081 protected void outputServiceResult(MessageExchange exchange, XMLStreamWriter out, XmlObject request, Object response) throws XMLStreamException {
082 // TODO think of more ways to handle the return value
083 out.writeCharacters(response.toString());
084 }
085
086 /**
087 * Factory method to create a new instance temporary instance of the service
088 *
089 * @return
090 * @param exchange
091 */
092 protected Object createService(MessageExchange exchange) throws Exception {
093 if (instance != null) {
094 return instance;
095 }
096 return serviceClass.newInstance();
097 }
098 }