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:
Frederik Heremans
2012-06-27 09:00:25 +00:00
parent 31372598d1
commit 9384ac20ad
9 changed files with 539 additions and 88 deletions

View File

@@ -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.
*

View File

@@ -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());
}
/**

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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}
*/