diff --git a/planetiler-core/pom.xml b/planetiler-core/pom.xml
index eef160c5d5..0ff8b2ce2a 100644
--- a/planetiler-core/pom.xml
+++ b/planetiler-core/pom.xml
@@ -129,6 +129,11 @@
org.snakeyaml
snakeyaml-engine
+
+ org.yaml
+ snakeyaml
+ 2.3
+
io.prometheus
simpleclient
diff --git a/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java b/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java
index b051dc5138..0a504a0ef2 100644
--- a/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java
+++ b/planetiler-core/src/main/java/com/onthegomap/planetiler/util/YAML.java
@@ -51,11 +51,11 @@ private static void handleMergeOperator(Object parsed) {
if (parsed instanceof Map, ?> map) {
Object toMerge = map.remove("<<");
if (toMerge != null) {
- Map, ?> orig = new LinkedHashMap<>(map);
+ var orig = new LinkedHashMap<>(map);
// to preserve the map key order we insert the merged operator objects first, then the original ones
map.clear();
- mergeInto(map, toMerge);
- mergeInto(map, orig);
+ mergeInto(map, toMerge, false);
+ mergeInto(map, orig, true);
}
for (var value : map.values()) {
handleMergeOperator(value);
@@ -68,12 +68,16 @@ private static void handleMergeOperator(Object parsed) {
}
@SuppressWarnings("rawtypes")
- private static void mergeInto(Map dest, Object source) {
+ private static void mergeInto(Map dest, Object source, boolean replace) {
if (source instanceof Map, ?> map) {
- dest.putAll(map);
+ if (replace) {
+ dest.putAll(map);
+ } else {
+ map.forEach(dest::putIfAbsent);
+ }
} else if (source instanceof List> nesteds) {
for (var nested : nesteds) {
- mergeInto(dest, nested);
+ mergeInto(dest, nested, replace);
}
}
}
diff --git a/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java b/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java
index 67561f262b..f28eb20b00 100644
--- a/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java
+++ b/planetiler-core/src/test/java/com/onthegomap/planetiler/util/YamlTest.java
@@ -123,7 +123,7 @@ void testMergeOperatorMultiple() {
a: 2
b: 3
dest:
- a: 2
+ a: 1 # from label1 since it came first
b: 4
c: 5
z: 1
@@ -182,10 +182,11 @@ void testMergeOperatorFromDraft1() {
- &BIG { r: 10 }
- &SMALL { r: 1 }
- # Merge one map
- << : *CENTER
- r: 10
- label: center/big
+ << : *CENTER
+ r: 10
+ label: center/big
""");
+ }
@Test
void testMergeOperatorFromDraft2() {