/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.store.support;
import org.springframework.transaction.interceptor.TransactionAttribute;
/**
* overrides transaction timeouts inside spring transaction manager
*/
public class FlexibleTransactionAttribute
implements TransactionAttribute
{
private final TransactionAttribute transactionAttribute;
private ThreadLocal<Boolean> longTransaction;
private int extendedTimeout;
public FlexibleTransactionAttribute( final TransactionAttribute transactionAttribute, final ThreadLocal<Boolean> longTransaction,
final int extendedTimeout )
{
this.transactionAttribute = transactionAttribute;
this.longTransaction = longTransaction;
this.extendedTimeout = extendedTimeout;
}
@Override
public String getQualifier()
{
return transactionAttribute.getQualifier();
}
@Override
public boolean rollbackOn( final Throwable ex )
{
return transactionAttribute.rollbackOn( ex );
}
@Override
public int getPropagationBehavior()
{
return transactionAttribute.getPropagationBehavior();
}
@Override
public int getIsolationLevel()
{
return transactionAttribute.getIsolationLevel();
}
@Override
public int getTimeout()
{
final int timeout = transactionAttribute.getTimeout();
// do not decrease timeout
if ( timeout >= extendedTimeout )
{
return timeout;
}
final boolean isLongTransaction = longTransaction.get() != null && longTransaction.get();
return isLongTransaction ? extendedTimeout : timeout;
}
@Override
public boolean isReadOnly()
{
return transactionAttribute.isReadOnly();
}
@Override
public String getName()
{
return transactionAttribute.getName();
}
}