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