/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.config.internal;
import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import java.util.Map.Entry;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.eclipse.virgo.kernel.serviceability.NonNull;
import org.eclipse.virgo.util.common.IterableEnumeration;
/**
* <code>ConfigurationPublisher</code>, publishes kernel configuration to {@link ConfigurationAdmin}.
* <p/>
* Properties files in {@link KernelConfiguration#getConfigDirectories() config directories} are read in and applied to
* {@link Configuration Configurations} owned by <code>ConfigurationAdmin</code>. A file called
* <code><i>name</i>.properties</code> results in a <Code>Configuration</code> with the service pid
* <code><i>name</i></code>.
* <p/>
*
* <strong>Concurrent Semantics</strong><br />
*
* Thread-safe.
*
*
*/
final class ConfigurationPublisher {
private final ConfigurationAdmin configAdmin;
private final PropertiesSource[] sources;
ConfigurationPublisher(ConfigurationAdmin configAdmin, PropertiesSource... sources) {
this.configAdmin = configAdmin;
this.sources = (sources == null ? new PropertiesSource[0] : sources);
}
void publishConfigurations() throws IOException {
for (PropertiesSource source : this.sources) {
Map<String, Properties> configurationProperties = source.getConfigurationProperties();
if (configurationProperties != null) {
for (Entry<String, Properties> entry : configurationProperties.entrySet()) {
populateConfigurationWithProperties(entry.getKey(), entry.getValue());
}
}
}
}
@SuppressWarnings("unchecked")
private void populateConfigurationWithProperties(@NonNull String pid, @NonNull Properties properties) throws IOException {
Configuration config = this.configAdmin.getConfiguration(pid, null);
Dictionary configProperties = config.getProperties();
if (configProperties == null) {
configProperties = new Hashtable();
}
for (Object key : new IterableEnumeration(properties.keys())) {
Object value = properties.get(key);
configProperties.put(key, value);
}
config.update(configProperties);
}
}