/*
* 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.webui;
import com.google.common.collect.Lists;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.impl.bpmn.parser.BpmnParseListener;
import org.activiti.engine.impl.jobexecutor.JobExecutor;
import org.glassfish.embeddable.Deployer;
import org.glassfish.osgicdi.OSGiService;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.gses.API;
import ru.codeinside.gses.activiti.ReceiptEnsurance;
import ru.codeinside.gses.activiti.forms.types.VariableTypes;
import ru.codeinside.gses.activiti.jta.JtaProcessEngineConfiguration;
import ru.codeinside.gses.activiti.listeners.GsesBpmnParseListener;
import ru.codeinside.gses.activiti.listeners.MailBpmnParseListener;
import ru.codeinside.gses.webui.utils.RunProfile;
import ru.codeinside.gws.api.CryptoProvider;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.DependsOn;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.TransactionManager;
import java.util.logging.Logger;
@Singleton
@DependsOn("BaseBean")
@Lock(LockType.READ)
public class Configurator {
final static Logger logger = Logger.getLogger(Configurator.class.getName());
private static ProcessEngine processEngine;
private static Deployer embeddableDeployer;
@Resource
TransactionManager transactionManager;
@PersistenceContext(unitName = "myPU")
EntityManager em;
@Inject
BeanManager beanManager;
@Inject
@OSGiService(dynamic = true)
CryptoProvider cryptoProvider;
@Inject
ActivitiJobProvider activitiJobProvider;
@Inject
Instance<ReceiptEnsurance> receiptEnsuranceHolder;
@Resource
Deployer deployer;
@Named("doDbUpdate")
@Inject
Instance<Boolean> doDbUpdate;
public static ProcessEngine get() {
return processEngine;
}
public static Deployer getDeployer() {
return embeddableDeployer;
}
@Produces
@ApplicationScoped
public ProcessEngine getProcessEngine() {
synchronized (Configurator.class) {
if (processEngine == null) {
processEngine = createProcessEngine();
}
return processEngine;
}
}
/**
* Заполняет свойства конфига необходимые для подключения к SMTP и отправке сообщения из Activiti.
* Свойства выставляются только в том случае если значение, прочтеное из настроек не null, в противном случае
* будет сохранено значение по умолчанию.
* Значения по умолчанию можно посмотреть здесь http://activiti.org/userguide/index.html#bpmnEmailTaskServerConfiguration
*
* @param cfg activiti engine config
*/
private void fillSmtpConfig(ProcessEngineConfiguration cfg) {
if (AdminServiceProvider.get().getSystemProperty(API.MT_PORT) != null) {
cfg.setMailServerPort(Integer.valueOf(AdminServiceProvider.get().getSystemProperty(API.MT_PORT)));
}
if (AdminServiceProvider.get().getSystemProperty(API.MT_HOST) != null) {
cfg.setMailServerHost(AdminServiceProvider.get().getSystemProperty(API.MT_HOST));
}
if (AdminServiceProvider.get().getSystemProperty(API.MT_SENDER_LOGIN) != null) {
cfg.setMailServerUsername(AdminServiceProvider.get().getSystemProperty(API.MT_SENDER_LOGIN));
}
if (AdminServiceProvider.get().getSystemProperty(API.MT_PASSWORD) != null) {
cfg.setMailServerPassword(AdminServiceProvider.get().getSystemProperty(API.MT_PASSWORD));
}
if (AdminServiceProvider.get().getSystemProperty(API.MT_TLS) != null) {
cfg.setMailServerUseTLS(Boolean.valueOf(AdminServiceProvider.get().getSystemProperty(API.MT_TLS)));
}
if (AdminServiceProvider.get().getSystemProperty(API.MT_DEFAULT_FROM) != null) {
cfg.setMailServerDefaultFrom(AdminServiceProvider.get().getSystemProperty(API.MT_DEFAULT_FROM));
}
}
@PostConstruct
public void postConstruct() {
if (deployer != null) {
embeddableDeployer = deployer;
}
}
@PreDestroy
public void close() {
closeEngine();
}
private ProcessEngine createProcessEngine() {
logger.info("Запуск исполнителя процессов");
JtaProcessEngineConfiguration cfg = new JtaProcessEngineConfiguration(
transactionManager, cryptoProvider, beanManager, em
);
// асинхронное исполнение
JobExecutor jobExecutor = activitiJobProvider.createJobExecutor();
if (jobExecutor != null) {
cfg.setJobExecutor(jobExecutor);
cfg.setJobExecutorActivate(true);
}
Boolean update = doDbUpdate.isUnsatisfied() ? !RunProfile.isProduction() : doDbUpdate.get();
cfg.setDatabaseSchemaUpdate(Boolean.TRUE.equals(update) ? "true" : "false");
cfg.setCustomPostBPMNParseListeners(
Lists.<BpmnParseListener>newArrayList(
new GsesBpmnParseListener(receiptEnsuranceHolder.get()),
new MailBpmnParseListener()
)
);
cfg.setProcessEngineName("СИУ");
cfg.setFormTypes(new VariableTypes());
// читаем настройки подключения к smtp серверу
fillSmtpConfig(cfg);
return cfg.buildProcessEngine();
}
private void closeEngine() {
if (processEngine != null) {
logger.info("Выключение исполнителя процессов");
processEngine.close();
processEngine = null;
}
}
}