/*
* RHQ Management Platform
* Copyright (C) 2005-2009 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.rhqtransform.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import net.augeas.Augeas;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.augeas.config.AugeasConfiguration;
import org.rhq.augeas.config.AugeasModuleConfig;
import org.rhq.augeas.util.Glob;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.rhqtransform.AugeasRhqException;
/**
* This class implements the augeas configuration interface by reading the settings
* from the plugin descriptor.
*
* @author Filip Drabek
* @author Ian Springer
*
*/
public class PluginDescriptorBasedAugeasConfiguration implements AugeasConfiguration {
public static final String INCLUDE_GLOBS_PROP = "configurationFilesInclusionPatterns";
public static final String EXCLUDE_GLOBS_PROP = "configurationFilesExclusionPatterns";
public static final String AUGEAS_MODULE_NAME_PROP = "augeasModuleName";
public static final String AUGEAS_LOAD_PATH = "augeasLoadPath";
public static final String DEFAULT_AUGEAS_ROOT_PATH = File.listRoots()[0].getPath();
private final Log log = LogFactory.getLog(this.getClass());
protected List<AugeasModuleConfig> modules;
protected String loadPath;
/**
* Instantiates new augeas configuration based on the data in the provided
* plugin configuration.
* See the constants in this class for the expected properties.
*
* @param pluginConfiguration
* @throws AugeasRhqException
*/
public PluginDescriptorBasedAugeasConfiguration(String path,Configuration pluginConfiguration) throws AugeasRhqException {
List<String> includes = determineGlobs(pluginConfiguration, INCLUDE_GLOBS_PROP);
List<String> excludes = determineGlobs(pluginConfiguration, EXCLUDE_GLOBS_PROP);
modules = new ArrayList<AugeasModuleConfig>();
if (includes.isEmpty())
throw new AugeasRhqException("At least one Include glob must be defined.");
try {
loadPath = pluginConfiguration.getSimpleValue(AUGEAS_LOAD_PATH, "");
if (loadPath.equals("")){
loadPath = path;
}
AugeasModuleConfig config = new AugeasModuleConfig();
config.setIncludedGlobs(includes);
config.setExcludedGlobs(excludes);
config.setLensPath(getAugeasModuleName(pluginConfiguration) + ".lns");
config.setModuletName(getAugeasModuleName(pluginConfiguration));
modules.add(config);
}catch(Exception e){
log.error("Creation of temporary Directory for augeas lens failed.");
throw new AugeasRhqException("Creation of temporary Directory for augeas lens failed.",e);
}
}
protected List<String> determineGlobs(Configuration configuration, String name) {
PropertySimple includeGlobsProp = configuration.getSimple(name);
if (includeGlobsProp == null)
return null;
List<String> ret = new ArrayList<String>();
ret.addAll(getGlobList(includeGlobsProp));
return ret;
}
protected String getAugeasModuleName(Configuration configuration) {
return (configuration.getSimpleValue(AUGEAS_MODULE_NAME_PROP, null));
}
public static PropertySimple getGlobList(String name, List<String> simples) {
StringBuilder bld = new StringBuilder();
if (simples != null) {
for (String s : simples) {
bld.append(s).append("|");
}
}
if (bld.length() > 0) {
bld.deleteCharAt(bld.length() - 1);
}
return new PropertySimple(name, bld);
}
public static List<String> getGlobList(PropertySimple list) {
if (list != null && list.getStringValue() != null) {
return Arrays.asList(list.getStringValue().split("\\s*\\|\\s*"));
} else {
return Collections.emptyList();
}
}
public Configuration updateConfiguration(Configuration configuration) throws AugeasRhqException {
if (modules.isEmpty())
throw new AugeasRhqException("Error in augeas Configuration.");
AugeasModuleConfig tempModule = modules.get(0);
PropertySimple includeProps = getGlobList(INCLUDE_GLOBS_PROP, tempModule.getIncludedGlobs());
PropertySimple excludeProps = getGlobList(EXCLUDE_GLOBS_PROP, tempModule.getExcludedGlobs());
configuration.put(includeProps);
configuration.put(excludeProps);
return configuration;
}
public String getLoadPath() {
return loadPath;
}
public int getMode() {
return Augeas.NO_MODL_AUTOLOAD;
}
public List<AugeasModuleConfig> getModules() {
return modules;
}
public String getRootPath() {
return DEFAULT_AUGEAS_ROOT_PATH;
}
public AugeasModuleConfig getModuleByName(String name) {
for (AugeasModuleConfig module : modules) {
if (module.getModuletName().equals(name))
return module;
}
return null;
}
public void loadFiles() {
File root = new File(getRootPath());
for (AugeasModuleConfig module : modules){
List<String> includeGlobs = module.getIncludedGlobs();
if (includeGlobs.size() <= 0) {
throw new IllegalStateException("Expecting at least once inclusion pattern for configuration files.");
}
List<File> files = Glob.matchAll(root, includeGlobs, Glob.ALPHABETICAL_COMPARATOR);
if (module.getExcludedGlobs() != null) {
List<String> excludeGlobs = module.getExcludedGlobs();
Glob.excludeAll(files, excludeGlobs);
}
for (File configFile : files) {
if (!configFile.isAbsolute()) {
throw new IllegalStateException("Configuration files inclusion patterns contain a non-absolute file.");
}
if (!configFile.exists()) {
throw new IllegalStateException("Configuration files inclusion patterns refer to a non-existent file.");
}
if (configFile.isDirectory()) {
throw new IllegalStateException("Configuration files inclusion patterns refer to a directory.");
}
if (!module.getConfigFiles().contains(configFile.getAbsolutePath()))
module.addConfigFile(configFile.getAbsolutePath());
}
}
}
}