mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged BRANCHES/DEV/V4.1-BUG-FIX/root to HEAD/root:
38400: ALF-14438: Accepted patch from BRANCHES/DEV/BELARUS/... with some modifications and using activiti-naming-conventions git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@38402 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -27,6 +27,7 @@ import org.alfresco.service.Auditable;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
@@ -185,6 +186,14 @@ public interface WorkflowComponent
|
||||
*/
|
||||
public List<WorkflowInstance> getWorkflows(String workflowDefinitionId);
|
||||
|
||||
/**
|
||||
* Gets all "in-flight" workflow instances according to the specified workflowInstanceQuery parameter
|
||||
*
|
||||
* @param workflowInstanceQuery
|
||||
* @return the list of "in-flight" workflow instances
|
||||
*/
|
||||
public List<WorkflowInstance> getWorkflows(WorkflowInstanceQuery workflowInstanceQuery);
|
||||
|
||||
/**
|
||||
* Gets all "in-flight" active workflow instances.
|
||||
*
|
||||
|
@@ -51,6 +51,7 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowException;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
@@ -424,13 +425,7 @@ public class WorkflowServiceImpl implements WorkflowService
|
||||
*/
|
||||
public List<WorkflowInstance> getActiveWorkflows(String workflowDefinitionId)
|
||||
{
|
||||
if(workflowDefinitionId==null)
|
||||
{
|
||||
return getActiveWorkflows();
|
||||
}
|
||||
String engineId = BPMEngineRegistry.getEngineId(workflowDefinitionId);
|
||||
WorkflowComponent component = getWorkflowComponent(engineId);
|
||||
return component.getActiveWorkflows(workflowDefinitionId);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, true));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -438,14 +433,7 @@ public class WorkflowServiceImpl implements WorkflowService
|
||||
*/
|
||||
public List<WorkflowInstance> getCompletedWorkflows(String workflowDefinitionId)
|
||||
{
|
||||
if(workflowDefinitionId==null)
|
||||
{
|
||||
return getCompletedWorkflows();
|
||||
}
|
||||
|
||||
String engineId = BPMEngineRegistry.getEngineId(workflowDefinitionId);
|
||||
WorkflowComponent component = getWorkflowComponent(engineId);
|
||||
return component.getCompletedWorkflows(workflowDefinitionId);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -453,19 +441,13 @@ public class WorkflowServiceImpl implements WorkflowService
|
||||
*/
|
||||
public List<WorkflowInstance> getWorkflows(String workflowDefinitionId)
|
||||
{
|
||||
if(workflowDefinitionId==null)
|
||||
{
|
||||
return getWorkflows();
|
||||
}
|
||||
String engineId = BPMEngineRegistry.getEngineId(workflowDefinitionId);
|
||||
WorkflowComponent component = getWorkflowComponent(engineId);
|
||||
return component.getWorkflows(workflowDefinitionId);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public List<WorkflowInstance> getActiveWorkflows()
|
||||
@Override
|
||||
public List<WorkflowInstance> getWorkflows(final WorkflowInstanceQuery workflowInstanceQuery)
|
||||
{
|
||||
if(workflowInstanceQuery.getWorkflowDefinitionId() == null)
|
||||
{
|
||||
List<String> ids = Arrays.asList(registry.getWorkflowComponents());
|
||||
return CollectionUtils.transformFlat(ids, new Function<String, Collection<WorkflowInstance>>()
|
||||
@@ -473,25 +455,30 @@ public class WorkflowServiceImpl implements WorkflowService
|
||||
public List<WorkflowInstance> apply(String id)
|
||||
{
|
||||
WorkflowComponent component = registry.getWorkflowComponent(id);
|
||||
return component.getActiveWorkflows();
|
||||
return component.getWorkflows(workflowInstanceQuery);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
String engineId = BPMEngineRegistry.getEngineId(workflowInstanceQuery.getWorkflowDefinitionId());
|
||||
WorkflowComponent component = getWorkflowComponent(engineId);
|
||||
return component.getWorkflows(workflowInstanceQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public List<WorkflowInstance> getActiveWorkflows()
|
||||
{
|
||||
return getWorkflows(new WorkflowInstanceQuery(true));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public List<WorkflowInstance> getCompletedWorkflows()
|
||||
{
|
||||
List<String> ids = Arrays.asList(registry.getWorkflowComponents());
|
||||
return CollectionUtils.transformFlat(ids, new Function<String, Collection<WorkflowInstance>>()
|
||||
{
|
||||
public List<WorkflowInstance> apply(String id)
|
||||
{
|
||||
WorkflowComponent component = registry.getWorkflowComponent(id);
|
||||
return component.getCompletedWorkflows();
|
||||
}
|
||||
});
|
||||
return getWorkflows(new WorkflowInstanceQuery(false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -499,15 +486,7 @@ public class WorkflowServiceImpl implements WorkflowService
|
||||
*/
|
||||
public List<WorkflowInstance> getWorkflows()
|
||||
{
|
||||
List<String> ids = Arrays.asList(registry.getWorkflowComponents());
|
||||
return CollectionUtils.transformFlat(ids, new Function<String, Collection<WorkflowInstance>>()
|
||||
{
|
||||
public List<WorkflowInstance> apply(String id)
|
||||
{
|
||||
WorkflowComponent component = registry.getWorkflowComponent(id);
|
||||
return component.getWorkflows();
|
||||
}
|
||||
});
|
||||
return getWorkflows(new WorkflowInstanceQuery());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -69,7 +69,6 @@ import org.activiti.engine.repository.ProcessDefinition;
|
||||
import org.activiti.engine.runtime.Execution;
|
||||
import org.activiti.engine.runtime.Job;
|
||||
import org.activiti.engine.runtime.ProcessInstance;
|
||||
import org.activiti.engine.runtime.ProcessInstanceQuery;
|
||||
import org.activiti.engine.task.Task;
|
||||
import org.activiti.engine.task.TaskQuery;
|
||||
import org.alfresco.model.ContentModel;
|
||||
@@ -84,6 +83,8 @@ import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.repo.workflow.WorkflowNodeConverter;
|
||||
import org.alfresco.repo.workflow.WorkflowObjectFactory;
|
||||
import org.alfresco.repo.workflow.activiti.properties.ActivitiPropertyConverter;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
@@ -95,6 +96,8 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowException;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery.DatePosition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
@@ -186,6 +189,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
private FormService formService;
|
||||
private ActivitiUtil activitiUtil;
|
||||
|
||||
private DictionaryService dictionaryService;
|
||||
private NodeService nodeService;
|
||||
private SearchService unprotectedSearchService;
|
||||
private PersonService personService;
|
||||
@@ -366,7 +370,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(null, true);
|
||||
return getWorkflows(new WorkflowInstanceQuery(true));
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -383,7 +387,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(null, false);
|
||||
return getWorkflows(new WorkflowInstanceQuery(false));
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -400,7 +404,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(null, null);
|
||||
return getWorkflows(new WorkflowInstanceQuery());
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -416,7 +420,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(workflowDefinitionId, true);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, true));
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -469,7 +473,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(workflowDefinitionId, false);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, false));
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -936,7 +940,7 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
{
|
||||
try
|
||||
{
|
||||
return getWorkflowInstances(workflowDefinitionId, null);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId));
|
||||
}
|
||||
catch(ActivitiException ae)
|
||||
{
|
||||
@@ -1284,6 +1288,15 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
this.propertyConverter = propertyConverter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Dictionary Service
|
||||
* @param dictionaryService
|
||||
*/
|
||||
public void setDictionaryService(DictionaryService dictionaryService)
|
||||
{
|
||||
this.dictionaryService = dictionaryService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Node Service
|
||||
*
|
||||
@@ -2190,33 +2203,134 @@ public class ActivitiWorkflowEngine extends BPMEngine implements WorkflowEngine
|
||||
}
|
||||
}
|
||||
|
||||
private List<WorkflowInstance> getWorkflowInstances(String workflowDefinitionId, Boolean isActive)
|
||||
@Override
|
||||
public List<WorkflowInstance> getWorkflows(WorkflowInstanceQuery workflowInstanceQuery)
|
||||
{
|
||||
String processDefId = workflowDefinitionId==null ? null : createLocalId(workflowDefinitionId);
|
||||
LinkedList<WorkflowInstance> results = new LinkedList<WorkflowInstance>();
|
||||
if(Boolean.FALSE.equals(isActive)==false)
|
||||
if (Boolean.FALSE.equals(workflowInstanceQuery.getActive()) == false)
|
||||
{
|
||||
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery();
|
||||
if(processDefId!=null)
|
||||
{
|
||||
query = query.processDefinitionId(processDefId);
|
||||
}
|
||||
List<ProcessInstance> activeInstances = query.list();
|
||||
List<WorkflowInstance> activeResults = typeConverter.convert(activeInstances);
|
||||
results.addAll(activeResults);
|
||||
//Add active.
|
||||
results.addAll(getWorkflowsInternal(workflowInstanceQuery, true));
|
||||
}
|
||||
if(Boolean.TRUE.equals(isActive)==false)
|
||||
if (Boolean.TRUE.equals(workflowInstanceQuery.getActive()) == false)
|
||||
{
|
||||
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
|
||||
.finished();
|
||||
if(processDefId!=null)
|
||||
//Add complete
|
||||
results.addAll(getWorkflowsInternal(workflowInstanceQuery, false));
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private List<WorkflowInstance> getWorkflowsInternal(WorkflowInstanceQuery workflowInstanceQuery, boolean isActive)
|
||||
{
|
||||
String processDefId = workflowInstanceQuery.getWorkflowDefinitionId() == null ? null : createLocalId(workflowInstanceQuery.getWorkflowDefinitionId());
|
||||
LinkedList<WorkflowInstance> results = new LinkedList<WorkflowInstance>();
|
||||
|
||||
HistoricProcessInstanceQuery query;
|
||||
if (isActive)
|
||||
{
|
||||
// Don't use ProcessInstanceQuery here because in any case they will be converted to WorkflowInstance thro HistoricProcessInstance.
|
||||
query = historyService.createHistoricProcessInstanceQuery().unfinished();
|
||||
}
|
||||
else
|
||||
{
|
||||
query = historyService.createHistoricProcessInstanceQuery().finished();
|
||||
}
|
||||
|
||||
if(processDefId!=null)
|
||||
{
|
||||
query = query.processDefinitionId(processDefId);
|
||||
}
|
||||
|
||||
if(workflowInstanceQuery.getExcludedDefinitions() != null)
|
||||
{
|
||||
List<String> exDefIds = new ArrayList<String>();
|
||||
for (String excludedDef : workflowInstanceQuery.getExcludedDefinitions())
|
||||
{
|
||||
String exDef = createLocalId(excludedDef);
|
||||
exDef = exDef.replaceAll("\\*", "%");
|
||||
exDefIds.add(exDef);
|
||||
}
|
||||
|
||||
if(exDefIds.size() > 0)
|
||||
{
|
||||
query.processDefinitionKeyNotIn(exDefIds);
|
||||
}
|
||||
}
|
||||
|
||||
// Check start range
|
||||
if (workflowInstanceQuery.getStartBefore() != null)
|
||||
{
|
||||
query.startedBefore(workflowInstanceQuery.getStartBefore());
|
||||
|
||||
}
|
||||
if (workflowInstanceQuery.getStartAfter() != null)
|
||||
{
|
||||
query.startedAfter(workflowInstanceQuery.getStartAfter());
|
||||
}
|
||||
|
||||
// check end range
|
||||
if (workflowInstanceQuery.getEndBefore() != null)
|
||||
{
|
||||
query.finishedBefore(workflowInstanceQuery.getEndBefore());
|
||||
}
|
||||
if (workflowInstanceQuery.getEndAfter() != null)
|
||||
{
|
||||
query.finishedAfter(workflowInstanceQuery.getEndAfter());
|
||||
}
|
||||
|
||||
if (workflowInstanceQuery.getCustomProps() != null)
|
||||
{
|
||||
for (Map.Entry<QName, Object> prop : workflowInstanceQuery.getCustomProps().entrySet())
|
||||
{
|
||||
query = query.processDefinitionId(processDefId);
|
||||
String propertyName = factory.mapQNameToName(prop.getKey());
|
||||
if (prop.getValue() == null)
|
||||
{
|
||||
query.variableValueEquals(propertyName, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
PropertyDefinition propertyDefinition = dictionaryService.getProperty(prop.getKey());
|
||||
if (propertyDefinition == null)
|
||||
{
|
||||
Object converted = propertyConverter.convertPropertyToValue(prop.getValue());
|
||||
query.variableValueEquals(propertyName, converted);
|
||||
}
|
||||
else
|
||||
{
|
||||
String propertyType = propertyDefinition.getDataType().getJavaClassName();
|
||||
if (propertyType.equals("java.util.Date"))
|
||||
{
|
||||
Map<DatePosition, Date> dateProps = (Map<DatePosition, Date>) prop.getValue();
|
||||
for (Map.Entry<DatePosition, Date> dateProp : dateProps.entrySet())
|
||||
{
|
||||
if (dateProp.getValue() != null)
|
||||
{
|
||||
if (dateProp.getKey() == DatePosition.BEFORE)
|
||||
{
|
||||
query.variableValueLessThanOrEqual(propertyName, dateProp.getValue());
|
||||
}
|
||||
if (dateProp.getKey() == DatePosition.AFTER)
|
||||
{
|
||||
query.variableValueGreaterThanOrEqual(propertyName, dateProp.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Object convertedValue = DefaultTypeConverter.INSTANCE.convert(propertyDefinition.getDataType(), prop.getValue());
|
||||
query.variableValueEquals(propertyName, convertedValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<HistoricProcessInstance> completedInstances = query.list();
|
||||
List<WorkflowInstance> completedResults = typeConverter.convert(completedInstances);
|
||||
results.addAll(completedResults);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
|
@@ -109,6 +109,7 @@ public class ActivitiWorkflowManagerFactory implements FactoryBean<ActivitiWorkf
|
||||
workflowEngine.setMessageService(messageService);
|
||||
workflowEngine.setNamespaceService(namespaceService);
|
||||
workflowEngine.setNodeConverter(nodeConverter);
|
||||
workflowEngine.setDictionaryService(dictionaryService);
|
||||
workflowEngine.setNodeService(nodeService);
|
||||
workflowEngine.setPersonService(personService);
|
||||
workflowEngine.setPropertyConverter(propertyConverter);
|
||||
|
@@ -912,6 +912,13 @@ public class ActivitiPropertyConverter
|
||||
description = factory.getTaskDescription(startTaskType, wfDefKey, wfDescription, startEventName);
|
||||
defaultProperties.put(WorkflowModel.PROP_DESCRIPTION, description);
|
||||
}
|
||||
|
||||
//Special case for workflowDueDate.
|
||||
if(!defaultProperties.containsKey(WorkflowModel.PROP_WORKFLOW_DUE_DATE) && taskProperties.containsKey(WorkflowModel.PROP_WORKFLOW_DUE_DATE))
|
||||
{
|
||||
defaultProperties.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, null);
|
||||
}
|
||||
|
||||
return handlerRegistry.handleVariablesToSet(defaultProperties, startTaskType, null, Void.class);
|
||||
}
|
||||
|
||||
|
@@ -23,6 +23,7 @@ import java.io.InputStream;
|
||||
import java.io.Serializable;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
@@ -31,6 +32,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
@@ -40,6 +42,7 @@ import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authority.AuthorityDAO;
|
||||
import org.alfresco.repo.workflow.AlfrescoBpmEngine;
|
||||
import org.alfresco.repo.workflow.BPMEngineRegistry;
|
||||
import org.alfresco.repo.workflow.WorkflowConstants;
|
||||
import org.alfresco.repo.workflow.WorkflowEngine;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
@@ -60,6 +63,7 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDeployment;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowException;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowNode;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
@@ -68,11 +72,13 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTimer;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTransition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstanceQuery.DatePosition;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.GUID;
|
||||
import org.alfresco.util.collections.CollectionUtils;
|
||||
import org.alfresco.util.collections.Function;
|
||||
import org.apache.commons.lang.time.DateUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.hibernate.CacheMode;
|
||||
@@ -93,6 +99,10 @@ import org.jbpm.context.exe.ContextInstance;
|
||||
import org.jbpm.context.exe.TokenVariableMap;
|
||||
import org.jbpm.context.exe.VariableInstance;
|
||||
import org.jbpm.context.exe.converter.BooleanToStringConverter;
|
||||
import org.jbpm.context.exe.variableinstance.DateInstance;
|
||||
import org.jbpm.context.exe.variableinstance.LongInstance;
|
||||
import org.jbpm.context.exe.variableinstance.NullInstance;
|
||||
import org.jbpm.context.exe.variableinstance.StringInstance;
|
||||
import org.jbpm.db.GraphSession;
|
||||
import org.jbpm.db.TaskMgmtSession;
|
||||
import org.jbpm.file.def.FileDefinition;
|
||||
@@ -812,7 +822,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
*/
|
||||
public List<WorkflowInstance> getActiveWorkflows()
|
||||
{
|
||||
return getWorkflowsInternal(null, true);
|
||||
return getWorkflows(new WorkflowInstanceQuery(true));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -821,7 +831,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
@Override
|
||||
public List<WorkflowInstance> getCompletedWorkflows()
|
||||
{
|
||||
return getWorkflowsInternal(null, false);
|
||||
return getWorkflows(new WorkflowInstanceQuery(false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -830,7 +840,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
@Override
|
||||
public List<WorkflowInstance> getWorkflows()
|
||||
{
|
||||
return getWorkflowsInternal(null, null);
|
||||
return getWorkflows(new WorkflowInstanceQuery());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -838,7 +848,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
*/
|
||||
public List<WorkflowInstance> getActiveWorkflows(final String workflowDefinitionId)
|
||||
{
|
||||
return getWorkflowsInternal(workflowDefinitionId, true);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, true));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -846,7 +856,7 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
*/
|
||||
public List<WorkflowInstance> getCompletedWorkflows(final String workflowDefinitionId)
|
||||
{
|
||||
return getWorkflowsInternal(workflowDefinitionId, false);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId, false));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -854,51 +864,214 @@ public class JBPMEngine extends AlfrescoBpmEngine implements WorkflowEngine
|
||||
*/
|
||||
public List<WorkflowInstance> getWorkflows(final String workflowDefinitionId)
|
||||
{
|
||||
return getWorkflowsInternal(workflowDefinitionId, null);
|
||||
return getWorkflows(new WorkflowInstanceQuery(workflowDefinitionId));
|
||||
}
|
||||
|
||||
private List<WorkflowInstance> getWorkflowsInternal(String workflowDefinitionId, Boolean active)
|
||||
@Override
|
||||
public List<WorkflowInstance> getWorkflows(final WorkflowInstanceQuery query)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Long processDefId = workflowDefinitionId == null ? null : getJbpmId(workflowDefinitionId);
|
||||
List<ProcessInstance> instances = getProcessInstances(processDefId, active);
|
||||
List<ProcessInstance> instances = getProcessInstances(query);
|
||||
return convertWorkflows(instances);
|
||||
|
||||
}
|
||||
catch(JbpmException e)
|
||||
{
|
||||
String msg = messageService.getMessage(ERR_GET_ACTIVE_WORKFLOW_INSTS, workflowDefinitionId);
|
||||
String msg = messageService.getMessage(ERR_GET_ACTIVE_WORKFLOW_INSTS, query.getWorkflowDefinitionId());
|
||||
throw new WorkflowException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private List<ProcessInstance> getProcessInstances(final Long processDefId, final Boolean active)
|
||||
private List<ProcessInstance> getProcessInstances(final WorkflowInstanceQuery query)
|
||||
{
|
||||
return (List<ProcessInstance>) jbpmTemplate.execute(new JbpmCallback()
|
||||
{
|
||||
public Object doInJbpm(JbpmContext context)
|
||||
{
|
||||
Session session = context.getSession();
|
||||
Criteria criteria = session.createCriteria(ProcessInstance.class);
|
||||
|
||||
StringBuilder processSelect = new StringBuilder(1024)
|
||||
.append("select process from org.jbpm.graph.exe.ProcessInstance as process");
|
||||
StringBuilder processWhere = new StringBuilder(1024);
|
||||
Map<String, Object> processMap = new TreeMap<String, Object>();
|
||||
|
||||
Long processDefId = query.getWorkflowDefinitionId() == null ? null : getJbpmId(query
|
||||
.getWorkflowDefinitionId());
|
||||
if(processDefId!=null)
|
||||
{
|
||||
Criteria definitionCriteria = criteria.createCriteria("processDefinition");
|
||||
definitionCriteria.add(Restrictions.eq("id", processDefId));
|
||||
processSelect.append(" join process.processDefinition as definition");
|
||||
processWhere.append(" and definition.id = :processDefId");
|
||||
processMap.put("processDefId", processDefId);
|
||||
}
|
||||
if(Boolean.TRUE.equals(active))
|
||||
|
||||
List<String> exludedDefs = query.getExcludedDefinitions();
|
||||
if (exludedDefs != null && exludedDefs.size() > 0)
|
||||
{
|
||||
criteria.add(Restrictions.isNull("end"));
|
||||
if (processDefId == null)
|
||||
{
|
||||
processSelect.append(" join process.processDefinition as definition");
|
||||
}
|
||||
for (String exDef : exludedDefs)
|
||||
{
|
||||
exDef = BPMEngineRegistry.getLocalId(exDef);
|
||||
exDef = exDef.replaceAll("\\*", "%");
|
||||
processWhere.append(" and definition.name not like '").append(exDef).append("'");
|
||||
}
|
||||
}
|
||||
else if(Boolean.FALSE.equals(active))
|
||||
|
||||
if (Boolean.TRUE.equals(query.getActive()))
|
||||
{
|
||||
criteria.add(Restrictions.isNotNull("end"));
|
||||
processWhere.append(" and process.end is null");
|
||||
}
|
||||
return criteria.list();
|
||||
else if (Boolean.FALSE.equals(query.getActive()))
|
||||
{
|
||||
processWhere.append(" and process.end is not null");
|
||||
}
|
||||
|
||||
// Check start range
|
||||
if (query.getStartBefore() != null)
|
||||
{
|
||||
processWhere.append(" and process.start <= :processStartBefore");
|
||||
processMap.put("processStartBefore", query.getStartBefore());
|
||||
}
|
||||
if (query.getStartAfter() != null)
|
||||
{
|
||||
processWhere.append(" and process.start >= :processStartAfter");
|
||||
processMap.put("processStartAfter", query.getStartAfter());
|
||||
}
|
||||
|
||||
// check end range
|
||||
if (query.getEndBefore() != null)
|
||||
{
|
||||
processWhere.append(" and process.end <= :processEndBefore");
|
||||
processMap.put("processEndBefore", query.getEndBefore());
|
||||
}
|
||||
if (query.getEndAfter() != null)
|
||||
{
|
||||
processWhere.append(" and process.end >= :processEndAfter");
|
||||
processMap.put("processEndAfter", query.getEndAfter());
|
||||
}
|
||||
|
||||
if (query.getCustomProps() != null)
|
||||
{
|
||||
processSelect.append(" join process.instances as contextInstance").append(
|
||||
" join contextInstance.tokenVariableMaps as tokenVariableMap");
|
||||
|
||||
processWhere.append(" and contextInstance.class = org.jbpm.context.exe.ContextInstance").append(
|
||||
" and tokenVariableMap.token = process.rootToken");
|
||||
|
||||
int i = 0;
|
||||
for (Map.Entry<QName, Object> prop : query.getCustomProps().entrySet())
|
||||
{
|
||||
i++;
|
||||
String variable = "var" + i;
|
||||
processMap.put(variable + "name", factory.mapQNameToName(prop.getKey()));
|
||||
if (prop.getValue() == null)
|
||||
{
|
||||
processSelect.append(", ").append(NullInstance.class.getName()).append(" as ").append(
|
||||
variable);
|
||||
processWhere.append(" and ").append(variable)
|
||||
.append(".tokenVariableMap = tokenVariableMap").append(" and ").append(variable)
|
||||
.append(".name = :").append(variable).append("name");
|
||||
}
|
||||
else
|
||||
{
|
||||
PropertyDefinition propertyDefinition = dictionaryService.getProperty(prop.getKey());
|
||||
if (propertyDefinition == null)
|
||||
{
|
||||
processSelect.append(", ").append(StringInstance.class.getName()).append(" as ")
|
||||
.append(variable);
|
||||
processWhere.append(" and ").append(variable).append(
|
||||
".tokenVariableMap = tokenVariableMap").append(" and ").append(variable)
|
||||
.append(".name = :").append(variable).append("name").append(" and ").append(
|
||||
variable).append(".value = :").append(variable).append("value");
|
||||
processMap.put(variable + "value", prop.getValue().toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
String propertyType = propertyDefinition.getDataType().getJavaClassName();
|
||||
if (propertyType.equals("java.lang.String"))
|
||||
{
|
||||
processSelect.append(", ").append(StringInstance.class.getName()).append(" as ")
|
||||
.append(variable);
|
||||
processWhere.append(" and ").append(variable).append(
|
||||
".tokenVariableMap = tokenVariableMap").append(" and ").append(variable)
|
||||
.append(".name = :").append(variable).append("name").append(" and ")
|
||||
.append(variable).append(".value = :").append(variable).append("value");
|
||||
processMap.put(variable + "value", prop.getValue().toString());
|
||||
}
|
||||
else if (propertyType.equals("java.lang.Long")
|
||||
|| propertyType.equals("java.lang.Integer"))
|
||||
{
|
||||
processSelect.append(", ").append(LongInstance.class.getName()).append(" as ")
|
||||
.append(variable);
|
||||
processWhere.append(" and ").append(variable).append(
|
||||
".tokenVariableMap = tokenVariableMap").append(" and ").append(variable)
|
||||
.append(".name = :").append(variable).append("name").append(" and ")
|
||||
.append(variable).append(".value = :").append(variable).append("value");
|
||||
processMap.put(variable + "value", new Long(prop.getValue().toString()));
|
||||
}
|
||||
else if (propertyType.equals("java.util.Date"))
|
||||
{
|
||||
processSelect.append(", ").append(DateInstance.class.getName()).append(
|
||||
" as ").append(variable);
|
||||
Map<DatePosition, Date> dateProps = (Map<DatePosition, Date>) prop.getValue();
|
||||
int datePropNum = 0;
|
||||
for (Map.Entry<DatePosition, Date> dateProp : dateProps.entrySet())
|
||||
{
|
||||
datePropNum++;
|
||||
if (dateProp.getValue() != null)
|
||||
{
|
||||
processWhere.append(" and ").append(variable).append(
|
||||
".tokenVariableMap = tokenVariableMap").append(" and ").append(
|
||||
variable).append(".name = :").append(variable).append("name");
|
||||
|
||||
if (dateProp.getKey() == DatePosition.BEFORE)
|
||||
{
|
||||
processMap.put(variable + "value" + datePropNum, calculateBeforeMidnight(dateProp.getValue()));
|
||||
processWhere.append(" and ").append(variable).append(".value <= :")
|
||||
.append(variable).append("value").append(datePropNum);
|
||||
}
|
||||
if (dateProp.getKey() == DatePosition.AFTER)
|
||||
{
|
||||
processMap.put(variable + "value" + datePropNum, calculateMidnight(dateProp.getValue()));
|
||||
processWhere.append(" and ").append(variable).append(".value >= :")
|
||||
.append(variable).append("value").append(datePropNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (processWhere.length() > 4)
|
||||
{
|
||||
processSelect.append(" where");
|
||||
processSelect.append(processWhere, 4, processWhere.length());
|
||||
}
|
||||
processSelect.append(" order by process.id");
|
||||
return session.createQuery(processSelect.toString()).setProperties(processMap).list();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private Date calculateBeforeMidnight(Date date)
|
||||
{
|
||||
Date calc = DateUtils.truncate(date, Calendar.DATE);
|
||||
calc = DateUtils.addDays(calc, 1);
|
||||
|
||||
return DateUtils.addSeconds(calc, -1);
|
||||
}
|
||||
|
||||
private Date calculateMidnight(Date date)
|
||||
{
|
||||
return DateUtils.truncate(date, Calendar.DATE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
Reference in New Issue
Block a user