blob: dd76471aa1a839db7d29b56ad1c0abed364c5e9b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.caconfig.impl.metadata;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.sling.caconfig.management.multiplexer.ConfigurationMetadataProviderMultiplexer;
import org.apache.sling.caconfig.spi.ConfigurationMetadataProvider;
import org.apache.sling.caconfig.spi.metadata.ConfigurationMetadata;
import org.apache.sling.commons.osgi.Order;
import org.apache.sling.commons.osgi.RankedServices;
import org.jetbrains.annotations.NotNull;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;
/**
* Detects all {@link ConfigurationMetadataProvider} implementations in the container
* and consolidates their result based on service ranking.
*/
@Component(service = ConfigurationMetadataProviderMultiplexer.class,
reference={
@Reference(name="configurationMetadataProvider", service=ConfigurationMetadataProvider.class,
bind="bindConfigurationMetadataProvider", unbind="unbindConfigurationMetadataProvider",
cardinality=ReferenceCardinality.MULTIPLE,
policy=ReferencePolicy.DYNAMIC, policyOption=ReferencePolicyOption.GREEDY)
})
public class ConfigurationMetadataProviderMultiplexerImpl implements ConfigurationMetadataProviderMultiplexer {
private RankedServices<ConfigurationMetadataProvider> items = new RankedServices<>(Order.DESCENDING);
protected void bindConfigurationMetadataProvider(ConfigurationMetadataProvider configurationMetadataProvider, Map<String, Object> props) {
items.bind(configurationMetadataProvider, props);
}
protected void unbindConfigurationMetadataProvider(ConfigurationMetadataProvider configurationMetadataProvider, Map<String, Object> props) {
items.unbind(configurationMetadataProvider, props);
}
/**
* Merge configuration names from all providers.
*/
@Override
public @NotNull SortedSet<String> getConfigurationNames() {
SortedSet<String> configNames = new TreeSet<>();
for (ConfigurationMetadataProvider item : items) {
configNames.addAll(item.getConfigurationNames());
}
return configNames;
}
/**
* Get configuration metadata from first provider (ranking priority) that has an answer.
*/
@Override
public ConfigurationMetadata getConfigurationMetadata(String configName) {
for (ConfigurationMetadataProvider item : items) {
ConfigurationMetadata configMetadata = item.getConfigurationMetadata(configName);
if (configMetadata != null) {
return configMetadata;
}
}
return null;
}
}