package org.jbpm.persistence.processinstance;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import org.drools.common.InternalKnowledgeRuntime;
import org.drools.definition.process.Process;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.process.ProcessInstance;
import org.jbpm.persistence.ProcessPersistenceContext;
import org.jbpm.persistence.ProcessPersistenceContextManager;
import org.jbpm.process.instance.ProcessInstanceManager;
import org.jbpm.process.instance.impl.ProcessInstanceImpl;
public class JPAProcessInstanceManager
implements
ProcessInstanceManager {
private InternalKnowledgeRuntime kruntime;
private transient Map<Long, ProcessInstance> processInstances;
public void setKnowledgeRuntime(InternalKnowledgeRuntime kruntime) {
this.kruntime = kruntime;
}
public void addProcessInstance(ProcessInstance processInstance) {
ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo( processInstance, this.kruntime.getEnvironment() );
ProcessPersistenceContext context = ((ProcessPersistenceContextManager) this.kruntime.getEnvironment().get( EnvironmentName.PERSISTENCE_CONTEXT_MANAGER )).getProcessPersistenceContext();
context.persist( processInstanceInfo );
//em.refresh( processInstanceInfo );
// em.flush();
//em.getTransaction().commit();
((org.jbpm.process.instance.ProcessInstance) processInstance).setId( processInstanceInfo.getId() );
processInstanceInfo.updateLastReadDate();
internalAddProcessInstance(processInstance);
}
public void internalAddProcessInstance(ProcessInstance processInstance) {
if (this.processInstances == null) {
this.processInstances = new HashMap<Long, ProcessInstance>();
}
processInstances.put(processInstance.getId(), processInstance);
}
public ProcessInstance getProcessInstance(long id) {
org.jbpm.process.instance.ProcessInstance processInstance = null;
if (this.processInstances != null) {
processInstance = (org.jbpm.process.instance.ProcessInstance) this.processInstances.get(id);
if (processInstance != null) {
return processInstance;
}
}
ProcessPersistenceContext context = ((ProcessPersistenceContextManager) this.kruntime.getEnvironment().get( EnvironmentName.PERSISTENCE_CONTEXT_MANAGER )).getProcessPersistenceContext();
ProcessInstanceInfo processInstanceInfo = context.findProcessInstanceInfo( id );
if ( processInstanceInfo == null ) {
return null;
}
processInstanceInfo.updateLastReadDate();
processInstance = (org.jbpm.process.instance.ProcessInstance)
processInstanceInfo.getProcessInstance(kruntime, this.kruntime.getEnvironment());
Process process = kruntime.getKnowledgeBase().getProcess( processInstance.getProcessId() );
if ( process == null ) {
throw new IllegalArgumentException( "Could not find process " + processInstance.getProcessId() );
}
processInstance.setProcess( process );
if ( processInstance.getKnowledgeRuntime() == null ) {
processInstance.setKnowledgeRuntime( kruntime );
((ProcessInstanceImpl) processInstance).reconnect();
}
return processInstance;
}
public Collection<ProcessInstance> getProcessInstances() {
return new ArrayList<ProcessInstance>();
}
public void removeProcessInstance(ProcessInstance processInstance) {
ProcessPersistenceContext context = ((ProcessPersistenceContextManager) this.kruntime.getEnvironment().get( EnvironmentName.PERSISTENCE_CONTEXT_MANAGER )).getProcessPersistenceContext();
// EntityManager em = (EntityManager) this.kruntime.getEnvironment().get( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER );
// ProcessInstanceInfo processInstanceInfo = em.find( ProcessInstanceInfo.class,
// processInstance.getId() );
ProcessInstanceInfo processInstanceInfo = context.findProcessInstanceInfo( processInstance.getId() );
if ( processInstanceInfo != null ) {
context.remove( processInstanceInfo );
}
internalRemoveProcessInstance(processInstance);
}
public void internalRemoveProcessInstance(ProcessInstance processInstance) {
if (this.processInstances != null) {
processInstances.remove( processInstance.getId() );
}
}
public void clearProcessInstances() {
if (processInstances != null) {
for (ProcessInstance processInstance: new ArrayList<ProcessInstance>(processInstances.values())) {
((ProcessInstanceImpl) processInstance).disconnect();
}
}
}
}