//$Id: SynchronizationInterceptor.java 9241 2008-10-09 01:16:54Z shane.bryzak@jboss.com $
package org.jboss.seam.core;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import org.jboss.seam.annotations.intercept.AroundInvoke;
import org.jboss.seam.annotations.intercept.Interceptor;
import org.jboss.seam.annotations.intercept.InterceptorType;
import org.jboss.seam.intercept.AbstractInterceptor;
import org.jboss.seam.intercept.InvocationContext;
/**
* Serializes calls to a component.
*
* @author Gavin King
*/
@Interceptor(type=InterceptorType.CLIENT)
public class SynchronizationInterceptor extends AbstractInterceptor
{
private static final long serialVersionUID = -4173880108889358566L;
private ReentrantLock lock = new ReentrantLock(true);
@AroundInvoke
public Object aroundInvoke(InvocationContext invocation) throws Exception
{
if ( lock.tryLock( getComponent().getTimeout(), TimeUnit.MILLISECONDS ) )
{
try
{
return invocation.proceed();
}
finally
{
lock.unlock();
}
}
else
{
throw new LockTimeoutException("could not acquire lock on @Synchronized component: " +
getComponent().getName());
}
}
public boolean isInterceptorEnabled()
{
return getComponent().isSynchronize();
}
}