public ProcessInstance merge()

in data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java [49:121]


    public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent<?> data) {
        ProcessInstanceNodeDataEvent event = (ProcessInstanceNodeDataEvent) data;
        pi = getOrNew(pi, data, event.getData().getEventDate());

        List<NodeInstance> nodeInstances = Optional.ofNullable(pi.getNodes()).orElse(new ArrayList<>());

        ProcessInstanceNodeEventBody body = event.getData();

        NodeInstance nodeInstance = nodeInstances.stream().filter(e -> body.getNodeInstanceId().equals(e.getId())).findAny().orElse(new NodeInstance());
        nodeInstances.removeIf(e -> e.getId().equals(body.getNodeInstanceId()));

        LOGGER.debug("before merging: {}", nodeInstance);
        nodeInstance.setDefinitionId(body.getNodeDefinitionId());
        nodeInstance.setId(body.getNodeInstanceId());
        nodeInstance.setNodeId(body.getNodeDefinitionId());
        nodeInstance.setName(body.getNodeName());
        nodeInstance.setType(body.getNodeType());
        nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate()));
        if (body.isRetrigger() != null) {
            nodeInstance.setRetrigger(body.isRetrigger());
        }
        ZonedDateTime eventDate = toZonedDateTime(body.getEventDate());
        switch (body.getEventType()) {
            case EVENT_TYPE_ENTER:
                nodeInstance.setEnter(eventDate);
                break;
            case EVENT_TYPE_EXIT:
                nodeInstance.setExit(eventDate);
            default:
                if (nodeInstance.getEnter() == null) {
                    // Adding a default enter time for exit events triggered by EventNodeInstances
                    nodeInstance.setEnter(eventDate);
                }
        }
        nodeInstances.add(nodeInstance);

        // milestone
        if ("MilestoneNode".equals(event.getData().getNodeType())) {
            List<Milestone> milestones = Optional.ofNullable(pi.getMilestones()).orElse(new ArrayList<>());
            Optional<Milestone> found = milestones.stream().filter(e -> body.getNodeInstanceId().equals(e.getId())).findAny();
            Milestone milestone = null;
            if (found.isEmpty()) {
                milestone = new Milestone();
                milestones.add(milestone);
            } else {
                milestone = found.get();
            }

            milestone.setId(nodeInstance.getId());
            milestone.setName(nodeInstance.getName());
            milestone.setStatus(nodeInstance.getExit() != null ? MilestoneStatus.COMPLETED.name() : MilestoneStatus.ACTIVE.name());
            milestones.add(milestone);

            pi.setMilestones(milestones);
        }

        if (pi.getDefinition() != null) {
            List<Node> nodes = Optional.ofNullable(pi.getDefinition().getNodes()).orElse(new ArrayList<>());

            nodes.removeIf(e -> e.getId().equals(body.getNodeDefinitionId()));
            Node node = new Node();
            node.setId(body.getNodeDefinitionId());
            node.setType(body.getNodeType());
            node.setUniqueId(body.getNodeDefinitionId());
            node.setMetadata(new HashMap<>());

            nodes.add(node);
            pi.getDefinition().setNodes(nodes);
        }
        LOGGER.debug("after merging: {}", nodeInstance);
        pi.setNodes(nodeInstances);
        return pi;
    }