/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.server.services.casemgmt;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.jbpm.casemgmt.api.CaseRuntimeDataService;
import org.jbpm.casemgmt.api.model.AdHocFragment;
import org.jbpm.casemgmt.api.model.CaseDefinition;
import org.jbpm.casemgmt.api.model.CaseFileItem;
import org.jbpm.casemgmt.api.model.CaseStatus;
import org.jbpm.casemgmt.api.model.instance.CaseMilestoneInstance;
import org.jbpm.casemgmt.api.model.instance.CaseStageInstance;
import org.jbpm.services.api.model.NodeInstanceDesc;
import org.jbpm.services.api.model.ProcessInstanceDesc;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.TaskSummary;
import org.kie.internal.identity.IdentityProvider;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.model.cases.CaseAdHocFragment;
import org.kie.server.api.model.cases.CaseAdHocFragmentList;
import org.kie.server.api.model.cases.CaseDefinitionList;
import org.kie.server.api.model.cases.CaseFileDataItemList;
import org.kie.server.api.model.cases.CaseInstance;
import org.kie.server.api.model.cases.CaseInstanceList;
import org.kie.server.api.model.cases.CaseMilestone;
import org.kie.server.api.model.cases.CaseMilestoneList;
import org.kie.server.api.model.cases.CaseStage;
import org.kie.server.api.model.cases.CaseStageList;
import org.kie.server.api.model.definition.ProcessDefinitionList;
import org.kie.server.api.model.instance.NodeInstance;
import org.kie.server.api.model.instance.NodeInstanceList;
import org.kie.server.api.model.instance.ProcessInstance;
import org.kie.server.api.model.instance.ProcessInstanceList;
import org.kie.server.api.model.instance.TaskSummaryList;
import org.kie.server.services.api.KieServerRegistry;
import org.kie.server.services.impl.locator.ContainerLocatorProvider;
import static java.util.stream.Collectors.*;
public class CaseManagementRuntimeDataServiceBase {
private CaseRuntimeDataService caseRuntimeDataService;
private KieServerRegistry context;
private IdentityProvider identityProvider;
private boolean bypassAuthUser = false;
public CaseManagementRuntimeDataServiceBase(CaseRuntimeDataService caseRuntimeDataService, KieServerRegistry context) {
this.caseRuntimeDataService = caseRuntimeDataService;
this.identityProvider = context.getIdentityProvider();
this.context = context;
this.bypassAuthUser = Boolean.parseBoolean(context.getConfig().getConfigItemValue(KieServerConstants.CFG_BYPASS_AUTH_USER, "false"));
}
protected String getUser(String queryParamUser) {
if (bypassAuthUser) {
return queryParamUser;
}
return identityProvider.getName();
}
public CaseMilestoneList getMilestones(String containerId, String caseId, boolean achievedOnly, Integer page, Integer pageSize) {
Collection<CaseMilestoneInstance> caseMilestones = caseRuntimeDataService.getCaseInstanceMilestones(caseId, achievedOnly, ConvertUtils.buildQueryContext(page, pageSize));
List<CaseMilestone> milestones = ConvertUtils.transformMilestones(caseMilestones);
CaseMilestoneList milestoneList = new CaseMilestoneList(milestones);
return milestoneList;
}
public CaseStageList getStages(String containerId, String caseId, boolean activeOnly, Integer page, Integer pageSize) {
Collection<CaseStageInstance> caseStageInstances = caseRuntimeDataService.getCaseInstanceStages(caseId, activeOnly, ConvertUtils.buildQueryContext(page, pageSize));
List<CaseStage> caseStages = ConvertUtils.transformStages(caseStageInstances);
CaseStageList stageList = new CaseStageList(caseStages);
return stageList;
}
public CaseAdHocFragmentList getAdHocFragments(String containerId, String caseId) {
Collection<AdHocFragment> caseAdHocFragments = caseRuntimeDataService.getAdHocFragmentsForCase(caseId);
List<CaseAdHocFragment> caseAdHoc = caseAdHocFragments.stream().map(adf -> CaseAdHocFragment.builder().name(adf.getName()).type(adf.getType()).build()).collect(toList());
CaseAdHocFragmentList adHocFragmentList = new CaseAdHocFragmentList(caseAdHoc);
return adHocFragmentList;
}
public NodeInstanceList getActiveNodes(String containerId, String caseId, Integer page, Integer pageSize) {
Collection<NodeInstanceDesc> activeNodeInstances = caseRuntimeDataService.getActiveNodesForCase(caseId, ConvertUtils.buildQueryContext(page, pageSize));
List<NodeInstance> activeNodes = ConvertUtils.transformNodeInstance(activeNodeInstances);
NodeInstanceList activeNodesList = new NodeInstanceList(activeNodes);
return activeNodesList;
}
public NodeInstanceList getCompletedNodes(String containerId, String caseId, Integer page, Integer pageSize) {
Collection<NodeInstanceDesc> completedNodeInstances = caseRuntimeDataService.getCompletedNodesForCase(caseId, ConvertUtils.buildQueryContext(page, pageSize));
List<NodeInstance> completedNodes = ConvertUtils.transformNodeInstance(completedNodeInstances);
NodeInstanceList completedNodesList = new NodeInstanceList(completedNodes);
return completedNodesList;
}
public ProcessInstanceList getProcessInstancesForCase(String containerId, String caseId, List<Integer> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
status = safeProcessStatus(status);
sort = safeProcessInstanceSort(sort);
Collection<ProcessInstanceDesc> processInstanceDescs = caseRuntimeDataService.getProcessInstancesForCase(caseId, status, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<ProcessInstance> processInstances = ConvertUtils.transformProcessInstance(processInstanceDescs);
ProcessInstanceList processInstancesList = new ProcessInstanceList(processInstances);
return processInstancesList;
}
public CaseInstanceList getCaseInstancesByContainer(String containerId, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstancesByDeployment(containerId, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstancesByDefinition(String containerId, String caseDefinitionId, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstancesByDefinition(caseDefinitionId, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstancesOwnedBy(String owner, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
owner = getUser(owner);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstancesOwnedBy(owner, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstances(List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstances(caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstancesByRole(String roleName, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstancesByRole(roleName, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstancesAnyRole(List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = caseRuntimeDataService.getCaseInstancesAnyRole(caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseInstanceList getCaseInstancesByCaseFileData(String dataItemName, String dataItemValue, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<CaseStatus> caseStatus = safeCaseStatus(status);
sort = safeCaseInstanceSort(sort);
Collection<org.jbpm.casemgmt.api.model.instance.CaseInstance> caseInstanceDescs = null;
if (dataItemValue != null && !dataItemValue.isEmpty()) {
caseInstanceDescs = caseRuntimeDataService.getCaseInstancesByDateItemAndValue(dataItemName, dataItemValue, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
} else {
caseInstanceDescs = caseRuntimeDataService.getCaseInstancesByDateItem(dataItemName, caseStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
}
List<CaseInstance> caseInstances = ConvertUtils.transformCaseInstances(caseInstanceDescs);
CaseInstanceList caseInstancesList = new CaseInstanceList(caseInstances);
return caseInstancesList;
}
public CaseDefinitionList getCaseDefinitionsByContainer(String containerId, Integer page, Integer pageSize, String sort, boolean sortOrder) {
sort = safeCaseDefinitionSort(sort);
containerId = context.getContainerId(containerId, ContainerLocatorProvider.get().getLocator());
Collection<CaseDefinition> caseDescs = caseRuntimeDataService.getCasesByDeployment(containerId, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
List<org.kie.server.api.model.cases.CaseDefinition> cases = ConvertUtils.transformCases(caseDescs);
CaseDefinitionList caseList = new CaseDefinitionList(cases);
return caseList;
}
public CaseDefinitionList getCaseDefinitions(String filter, Integer page, Integer pageSize, String sort, boolean sortOrder) {
Collection<CaseDefinition> caseDescs = null;
sort = safeCaseDefinitionSort(sort);
if (filter != null && !filter.isEmpty()) {
caseDescs = caseRuntimeDataService.getCases(filter, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
} else {
caseDescs = caseRuntimeDataService.getCases(ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
}
List<org.kie.server.api.model.cases.CaseDefinition> cases = ConvertUtils.transformCases(caseDescs);
CaseDefinitionList caseList = new CaseDefinitionList(cases);
return caseList;
}
public ProcessDefinitionList getProcessDefinitions(String filter, String containerId, Integer page, Integer pageSize, String sort, boolean sortOrder) {
Collection<org.jbpm.services.api.model.ProcessDefinition> processDescs = null;
sort = safeCaseDefinitionSort(sort);
if (containerId != null && !containerId.isEmpty()) {
containerId = context.getContainerId(containerId, ContainerLocatorProvider.get().getLocator());
processDescs = caseRuntimeDataService.getProcessDefinitionsByDeployment(containerId, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
} else if (filter != null && !filter.isEmpty()) {
processDescs = caseRuntimeDataService.getProcessDefinitions(filter, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
} else {
processDescs = caseRuntimeDataService.getProcessDefinitions(ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
}
ProcessDefinitionList processDefinitions = ConvertUtils.transformProcesses(processDescs);
return processDefinitions;
}
public org.kie.server.api.model.cases.CaseDefinition getCaseDefinition(String containerId, String caseDefinitionId) {
containerId = context.getContainerId(containerId, ContainerLocatorProvider.get().getLocator());
CaseDefinition caseDef = caseRuntimeDataService.getCase(containerId, caseDefinitionId);
if (caseDef == null) {
throw new IllegalStateException("Case definition " + containerId + " : " + caseDefinitionId + " not found");
}
org.kie.server.api.model.cases.CaseDefinition caseDefinition = ConvertUtils.transformCase(caseDef);
return caseDefinition;
}
public TaskSummaryList getCaseTasks(String caseId, String user, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<Status> actualStatus = safeTaskStatus(status);
user = getUser(user);
sort = safeTaskSummarySort(sort);
Collection<TaskSummary> taskSummaries = caseRuntimeDataService.getCaseTasksAssignedAsPotentialOwner(caseId, user, actualStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
TaskSummaryList tasks = ConvertUtils.convertToTaskSummaryList(taskSummaries);
return tasks;
}
public TaskSummaryList getCaseTasksAsBusinessAdmin(String caseId, String user, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<Status> actualStatus = safeTaskStatus(status);
user = getUser(user);
sort = safeTaskSummarySort(sort);
Collection<TaskSummary> taskSummaries = caseRuntimeDataService.getCaseTasksAssignedAsBusinessAdmin(caseId, user, actualStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
TaskSummaryList tasks = ConvertUtils.convertToTaskSummaryList(taskSummaries);
return tasks;
}
public TaskSummaryList getCaseTasksAsStakeholder(String caseId, String user, List<String> status, Integer page, Integer pageSize, String sort, boolean sortOrder) {
List<Status> actualStatus = safeTaskStatus(status);
user = getUser(user);
sort = safeTaskSummarySort(sort);
Collection<TaskSummary> taskSummaries = caseRuntimeDataService.getCaseTasksAssignedAsStakeholder(caseId, user, actualStatus, ConvertUtils.buildQueryContext(page, pageSize, sort, sortOrder));
TaskSummaryList tasks = ConvertUtils.convertToTaskSummaryList(taskSummaries);
return tasks;
}
public CaseFileDataItemList getCaseInstanceDataItems(String caseId, List<String> names, List<String> types, Integer page, Integer pageSize) {
Collection<CaseFileItem> caseFileItems = null;
if (!names.isEmpty()) {
caseFileItems = caseRuntimeDataService.getCaseInstanceDataItemsByName(caseId, names, ConvertUtils.buildQueryContext(page, pageSize));
} else if (!types.isEmpty()) {
caseFileItems = caseRuntimeDataService.getCaseInstanceDataItemsByType(caseId, types, ConvertUtils.buildQueryContext(page, pageSize));
} else {
caseFileItems = caseRuntimeDataService.getCaseInstanceDataItems(caseId, ConvertUtils.buildQueryContext(page, pageSize));
}
CaseFileDataItemList caseFileDataItemList = ConvertUtils.transformCaseFileDataItems(caseFileItems);
return caseFileDataItemList;
}
protected List<CaseStatus> safeCaseStatus(List<String> status) {
List<CaseStatus> actualStatus = CaseStatus.fromNameList(status);
if (actualStatus == null || actualStatus.isEmpty()) {
actualStatus = new ArrayList<CaseStatus>();
actualStatus.add(CaseStatus.OPEN);
}
return actualStatus;
}
protected List<Integer> safeProcessStatus(List<Integer> status) {
List<Integer> actualStatus = status;
if (status == null || status.isEmpty()) {
actualStatus = new ArrayList<Integer>();
actualStatus.add(org.kie.api.runtime.process.ProcessInstance.STATE_ACTIVE);
}
return actualStatus;
}
protected List<Status> safeTaskStatus(List<String> status) {
List<Status> actualStatus;
if (status == null || status.isEmpty()) {
actualStatus = new ArrayList<Status>();
actualStatus.add(Status.Ready);
actualStatus.add(Status.Reserved);
actualStatus.add(Status.InProgress);
} else {
actualStatus = status.stream().map(s -> Status.valueOf(s)).collect(toList());
}
return actualStatus;
}
protected String safeCaseInstanceSort(String sort) {
String actualSort = sort;
if (sort == null || sort.isEmpty()) {
actualSort = "CorrelationKey";
}
return actualSort;
}
protected String safeTaskSummarySort(String sort) {
String actualSort = sort;
if (sort == null || sort.isEmpty()) {
actualSort = "t.id";
}
return actualSort;
}
protected String safeCaseDefinitionSort(String sort) {
String actualSort = sort;
if (sort == null || sort.isEmpty()) {
actualSort = "CaseId";
}
return actualSort;
}
protected String safeProcessInstanceSort(String sort) {
String actualSort = sort;
if (sort == null || sort.isEmpty()) {
actualSort = "ProcessInstanceId";
}
return actualSort;
}
}