blob: ea1d6e6755435efb9f04d82302d91924914e3af3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tuscany.sca.implementation.spring.provider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.tuscany.sca.implementation.spring.SpringBeanElement;
import org.apache.tuscany.sca.implementation.spring.SpringImplementation;
import org.apache.tuscany.sca.implementation.spring.context.SpringContextWrapper;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
import org.apache.tuscany.sca.runtime.RuntimeComponent;
import org.apache.tuscany.sca.runtime.RuntimeComponentService;
/**
* Initial implementation of a Spring bean invoker
* @version $Rev$ $Date$
*/
public class SpringInvoker implements Invoker {
private Method theMethod = null;
private Object bean;
private SpringBeanElement beanElement;
private boolean badInvoker = false;
private SpringContextWrapper springContext;
private Operation operation;
/**
* SpringInvoker constructor
* @param component - the Spring component to invoke
* @param service - the service to invoke
* @param operation - the operation to invoke
*/
public SpringInvoker(RuntimeComponent component,
SpringContextWrapper springContext,
RuntimeComponentService service,
Operation operation) {
this.springContext = springContext;
this.operation = operation;
// From the component and the service, identify the Spring Bean which is the target
SpringImplementation theImplementation = (SpringImplementation)component.getImplementation();
beanElement = theImplementation.getBeanFromService(service.getService());
if (beanElement == null) {
badInvoker = true;
return;
}
} // end constructor SpringInvoker
// Lazy-load the method to avoid timing problems with the Spring Context
private void setupMethod() throws SpringInvocationException {
try {
bean = springContext.getBean(beanElement.getId());
Class<?> beanClass = bean.getClass();
theMethod = JavaInterfaceUtil.findMethod(beanClass, operation);
//System.out.println("SpringInvoker - found method " + theMethod.getName() );
} catch (NoSuchMethodException e) {
throw new SpringInvocationException(e);
}
}
private Object doInvoke(Object payload) throws SpringInvocationException {
if (theMethod == null)
setupMethod();
if (badInvoker)
throw new SpringInvocationException("Spring invoker incorrectly configured");
// Invoke the method on the Spring bean using the payload, returning the results
try {
Object ret;
if (payload != null && !payload.getClass().isArray()) {
ret = theMethod.invoke(bean, payload);
} else {
ret = theMethod.invoke(bean, (Object[])payload);
}
return ret;
} catch (InvocationTargetException e) {
throw new SpringInvocationException("Spring invoker invoke method '" + theMethod.getName() + "' error.",
e.getCause());
} catch (Exception e) {
throw new SpringInvocationException("Spring invoker invoke method '" + theMethod.getName() + "' error.", e);
}
} // end method doInvoke
/**
* @param msg the message to invoke on the target bean
*/
public Message invoke(Message msg) {
try {
Object resp = doInvoke(msg.getBody());
msg.setBody(resp);
} catch (SpringInvocationException e) {
msg.setFaultBody(e.getCause());
} catch (Throwable e) {
msg.setFaultBody(e);
}
//System.out.println("Spring Invoker - invoke called");
return msg;
} // end method invoke
} // end class SpringInvoker