/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.work;
import java.sql.SQLException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import com.enonic.cms.core.plugin.ext.TaskHandlerExtensions;
import com.enonic.cms.store.support.FlexibleAnnotationTransactionAttributeSource;
@Component
public class WorkRunnerImpl
implements WorkRunner
{
@Autowired
private TaskHandlerExtensions extensions;
@Autowired
private SessionFactory sessionFactory;
@Autowired
private TransactionInterceptor transactionInterceptor;
@Value("${cms.scheduler.tx.timeout}")
private int extendedTimeout;
private FlexibleAnnotationTransactionAttributeSource flexibleAnnotationTransactionAttributeSource;
@PostConstruct
public void initService()
{
final TransactionAttributeSource transactionAttributeSource = transactionInterceptor.getTransactionAttributeSource();
flexibleAnnotationTransactionAttributeSource =
new FlexibleAnnotationTransactionAttributeSource( transactionAttributeSource, extendedTimeout );
transactionInterceptor.setTransactionAttributeSource( flexibleAnnotationTransactionAttributeSource );
}
public void executeWork( final String className, final Properties props )
throws Exception
{
flexibleAnnotationTransactionAttributeSource.extendTransactionTimeoutForThisThread();
executeInTx( className, props );
}
private void executeInTx( final String className, final Properties props )
throws Exception
{
final HibernateTemplate template = new HibernateTemplate( sessionFactory );
final Exception exception = template.execute( new HibernateCallback<Exception>()
{
@Override
public Exception doInHibernate( final Session session )
throws HibernateException, SQLException
{
try
{
WorkHelper.executeWork( extensions, className, props );
session.flush();
return null;
}
catch ( final Exception e )
{
return e;
}
}
} );
if ( exception != null )
{
throw exception;
}
}
}