org.jbpm.workbench.cm.server.MockCaseManagementService.java Source code

Java tutorial

Introduction

Here is the source code for org.jbpm.workbench.cm.server.MockCaseManagementService.java

Source

/*
 * Copyright 2017 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.
 * You may obtain a copy of the License at
 *
 *       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.jbpm.workbench.cm.server;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Specializes;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import org.jbpm.workbench.cm.backend.server.RemoteCaseManagementServiceImpl;
import org.jbpm.workbench.cm.model.CaseActionSummary;
import org.jbpm.workbench.cm.model.CaseCommentSummary;
import org.jbpm.workbench.cm.model.CaseDefinitionSummary;
import org.jbpm.workbench.cm.model.CaseInstanceSummary;
import org.jbpm.workbench.cm.model.CaseMilestoneSummary;
import org.jbpm.workbench.cm.model.CaseRoleAssignmentSummary;
import org.jbpm.workbench.cm.model.CaseStageSummary;
import org.jbpm.workbench.cm.util.CaseActionType;
import org.jbpm.workbench.cm.util.CaseInstanceSearchRequest;
import org.jbpm.workbench.cm.util.CaseMilestoneSearchRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static java.util.Collections.emptyList;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;

@Specializes
public class MockCaseManagementService extends RemoteCaseManagementServiceImpl {

    private static final Logger LOGGER = LoggerFactory.getLogger(MockCaseManagementService.class);
    private static final String CASE_DEFINITIONS_JSON = "case_definitions.json";
    private static final String CASE_MILESTONES_JSON = "case_milestones.json";
    private static final String CASE_STAGES_JSON = "case_stages.json";
    private static final String CASE_ACTIONS_JSON = "case_actions.json";

    private static int commentIdGenerator = 0;
    private static long actionIdLongenerator = 9;

    private List<CaseDefinitionSummary> caseDefinitionList = emptyList();
    private List<CaseInstanceSummary> caseInstanceList = new ArrayList<>();
    private List<CaseStageSummary> caseStageList = new ArrayList<>();
    private Map<String, List<CaseCommentSummary>> caseCommentMap = new HashMap<>();
    private List<CaseMilestoneSummary> caseMilestoneList = new ArrayList<>();
    private Map<String, List<CaseActionSummary>> caseActionMap = new HashMap<>();
    private List<CaseActionSummary> caseActionList = new ArrayList<>();

    @PostConstruct
    public void init() {
        try {
            final ObjectMapper mapper = new ObjectMapper();
            final InputStream inputStream = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream(CASE_DEFINITIONS_JSON);
            caseDefinitionList = Arrays.asList(mapper.readValue(inputStream, CaseDefinitionSummary[].class));
            caseMilestoneList = Arrays.asList(mapper.readValue(
                    Thread.currentThread().getContextClassLoader().getResourceAsStream(CASE_MILESTONES_JSON),
                    CaseMilestoneSummary[].class));
            caseStageList = Arrays.asList(mapper.readValue(
                    Thread.currentThread().getContextClassLoader().getResourceAsStream(CASE_STAGES_JSON),
                    CaseStageSummary[].class));
            caseActionList = Arrays.asList(mapper.readValue(
                    Thread.currentThread().getContextClassLoader().getResourceAsStream(CASE_ACTIONS_JSON),
                    CaseActionSummary[].class));

            LOGGER.info("Loaded {} case definitions", caseDefinitionList.size());
        } catch (Exception e) {
            LOGGER.error("Failed to load json data file", e);
        }
    }

    @Override
    public CaseDefinitionSummary getCaseDefinition(final String serverTemplateId, final String containerId,
            final String caseDefinitionId) {
        return caseDefinitionList.stream().filter(c -> c.getId().equals(caseDefinitionId)).findFirst().get();
    }

    @Override
    public List<CaseDefinitionSummary> getCaseDefinitions() {
        return caseDefinitionList;
    }

    @Override
    public String startCaseInstance(final String serverTemplateId, final String containerId,
            final String caseDefinitionId, final String owner) {
        final CaseInstanceSummary ci = CaseInstanceSummary.builder()
                .caseId("CASE-" + Strings.padStart(String.valueOf(caseInstanceList.size() + 1), 5, '0'))
                .owner(owner).startedAt(new Date()).caseDefinitionId(caseDefinitionId).status(1)
                .description("New case instance for development").containerId(containerId).stages(caseStageList)
                .build();
        caseInstanceList.add(ci);

        List<CaseActionSummary> actions = new ArrayList<>(caseActionList);
        caseActionMap.putIfAbsent(ci.getCaseId(), actions.stream().map(s -> {
            s.setCreatedOn(new Date());
            return s;
        }).collect(toList()));

        return ci.getCaseId();
    }

    @Override
    public List<CaseInstanceSummary> getCaseInstances(final CaseInstanceSearchRequest request) {
        return caseInstanceList.stream().filter(c -> c.getStatus().equals(request.getStatus()))
                .sorted(getCaseInstanceSummaryComparator(request)).collect(toList());
    }

    @Override
    public CaseInstanceSummary getCaseInstance(final String serverTemplateId, final String containerId,
            final String caseId) {
        return caseInstanceList.stream().filter(c -> c.getCaseId().equals(caseId)).findFirst().get();
    }

    @Override
    public void cancelCaseInstance(final String serverTemplateId, final String containerId, final String caseId) {
        executeOnCaseInstance(caseId, c -> c.setStatus(3));
    }

    @Override
    public void destroyCaseInstance(final String serverTemplateId, final String containerId, final String caseId) {
        executeOnCaseInstance(caseId, c -> c.setStatus(3));
    }

    @Override
    public List<CaseCommentSummary> getComments(final String serverTemplateId, final String containerId,
            final String caseId) {
        return ofNullable(caseCommentMap.get(caseId)).orElse(emptyList());
    }

    @Override
    public void addComment(final String serverTemplateId, final String containerId, final String caseId,
            final String author, final String text) {
        final List<CaseCommentSummary> commentSummaryList = caseCommentMap.getOrDefault(caseId, new ArrayList<>());

        final String newId = String.valueOf(commentIdGenerator++);

        final CaseCommentSummary caseCommentSummary = CaseCommentSummary.builder().id(newId).author(author)
                .text(text).addedAt(new Date()).build();
        commentSummaryList.add(caseCommentSummary);
        caseCommentMap.putIfAbsent(caseId, commentSummaryList);
    }

    @Override
    public void updateComment(final String serverTemplateId, final String containerId, final String caseId,
            final String commentId, final String author, final String text) {
        ofNullable(caseCommentMap.get(caseId)).ifPresent(l -> l.stream().filter(c -> c.getId().equals(commentId))
                .findFirst().ifPresent(c -> c.setText(text)));
    }

    @Override
    public void removeComment(final String serverTemplateId, final String containerId, final String caseId,
            final String commentId) {
        ofNullable(caseCommentMap.get(caseId)).ifPresent(
                l -> l.stream().filter(c -> c.getId().equals(commentId)).findFirst().ifPresent(c -> l.remove(c)));
    }

    @Override
    public void assignUserToRole(final String serverTemplateId, final String containerId, final String caseId,
            final String roleName, final String user) {
        executeOnCaseRole(caseId, roleName, r -> r.getUsers().add(user));
    }

    @Override
    public void assignGroupToRole(final String serverTemplateId, final String containerId, final String caseId,
            final String roleName, final String group) {
        executeOnCaseRole(caseId, roleName, r -> r.getGroups().add(group));
    }

    @Override
    public void removeUserFromRole(final String serverTemplateId, final String containerId, final String caseId,
            final String roleName, final String user) {
        executeOnCaseRole(caseId, roleName, r -> r.getUsers().remove(user));
    }

    @Override
    public void removeGroupFromRole(final String serverTemplateId, final String containerId, final String caseId,
            final String roleName, final String group) {
        executeOnCaseRole(caseId, roleName, r -> r.getGroups().remove(group));
    }

    private void executeOnCaseInstance(final String caseId, final Consumer<CaseInstanceSummary> consumer) {
        caseInstanceList.stream().filter(c -> c.getCaseId().equals(caseId)).findFirst().ifPresent(consumer);
    }

    private void executeOnCaseRole(final String caseId, final String roleName,
            final Consumer<CaseRoleAssignmentSummary> consumer) {
        executeOnCaseInstance(caseId, c -> {
            final CaseRoleAssignmentSummary role = c.getRoleAssignments().stream()
                    .filter(r -> r.getName().equals(roleName)).findFirst().orElseGet(() -> {
                        final CaseRoleAssignmentSummary newRole = CaseRoleAssignmentSummary.builder().name(roleName)
                                .build();
                        c.getRoleAssignments().add(newRole);
                        return newRole;
                    });
            consumer.accept(role);
        });
    }

    @Override
    public List<CaseMilestoneSummary> getCaseMilestones(final String containerId, final String caseId,
            final CaseMilestoneSearchRequest request) {
        return caseMilestoneList.stream().sorted(getCaseMilestoneSummaryComparator(request)).collect(toList());
    }

    public List<CaseActionSummary> getAdHocFragments(String containerId, String caseId) {
        return ofNullable(caseActionMap.get(caseId)).orElse(emptyList()).stream()
                .filter(c -> CaseActionType.AD_HOC == c.getActionType()).collect(toList());
    }

    public List<CaseActionSummary> getInProgressActions(String containerId, String caseId) {
        return ofNullable(caseActionMap.get(caseId)).orElse(emptyList()).stream()
                .filter(c -> CaseActionType.INPROGRESS == c.getActionType()).collect(toList());
    }

    public List<CaseActionSummary> getCompletedActions(String containerId, String caseId) {
        return ofNullable(caseActionMap.get(caseId)).orElse(emptyList()).stream()
                .filter(c -> CaseActionType.COMPLETED == c.getActionType()).collect(toList());
    }

    @Override
    public void addDynamicUserTask(String containerId, String caseId, String name, String description,
            String actors, String groups, Map<String, Object> data) {
        final List<CaseActionSummary> actionSummaryList = caseActionMap.getOrDefault(caseId, new ArrayList<>());
        final CaseActionSummary action = CaseActionSummary.builder().id(actionIdLongenerator++).name(name)
                .actualOwner(actors).type("Human Task").status(CaseActionType.INPROGRESS).createdOn(new Date())
                .build();
        actionSummaryList.add(action);
        caseActionMap.putIfAbsent(caseId, actionSummaryList);
    }

    public void addDynamicUserTaskToStage(String containerId, String caseId, String stageId, String name,
            String description, String actors, String groups, Map<String, Object> data) {
        final List<CaseActionSummary> actionSummaryList = caseActionMap.getOrDefault(caseId, new ArrayList<>());
        final CaseActionSummary action = CaseActionSummary.builder().id(actionIdLongenerator++).name(name)
                .actualOwner(actors).type("Human Task").status(CaseActionType.INPROGRESS).createdOn(new Date())
                .build();
        actionSummaryList.add(action);
        caseActionMap.putIfAbsent(caseId, actionSummaryList);
    }

    @Override
    public void triggerAdHocActionInStage(String containerId, String caseId, String stageId, String adHocName,
            Map<String, Object> data) {
        final List<CaseActionSummary> actionSummaryList = caseActionMap.getOrDefault(caseId, new ArrayList<>());
        final CaseActionSummary action = CaseActionSummary.builder().id(actionIdLongenerator++).name(adHocName)
                .status(CaseActionType.INPROGRESS).createdOn(new Date()).build();
        actionSummaryList.add(action);
        caseActionMap.putIfAbsent(caseId, actionSummaryList);
    }

    @Override
    public void triggerAdHocAction(String containerId, String caseId, String adHocName, Map<String, Object> data) {
        final List<CaseActionSummary> actionSummaryList = caseActionMap.getOrDefault(caseId, new ArrayList<>());
        final CaseActionSummary action = CaseActionSummary.builder().id(actionIdLongenerator++).name(adHocName)
                .status(CaseActionType.INPROGRESS).createdOn(new Date()).build();
        actionSummaryList.add(action);
        caseActionMap.putIfAbsent(caseId, actionSummaryList);
    }
}