/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.activiti.jta;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.cfg.jta.JtaTransactionContextFactory;
import org.activiti.engine.impl.db.DbSqlSession;
import org.activiti.engine.impl.db.DbSqlSessionFactory;
import org.activiti.engine.impl.interceptor.CommandContextInterceptor;
import org.activiti.engine.impl.interceptor.CommandInterceptor;
import org.activiti.engine.impl.persistence.deploy.Deployer;
import org.activiti.engine.impl.util.ReflectUtil;
import org.activiti.engine.impl.variable.EntityManagerSession;
import org.activiti.engine.impl.variable.JPAEntityVariableType;
import org.activiti.engine.impl.variable.SerializableType;
import org.activiti.engine.impl.variable.VariableType;
import ru.codeinside.gses.activiti.DeployerCustomizer;
import ru.codeinside.gses.activiti.history.HistoricDbSqlSessionFactory;
import ru.codeinside.gses.service.CryptoProviderAware;
import ru.codeinside.gses.webui.TaskServiceImpl2;
import ru.codeinside.gws.api.CryptoProvider;
import javax.enterprise.inject.spi.BeanManager;
import javax.persistence.EntityManager;
import javax.transaction.TransactionManager;
import java.io.InputStream;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
final public class JtaProcessEngineConfiguration extends ProcessEngineConfigurationImpl implements CryptoProviderAware {
private final CryptoProvider cryptoProvider;
private final TransactionManager transactionManager;
private final BeanManager beanManager;
private final EntityManager em;
public JtaProcessEngineConfiguration(
TransactionManager transactionManager, CryptoProvider cryptoProvider, BeanManager beanManager, EntityManager em) {
this.transactionManager = transactionManager;
this.cryptoProvider = cryptoProvider;
this.beanManager = beanManager;
this.em = em;
// Включить историю изменения переменных:
history = HISTORY_FULL;
// расширение сервиса:
taskService = new TaskServiceImpl2();
}
@Override
protected void initExpressionManager() {
expressionManager = new CdiExpressionManager(beanManager);
}
@Override
protected void initSessionFactories() {
super.initSessionFactories();
DbSqlSessionFactory factory = (DbSqlSessionFactory) sessionFactories.get(DbSqlSession.class);
sessionFactories.put(factory.getSessionType(), new HistoricDbSqlSessionFactory(factory));
}
@Override
protected void initIdGenerator() {
idGenerator = new IdGenerator();
}
@Override
protected InputStream getMyBatisXmlConfigurationSteam() {
return ReflectUtil.getResourceAsStream("activiti-db-mapping/custom.xml");
}
@Override
protected Collection<? extends Deployer> getDefaultDeployers() {
return DeployerCustomizer.customize(super.getDefaultDeployers(), false);
}
@Override
protected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequired() {
final JtaTransactionInterceptor i1 = new JtaTransactionInterceptor(transactionManager, false);
final CommandContextInterceptor i2 = new CommandContextInterceptor(commandContextFactory, this);
return Arrays.asList(i1, i2);
}
@Override
protected Collection<? extends CommandInterceptor> getDefaultCommandInterceptorsTxRequiresNew() {
final JtaTransactionInterceptor i1 = new JtaTransactionInterceptor(transactionManager, true);
final CommandContextInterceptor i2 = new CommandContextInterceptor(commandContextFactory, this);
return Arrays.asList(i1, i2);
}
@Override
public CryptoProvider getCryptoProviderProxy() {
return cryptoProvider;
}
/**
* Создаём согласованный c сервисами EM.
*/
@Override
protected void initJpa() {
sessionFactories.put(EntityManagerSession.class, new JtaEntityManagerSessionFactory(em));
VariableType jpaType = variableTypes.getVariableType(JPAEntityVariableType.TYPE_NAME);
if (jpaType == null) {
int serializableIndex = variableTypes.getTypeIndex(SerializableType.TYPE_NAME);
if (serializableIndex > -1) {
variableTypes.addType(new JPAEntityVariableType(), serializableIndex);
} else {
variableTypes.addType(new JPAEntityVariableType());
}
}
}
/**
* Управление транзакциями в JTA.
*/
@Override
protected void initTransactionFactory() {
if (transactionFactory == null) {
transactionFactory = new JtaTransactionFactory();
}
}
/**
* Контекст управления транзакциями в JTA.
*/
@Override
protected void initTransactionContextFactory() {
if (transactionContextFactory == null) {
transactionContextFactory = new JtaTransactionContextFactory(transactionManager);
}
}
/**
* Связанный с EntityManager источник данных внтури JTA.
*/
@Override
protected void initDataSource() {
if (dataSource == null) {
dataSource = new JtaEntityManagerDataSource(em);
try {
DatabaseMetaData databaseMetaData = dataSource.getConnection().getMetaData();
String databaseProductName = databaseMetaData.getDatabaseProductName();
databaseType = databaseTypeMappings.getProperty(databaseProductName);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}