static void mergeFrameworkProperties()

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());
        }
    }