/*
* 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.augeas;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import net.augeas.Augeas;
import net.augeas.AugeasException;
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.tree.AugeasTree;
import org.rhq.augeas.tree.AugeasTreeBuilder;
import org.rhq.augeas.tree.AugeasTreeException;
import org.rhq.augeas.tree.impl.DefaultAugeasTreeBuilder;
/**
* This is the main entry point for interfacing with Augeas.
*
* The proxy is supplied with {@link AugeasConfiguration} that configures
* what and how Augeas should load and optionally with an {@link AugeasTreeBuilder} which
* specifies how to build an in memory representation of the tree returned from Augeas
* itself (see {@link AugeasTree}).
*
* @author Filip Drabek
* @author Ian Springer
*
*/
public class AugeasProxy {
private final Log log = LogFactory.getLog(this.getClass());
private AugeasConfiguration config;
private Augeas augeas;
private List<String> modules;
private AugeasTreeBuilder augeasTreeBuilder;
/**
* Instantiates new proxy with supplied configuration and
* {@link DefaultAugeasTreeBuilder} as the tree builder.
*
* @param config the augeas configuration.
*/
public AugeasProxy(AugeasConfiguration config) {
this(config, new DefaultAugeasTreeBuilder());
}
public AugeasProxy(AugeasConfiguration config, AugeasTreeBuilder builder) {
this.config = config;
this.augeasTreeBuilder = builder;
modules = new ArrayList<String>();
}
/**
* @return the Augeas configuration of the proxy
*/
public AugeasConfiguration getConfiguration() {
return config;
}
/**
* @return the tree builder used to build augeas trees
*/
public AugeasTreeBuilder getTreeBuilder() {
return augeasTreeBuilder;
}
/**
* Initializes and loads the Augeas tree.
*
* @throws AugeasTreeException
* @throws AugeasException if Augeas could not be initialized.
*/
public void load() throws AugeasTreeException {
try {
config.loadFiles();
if (augeas != null) {
try {
augeas.close();
} catch (Exception e) {
log.error("Could not close augeas instance", e);
}
}
augeas = new Augeas(config.getRootPath(), config.getLoadPath(), config.getMode());
for (AugeasModuleConfig module : config.getModules()) {
modules.add(module.getModuletName());
augeas.set("/augeas/load/" + module.getModuletName() + "/lens", module.getLensPath());
int idx = 1;
for (String incl : module.getConfigFiles()) {
augeas.set("/augeas/load/" + module.getModuletName() + "/incl[" + (idx++) + "]", incl);
}
}
augeas.load();
} catch (NoClassDefFoundError e) {
throw new AugeasException("Failed to initialize Augeas. It is probably not installed.", e);
} catch (Exception e) {
throw new AugeasException(e);
}
}
/**
* Produces the Augeas tree by loading it from augeas (if {@link #load()} wasn't called already)
* and calling out to the tree builder to construct the tree.
*
* @param moduleName the name of the Augeas module to use for loading
* @param lazy true if the tree is lazily initialized, false for eager initialization
* @return the tree
* @throws AugeasTreeException if the specified module wasn't configured or if there was some error loading
* the tree.
*/
public AugeasTree getAugeasTree(String moduleName, boolean lazy) throws AugeasTreeException {
if (!modules.contains(moduleName))
throw new AugeasTreeException("Augeas Module " + moduleName + " not found.");
try {
if (augeas == null)
load();
} catch (Exception e) {
throw new AugeasTreeException("Loading of augeas failed");
}
AugeasTree tree;
try {
tree = augeasTreeBuilder.buildTree(this, config, moduleName, lazy);
} catch (Exception e) {
throw new AugeasTreeException("Error building Augeas tree.", e);
}
return tree;
}
/**
* A helper method to produce the string representation of the tree.
*
* @param path
* @return
*/
public String printTree(String path) {
StringBuilder builder = new StringBuilder();
builder.append(path).append(" ").append(augeas.get(path)).append('\n');
List<String> list = augeas.match(path + File.separatorChar + "*");
for (String tempStr : list) {
builder.append(printTree(tempStr));
}
return builder.toString();
}
/**
*
* @return the underlying Augeas API instance.
*/
public Augeas getAugeas() {
return augeas;
}
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable {
close();
super.finalize();
}
public void close() {
if (augeas != null) {
try {
augeas.close();
} catch (Exception e) {
log.error("Could not close augeas instance", e);
}
augeas = null;
}
}
}