in src/main/java/org/apache/sling/feature/builder/BuilderUtil.java [716:746]
private static JsonObject merge(final JsonObject obj1, final JsonObject obj2) {
JsonObjectBuilder builder = Json.createObjectBuilder();
for (final Map.Entry<String, JsonValue> entry : obj1.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
for(final Map.Entry<String, JsonValue> entry : obj2.entrySet()) {
if ( !obj1.containsKey(entry.getKey()) ) {
builder.add(entry.getKey(), entry.getValue());
} else {
final JsonValue oldValue = obj1.get(entry.getKey());
if ( oldValue.getValueType() != entry.getValue().getValueType() ) {
// new type wins
builder.add(entry.getKey(), entry.getValue());
} else if ( oldValue.getValueType() == ValueType.ARRAY ) {
final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
Stream.concat(
((JsonArray) oldValue).stream(),
((JsonArray)entry.getValue()).stream()
).forEachOrdered(arrayBuilder::add);
builder.add(entry.getKey(), arrayBuilder.build());
} else if ( oldValue.getValueType() == ValueType.OBJECT ) {
builder.add(entry.getKey(), merge((JsonObject)oldValue, (JsonObject)entry.getValue()));
} else {
builder.add(entry.getKey(), entry.getValue());
}
}
}
return builder.build();
}