in src/main/java/org/apache/sling/feature/builder/BuilderUtil.java [602:652]
static void mergeExtensions(final Extension target,
final Extension source,
final Feature sourceFeature,
final List<ArtifactId> artifactOverrides,
final String originKey) {
switch ( target.getType() ) {
case TEXT : // simply append
target.setText((target.getText() != null && !target.getText().trim().isEmpty() ? (target.getText() + "\n") : "") + source.getText());
break;
case JSON : JsonStructure struct1;
if (target.getJSON() != null) {
try (final StringReader reader = new StringReader(target.getJSON())) {
struct1 = Json.createReader(reader).read();
}
JsonStructure struct2;
try (final StringReader reader = new StringReader(source.getJSON())) {
struct2 = Json.createReader(reader).read();
}
if (struct1.getValueType() != struct2.getValueType()) {
throw new IllegalStateException("Found different JSON types for extension " + target.getName()
+ " : " + struct1.getValueType() + " and " + struct2.getValueType());
}
if (struct1.getValueType() == ValueType.ARRAY) {
final JsonArrayBuilder builder = Json.createArrayBuilder();
Stream.concat(
((JsonArray) struct1).stream(),
((JsonArray) struct2).stream()
).forEachOrdered(builder::add);
struct1 = builder.build();
} else {
// object is merge
struct1 = merge((JsonObject) struct1, (JsonObject) struct2);
}
StringWriter buffer = new StringWriter();
try (JsonWriter writer = Json.createWriter(buffer)) {
writer.write(struct1);
}
target.setJSON(buffer.toString());
} else {
target.setJSON(source.getJSON());
}
break;
case ARTIFACTS:
mergeArtifacts(target.getArtifacts(), source.getArtifacts(), sourceFeature, artifactOverrides, originKey);
break;
}
}