public void merge()

in src/main/java/org/apache/sling/feature/extension/apiregions/ConfigurationApiMergeHandler.java [51:120]


    public void merge(final HandlerContext context, 
        final Feature targetFeature, 
        final Feature sourceFeature, 
        final Extension targetExtension, 
        final Extension sourceExtension) {

        if ( targetExtension == null ) {
            // no target available yet, just copy source and update cache
            final ConfigurationApi sourceApi = ConfigurationApi.getConfigurationApi(sourceExtension);
            sourceApi.getFeatureToRegionCache().put(sourceFeature.getId(), sourceApi.detectRegion());

            ConfigurationApi.setConfigurationApi(targetFeature, sourceApi);
        } else {
            final ConfigurationApi sourceApi = ConfigurationApi.getConfigurationApi(sourceExtension);
            final ConfigurationApi targetApi = ConfigurationApi.getConfigurationApi(targetExtension);

            // region merging
            if ( context.isInitialMerge() ) {
                targetApi.setRegion(sourceApi.getRegion());
                targetApi.setMode(sourceApi.getMode());
            } else {
                // region merging is different for prototypes
                if ( sourceApi.getRegion() != targetApi.getRegion() ) {
                    if ( context.isPrototypeMerge() ) {
                        if ( sourceApi.getRegion() != null ) {
                            targetApi.setRegion(sourceApi.getRegion());
                        }
                    } else {                    
                        targetApi.setRegion(Region.GLOBAL);
                    }
                }
                if ( targetApi.getMode().ordinal() > sourceApi.getMode().ordinal() ) {
                    targetApi.setMode(sourceApi.getMode());
                }
            }

            // merge - but throw on duplicates
            for(final Map.Entry<String, ConfigurationDescription> entry : sourceApi.getConfigurationDescriptions().entrySet()) {
                if ( targetApi.getConfigurationDescriptions().containsKey(entry.getKey())) {
                    throw new IllegalStateException("Duplicate configuration description " + entry.getKey());
                }
                targetApi.getConfigurationDescriptions().put(entry.getKey(), entry.getValue());
            }
            for(final Map.Entry<String, FactoryConfigurationDescription> entry : sourceApi.getFactoryConfigurationDescriptions().entrySet()) {
                if ( targetApi.getFactoryConfigurationDescriptions().containsKey(entry.getKey())) {
                    throw new IllegalStateException("Duplicate factory configuration description " + entry.getKey());
                }
                targetApi.getFactoryConfigurationDescriptions().put(entry.getKey(), entry.getValue());
            }
            for(final Map.Entry<String, FrameworkPropertyDescription> entry : sourceApi.getFrameworkPropertyDescriptions().entrySet()) {
                if ( targetApi.getFrameworkPropertyDescriptions().containsKey(entry.getKey())) {
                    throw new IllegalStateException("Duplicate framework property description " + entry.getKey());
                }
                targetApi.getFrameworkPropertyDescriptions().put(entry.getKey(), entry.getValue());
            }
            targetApi.getInternalFrameworkProperties().addAll(sourceApi.getInternalFrameworkProperties());

            // update cache
            if ( !context.isPrototypeMerge() ) {
                targetApi.getFeatureToRegionCache().put(sourceFeature.getId(), sourceApi.detectRegion());
                targetApi.getFeatureToRegionCache().putAll(sourceApi.getFeatureToRegionCache());
            }

            // check for additions
            processAdditions(targetApi, targetApi, false);
            processAdditions(targetApi, sourceApi, true);

            ConfigurationApi.setConfigurationApi(targetFeature, targetApi);
        }
    }