/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.service.importer.support.internal.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.ServiceReference;
import org.springframework.aop.TargetSource;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.DisposableBean;
/**
* Around interceptor for OSGi service invokers. Uses method invocation to
* execute the call.
*
* <p/> A {@link TargetSource} can be used though it doesn't offer localized
* exceptions (unless information is passed around). The biggest difference as
* opposed to a target source is that mixins call do not require a service
* behind.
*
* However, in the future, this interceptor might be replaced with a
* TargetSource.
*
* @author Costin Leau
*
*/
public abstract class ServiceInvoker implements MethodInterceptor, ServiceReferenceProvider, DisposableBean {
protected transient final Log log = LogFactory.getLog(getClass());
/**
* Actual invocation - the class is being executed on a different object
* then the one exposed in the invocation object.
*
* @param service
* @param invocation
* @return
* @throws Throwable
*/
protected Object doInvoke(Object service, MethodInvocation invocation) throws Throwable {
return AopUtils.invokeJoinpointUsingReflection(service, invocation.getMethod(), invocation.getArguments());
}
public final Object invoke(MethodInvocation invocation) throws Throwable {
return doInvoke(getTarget(), invocation);
}
/**
* Determine the target object to execute the invocation upon.
*
* @return
* @throws Throwable
*/
protected abstract Object getTarget();
/**
* Convenience method exposing the target (OSGi service) reference so that
* subinterceptors can access it. By default, returns null.
*
* @return
*/
public ServiceReference getServiceReference() {
return null;
}
// override so no exception is thrown
public abstract void destroy();
}