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..7e51c14c83 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,25 @@ public static TypeDefinitionRegistry loadSchemaDefinitionFile(String fileName) { } } + @SuppressWarnings({ "rawtypes", "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) -> result.merge(key, value, (targetValue, srcValue) -> { + if (srcValue instanceof Map && targetValue instanceof Map) { + return 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..df9b8e3fdb 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 @@ -18,23 +18,18 @@ */ package org.kie.kogito.index.service; -import java.util.AbstractMap; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; 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.json.JsonUtils; +import org.kie.kogito.index.CommonUtils; import org.kie.kogito.index.model.Node; import org.kie.kogito.index.model.ProcessDefinition; -import com.fasterxml.jackson.core.JsonProcessingException; - import jakarta.enterprise.context.ApplicationScoped; import static java.util.stream.Collectors.toList; @@ -62,8 +57,9 @@ 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(data.getMetadata(), instance.getMetadata())); instance.setNodes(doMerge(nodeDefinitions(data), instance.getNodes())); + instance.setSource(doMerge(data.getSource(), instance.getSource())); return instance; } @@ -81,7 +77,7 @@ private static Node nodeDefinition(NodeDefinition definition) { node.setName(definition.getName()); node.setUniqueId(definition.getUniqueId()); node.setType(definition.getType()); - node.setMetadata(toStringMap(definition.getMetadata())); + node.setMetadata(definition.getMetadata()); return node; } @@ -94,22 +90,4 @@ private static <T> T doMerge(T incoming, T current) { return current; } - private static Map<String, String> toStringMap(Map<String, ?> input) { - if (input == null) { - return null; - } - return input.entrySet().stream() - .map(entry -> { - if (String.class.isInstance(entry.getValue())) { - return entry; - } - String value = null; - try { - value = JsonUtils.getObjectMapper().writeValueAsString(entry.getValue()); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - return new AbstractMap.SimpleEntry<>(entry.getKey(), value); - }).collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue())); - } } 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..20e43ebb9d --- /dev/null +++ b/data-index/data-index-common/src/test/java/org/kie/kogito/index/CommonUtilsTest.java @@ -0,0 +1,45 @@ +/* + * 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.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 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"))); + } + +} diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java index 84939239e9..3f71c8bd93 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Node.java @@ -30,7 +30,7 @@ public class Node { @JsonProperty("nodeType") private String type; private String uniqueId; - private Map<String, String> metadata; + private Map<String, ?> metadata; public String getId() { return id; @@ -64,11 +64,11 @@ public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; } diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java index e6e2450ea0..6f9241c125 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessDefinition.java @@ -35,7 +35,7 @@ public class ProcessDefinition { private String source; private String description; private Set<String> annotations; - private Map<String, String> metadata; + private Map<String, ?> metadata; private List<Node> nodes; public String getId() { @@ -126,11 +126,11 @@ public void setAnnotations(Set<String> annotations) { this.annotations = annotations; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; } diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java index 504d14aa25..01251f4ce9 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/EntryMarshaller.java @@ -43,7 +43,11 @@ public Entry readFrom(ProtoStreamReader reader) throws IOException { @Override public void writeTo(ProtoStreamWriter writer, Entry entry) throws IOException { writer.writeString(KEY, entry.getKey()); - writer.writeString(VALUE, entry.getValue()); + writer.writeString(VALUE, toString(entry.getValue())); + } + + private String toString (Object str) { + return str != null ? str.toString() : null; } @Override diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java index 2b7b998c5a..f4e78aa245 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeMarshaller.java @@ -67,16 +67,16 @@ Function<NodeMetadata, Map<String, String>> toNodeMetadataMap() { }; } - Function<Map<String, String>, NodeMetadata> toNodeMetadata() { + Function<Map<String, ?>, NodeMetadata> toNodeMetadata() { return m -> { if (m == null) { return null; } NodeMetadata meta = new NodeMetadata(); - meta.setAction(m.get(NodeMetadataMarshaller.ACTION)); - meta.setState(m.get(NodeMetadataMarshaller.STATE)); - meta.setUniqueId(m.get(NodeMetadataMarshaller.UNIQUE_ID)); - meta.setBranch(m.get(NodeMetadataMarshaller.BRANCH)); + meta.setAction((String)m.get(NodeMetadataMarshaller.ACTION)); + meta.setState((String)m.get(NodeMetadataMarshaller.STATE)); + meta.setUniqueId((String)m.get(NodeMetadataMarshaller.UNIQUE_ID)); + meta.setBranch((String)m.get(NodeMetadataMarshaller.BRANCH)); return meta; }; } diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java index 720fdf1e02..5ceae9aa8f 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessDefinitionMarshaller.java @@ -72,7 +72,7 @@ public ProcessDefinition readFrom(ProtoStreamReader reader) throws IOException { return pd; } - private static Map<String, String> buildMetadata(ProtoStreamReader reader) throws IOException { + private static Map<String, ?> buildMetadata(ProtoStreamReader reader) throws IOException { return Optional.ofNullable(reader.readCollection(METADATA, new HashSet<>(), Entry.class)) .map(entries -> entries.stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue))) .orElse(null); diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java index 2e3dcee8a5..7e29493a68 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/model/Entry.java @@ -25,12 +25,12 @@ public class Entry { private String key; - private String value; + private Object value; public Entry() { } - public Entry(String key, String value) { + public Entry(String key, Object value) { this.key = key; this.value = value; } @@ -43,7 +43,7 @@ public void setKey(String key) { this.key = key; } - public String getValue() { + public Object getValue() { return value; } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java index f11c3d2b47..583ce4f5d5 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeEntity.java @@ -55,7 +55,7 @@ public class NodeEntity extends AbstractEntity { foreignKey = @ForeignKey(name = "fk_definitions_nodes_metadata_definitions_nodes")) @MapKeyColumn(name = "name") @Column(name = "meta_value") - private Map<String, String> metadata; + private Map<String, ?> metadata; @Id @ManyToOne(cascade = CascadeType.ALL, optional = false) @@ -96,11 +96,11 @@ public void setType(String type) { this.type = type; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java index a7158f31bb..db81b64231 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessDefinitionEntity.java @@ -80,7 +80,7 @@ public class ProcessDefinitionEntity extends AbstractEntity { foreignKey = @ForeignKey(name = "fk_definitions_metadata")) @MapKeyColumn(name = "name") @Column(name = "meta_value") - private Map<String, String> metadata; + private Map<String, ?> metadata; @Override public String getId() { @@ -171,11 +171,11 @@ public void setAnnotations(Set<String> annotations) { this.annotations = annotations; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; } diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java index b009835ade..46eda01227 100644 --- a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessDefinitionEntity.java @@ -40,7 +40,7 @@ public class ProcessDefinitionEntity { private Set<String> annotations; - private Map<String, String> metadata; + private Map<String, ?> metadata; private Set<String> roles; @@ -148,11 +148,11 @@ public void setAnnotations(Set<String> annotations) { this.annotations = annotations; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; } @@ -193,7 +193,7 @@ public static class NodeEntity { private String uniqueId; private String type; - private Map<String, String> metadata; + private Map<String, ?> metadata; public String getId() { return id; @@ -227,11 +227,11 @@ public void setType(String type) { this.type = type; } - public Map<String, String> getMetadata() { + public Map<String, ?> getMetadata() { return metadata; } - public void setMetadata(Map<String, String> metadata) { + public void setMetadata(Map<String, ?> metadata) { this.metadata = metadata; }