From 497e498f6b56aae640715d76643d9efbfe782c0a Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti <65240126+fjtirado@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:34:42 +0100 Subject: [PATCH] [Fix #2177] Merge ProcessDefinitionEvent metadata (#2178) * [Fix #2177] Merge metadata in ProcessEventDefinition Fix https://github.com/apache/incubator-kie-kogito-apps/issues/2177 * [Fix #2177] Partial rollback --- .../org/kie/kogito/index/CommonUtils.java | 25 +++++++++ .../service/ProcessDefinitionHelper.java | 3 +- .../org/kie/kogito/index/CommonUtilsTest.java | 54 +++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java index 47e70d8f7b..9a2798bba5 100644 --- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java +++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/CommonUtils.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import org.slf4j.Logger; @@ -67,6 +69,29 @@ public static TypeDefinitionRegistry loadSchemaDefinitionFile(String fileName) { } } + @SuppressWarnings("unchecked") + public static Map mergeMap(Map source, Map target) { + if (source == null) { + return target; + } else if (target == null) { + return source; + } else { + Map result = new HashMap<>(target); + source.forEach((key, value) -> { + if (value != null) { + result.merge(key, value, (targetValue, srcValue) -> { + if (srcValue instanceof Map && targetValue instanceof Map) { + return (V) mergeMap((Map) srcValue, (Map) targetValue); + } else { + return srcValue; + } + }); + } + }); + return result; + } + } + private static String getContext(String processId) { return processId != null && processId.contains(".") ? processId.substring(processId.lastIndexOf('.') + 1) : processId; } diff --git a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java index 6ce25264c2..96e3b9c4ce 100644 --- a/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java +++ b/data-index/data-index-common/src/main/java/org/kie/kogito/index/service/ProcessDefinitionHelper.java @@ -29,6 +29,7 @@ import org.kie.kogito.event.process.NodeDefinition; import org.kie.kogito.event.process.ProcessDefinitionDataEvent; import org.kie.kogito.event.process.ProcessDefinitionEventBody; +import org.kie.kogito.index.CommonUtils; import org.kie.kogito.index.json.JsonUtils; import org.kie.kogito.index.model.Node; import org.kie.kogito.index.model.ProcessDefinition; @@ -62,7 +63,7 @@ public static ProcessDefinition merge(ProcessDefinition instance, ProcessDefinit instance.setEndpoint(doMerge(data.getEndpoint(), instance.getEndpoint())); instance.setDescription(doMerge(data.getDescription(), instance.getDescription())); instance.setAnnotations(doMerge(data.getAnnotations(), instance.getAnnotations())); - instance.setMetadata(doMerge(toStringMap(data.getMetadata()), instance.getMetadata())); + instance.setMetadata(CommonUtils.mergeMap(toStringMap(data.getMetadata()), instance.getMetadata())); instance.setNodes(doMerge(nodeDefinitions(data), instance.getNodes())); instance.setSource(doMerge(data.getSource(), instance.getSource())); return instance; diff --git a/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java b/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java new file mode 100644 index 0000000000..7092ceafba --- /dev/null +++ b/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.kie.kogito.index; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CommonUtilsTest { + + @Test + void testSimpleMergeMap() { + Map src = Map.of("name", "Javierito", "different", "remain"); + Map target = Map.of("name", "Fulanito", "other", "remain"); + assertThat(CommonUtils.mergeMap(src, target)).isEqualTo(Map.of("name", "Javierito", "other", "remain", "different", "remain")); + } + + @Test + void testNullMergeMap() { + Map src = new HashMap<>(); + src.put("name", null); + src.put("different", "remain"); + Map target = Map.of("name", "Fulanito", "other", "remain"); + assertThat(CommonUtils.mergeMap(src, target)).isEqualTo(Map.of("name", "Fulanito", "other", "remain", "different", "remain")); + } + + @Test + void testComplexMergeMap() { + Map nestedSrc = Map.of("name", "Javierito", "different", "remain"); + Map nestedTarget = Map.of("name", "Fulanito", "other", "remain"); + Map src = Map.of("nested", nestedSrc); + Map target = Map.of("nested", nestedTarget); + assertThat(CommonUtils.mergeMap(src, target)).isEqualTo(Map.of("nested", Map.of("name", "Javierito", "other", "remain", "different", "remain"))); + } +}