package org.jbpm.examples.cdi;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceUnit;
import org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder;
import org.jbpm.runtime.manager.impl.cdi.InjectableRegisterableItemsFactory;
import org.jbpm.services.task.HumanTaskConfigurator;
import org.jbpm.services.task.HumanTaskServiceFactory;
import org.jbpm.services.task.audit.JPATaskLifeCycleEventListener;
import org.jbpm.services.task.identity.DefaultUserInfo;
import org.jbpm.services.task.identity.JBossUserGroupCallbackImpl;
import org.jbpm.services.task.impl.command.CommandBasedTaskService;
import org.kie.api.io.ResourceType;
import org.kie.api.task.TaskService;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.manager.RuntimeEnvironment;
import org.kie.internal.runtime.manager.cdi.qualifier.PerProcessInstance;
import org.kie.internal.runtime.manager.cdi.qualifier.PerRequest;
import org.kie.internal.runtime.manager.cdi.qualifier.Singleton;
import org.kie.internal.task.api.UserGroupCallback;
/**
* CDI producer that provides all required beans for the execution.
*
* IMPORTANT: this is for JavaSE environment and not for JavaEE.
* JavaEE environment should rely on RequestScoped EntityManager and some TransactionInterceptor
* to manage transactions.
* <br/>
* Here complete <code>RuntimeEnvironment</code> is built for selected strategy of RuntimeManager.
*/
@ApplicationScoped
public class EnvironmentProducer {
@Inject
private BeanManager beanManager;
private TaskService taskService;
private EntityManagerFactory emf;
@Produces
@Singleton
@PerRequest
@PerProcessInstance
public RuntimeEnvironment produceEnvironment(EntityManagerFactory emf) {
RuntimeEnvironment environment = RuntimeEnvironmentBuilder.getDefault()
.entityManagerFactory(emf)
.registerableItemsFactory(InjectableRegisterableItemsFactory.getFactory(beanManager, null))
.addAsset(ResourceFactory.newClassPathResource("customtask.bpmn"), ResourceType.BPMN2)
.addAsset(ResourceFactory.newClassPathResource("humanTask.bpmn"), ResourceType.BPMN2)
.get();
return environment;
}
@Produces
public UserGroupCallback produceSelectedUserGroupCalback() {
return new JBossUserGroupCallbackImpl("classpath:/usergroup.properties");
}
@PersistenceUnit(unitName = "org.jbpm.sample")
@ApplicationScoped
@Produces
public EntityManagerFactory getEntityManagerFactory() {
if (this.emf == null) {
this.emf = Persistence.createEntityManagerFactory("org.jbpm.sample");
}
return this.emf;
}
@Produces
public CommandBasedTaskService produceTaskService(EntityManagerFactory emf) {
if (taskService == null) {
HumanTaskConfigurator configurator = HumanTaskServiceFactory.newTaskServiceConfigurator()
.entityManagerFactory(emf)
.userGroupCallback(produceSelectedUserGroupCalback())
.userInfo(new DefaultUserInfo(true))
.listener(new JPATaskLifeCycleEventListener());
this.taskService = (CommandBasedTaskService) configurator.getTaskService();
}
return (CommandBasedTaskService)taskService;
}
}