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