blob: 4ef7de54b7d50a67a5b0263513297999c3fa3d97 [file] [log] [blame]
/*
* Licensed 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.karaf.management.mbeans.config.internal;
import org.apache.felix.utils.properties.Properties;
import org.apache.karaf.management.mbeans.config.ConfigMBean;
import org.osgi.framework.Constants;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import javax.management.NotCompliantMBeanException;
import javax.management.StandardMBean;
import java.io.File;
import java.util.*;
/**
* Implementation of the ConfigMBean.
*/
public class ConfigMBeanImpl extends StandardMBean implements ConfigMBean {
private final String FELIX_FILEINSTALL_FILENAME = "felix.fileinstall.filename";
private ConfigurationAdmin configurationAdmin;
private File storage;
public ConfigurationAdmin getConfigurationAdmin() {
return this.configurationAdmin;
}
public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
this.configurationAdmin = configurationAdmin;
}
public File getStorage() {
return this.storage;
}
public void setStorage(File storage) {
this.storage = storage;
}
public ConfigMBeanImpl() throws NotCompliantMBeanException {
super(ConfigMBean.class);
}
public List<String> list() throws Exception {
Configuration[] configurations = configurationAdmin.listConfigurations(null);
List<String> pids = new ArrayList<String>();
for (int i = 0; i < configurations.length; i++) {
pids.add(configurations[i].getPid());
}
return pids;
}
public void create(String pid) throws Exception {
store(pid, new Hashtable(), false);
}
public void delete(String pid) throws Exception {
Configuration configuration = configurationAdmin.getConfiguration(pid);
if (configuration == null) {
throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
}
configuration.delete();
if (storage != null) {
File cfgFile = new File(storage, pid + ".cfg");
cfgFile.delete();
}
}
public Map<String, String> proplist(String pid) throws Exception {
Configuration configuration = configurationAdmin.getConfiguration(pid);
if (configuration == null) {
throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
}
Dictionary dictionary = configuration.getProperties();
if (dictionary == null) {
dictionary = new java.util.Properties();
}
Map<String, String> propertiesMap = new HashMap<String, String>();
for (Enumeration e = dictionary.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
Object value = dictionary.get(key);
propertiesMap.put(key.toString(), value.toString());
}
return propertiesMap;
}
public void propdel(String pid, String key) throws Exception {
Configuration configuration = configurationAdmin.getConfiguration(pid);
if (configuration == null) {
throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
}
Dictionary dictionary = configuration.getProperties();
if (dictionary == null) {
dictionary = new java.util.Properties();
}
dictionary.remove(key);
store(pid, dictionary, false);
}
public void propappend(String pid, String key, String value) throws Exception {
Configuration configuration = configurationAdmin.getConfiguration(pid);
if (configuration == null) {
throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
}
Dictionary dictionary = configuration.getProperties();
if (dictionary == null) {
dictionary = new java.util.Properties();
}
Object currentValue = dictionary.get(key);
if (currentValue == null) {
dictionary.put(key, value);
} else if (currentValue instanceof String) {
dictionary.put(key, currentValue + value);
} else {
throw new IllegalStateException("Current value is not a String");
}
store(pid, dictionary, false);
}
public void propset(String pid, String key, String value) throws Exception {
Configuration configuration = configurationAdmin.getConfiguration(pid);
if (configuration == null) {
throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
}
Dictionary dictionary = configuration.getProperties();
if (dictionary == null) {
dictionary = new java.util.Properties();
}
dictionary.put(key, value);
store(pid, dictionary, false);
}
/**
* Store/flush a configuration PID into the configuration file.
*
* @param pid the configuration PID.
* @param properties the configuration properties.
* @throws Exception
*/
private void store(String pid, Dictionary properties, boolean bypassStorage) throws Exception {
if (!bypassStorage && storage != null) {
File storageFile = new File(storage, pid + ".cfg");
Configuration configuration = configurationAdmin.getConfiguration(pid, null);
if (configuration != null && configuration.getProperties() != null) {
Object val = configuration.getProperties().get(FELIX_FILEINSTALL_FILENAME);
if (val instanceof String) {
if (((String) val).startsWith("file:")) {
val = ((String) val).substring("file:".length());
}
storageFile = new File((String) val);
}
}
Properties p = new Properties(storageFile);
p.clear();
for (Enumeration keys = properties.keys(); keys.hasMoreElements(); ) {
Object key = keys.nextElement();
if (!Constants.SERVICE_PID.equals(key)
&& !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
&& !FELIX_FILEINSTALL_FILENAME.equals(key)) {
p.put((String) key, (String) properties.get(key));
}
}
storage.mkdirs();
p.save();
} else {
Configuration cfg = configurationAdmin.getConfiguration(pid, null);
if (cfg.getProperties() == null) {
String[] pids = parsePid(pid);
if (pids[1] != null) {
cfg = configurationAdmin.createFactoryConfiguration(pids[0], null);
}
}
if (cfg.getBundleLocation() != null) {
cfg.setBundleLocation(null);
}
cfg.update(properties);
}
}
private String[] parsePid(String pid) {
int n = pid.indexOf('-');
if (n > 0) {
String factoryPid = pid.substring(n + 1);
pid = pid.substring(0, n);
return new String[] { pid, factoryPid };
} else {
return new String[] { pid, null };
}
}
}