in src/main/java/org/apache/sling/feature/builder/BuilderUtil.java [535:573]
static void mergeFrameworkProperties(final Feature targetFeature, final Feature sourceFeature, final Map<String,String> overrides) {
final Map<String,String> result = new LinkedHashMap<>();
final Map<String, Map<String, Object>> metadata = new HashMap<>();
// keep values from target features, no need to update origin
for (Map.Entry<String, String> entry : targetFeature.getFrameworkProperties().entrySet()) {
result.put(entry.getKey(), overrides.containsKey(entry.getKey()) ? overrides.get(entry.getKey()) : entry.getValue());
metadata.put(entry.getKey(), targetFeature.getFrameworkPropertyMetadata(entry.getKey()));
}
// merge in from source feature
for (Map.Entry<String, String> entry : sourceFeature.getFrameworkProperties().entrySet()) {
final List<ArtifactId> targetIds = (metadata.containsKey(entry.getKey())) ?
new ArrayList<>(targetFeature.getFeatureOrigins(metadata.get(entry.getKey()))) : new ArrayList<>();
targetIds.add(sourceFeature.getId());
if ( overrides.containsKey(entry.getKey()) ) {
result.put(entry.getKey(), overrides.get(entry.getKey()));
} else {
String value = entry.getValue();
if (value != null) {
String targetValue = targetFeature.getFrameworkProperties().get(entry.getKey());
if (targetValue != null) {
if (!value.equals(targetValue)) {
throw new IllegalStateException(String.format("Can't merge framework property '%s' defined twice (as '%s' v.s. '%s') and not overridden.", entry.getKey(), value, targetValue));
}
} else {
result.put(entry.getKey(), value);
}
} else if (!targetFeature.getFrameworkProperties().containsKey(entry.getKey())) {
result.put(entry.getKey(), value);
}
}
metadata.put(entry.getKey(), new HashMap<>(sourceFeature.getFrameworkPropertyMetadata(entry.getKey())));
targetFeature.setFeatureOrigins(metadata.get(entry.getKey()), targetIds);
}
targetFeature.getFrameworkProperties().clear();
targetFeature.getFrameworkProperties().putAll(result);
for(final Map.Entry<String, Map<String, Object>> entry : metadata.entrySet()) {
targetFeature.getFrameworkPropertyMetadata(entry.getKey()).putAll(entry.getValue());
}
}