package it.unina.seclab.jafimon;
import it.unina.seclab.jafimon.exceptions.CannotWriteFileException;
import it.unina.seclab.jafimon.exceptions.GenericConfigurationParsingException;
import it.unina.seclab.jafimon.exceptions.GenericConfigurationTrasformException;
import it.unina.seclab.jafimon.exceptions.InvalidConfigurationFileException;
import it.unina.seclab.jafimon.interfaces.IConfigurationManager;
import it.unina.seclab.jafimon.util.SystemEnvironmentVariables;
import it.unina.seclab.jafimon.Configuration;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import org.apache.log4j.Logger;
/**
* Il gestore delle configurazioni utilizzato dal framework
*
* @author Mauro Iorio
*
*/
public class ConfigurationManager implements IConfigurationManager {
private Logger logger = Logger.getRootLogger();
/**
* La <code>Configuration</code> attiva
*/
private Configuration activeConfig;
/**
* La posizione della cartella che contiene le configurazioni.
* NOTA:
* Il nome della <code>Configuration</code> NON include il <code>cfgBasePath</code>, ma solo
* il nome del file (completo di percorso relativo alla cartella <code>cfgBasePath</code>).
* Di conseguenza i metodi del <code>ConfigurationManager</code> che operano sui file delle
* <code>Configuration</code> dovranno prependere al nome il <code>cfgBasePath</code>.
*/
private String cfgBasePath;
public ConfigurationManager() {
try {
cfgBasePath = SystemEnvironmentVariables.getEnvironmentVariable("JAFIMON_HOME") + File.separator + "data" + File.separator + "configurations";
} catch (IOException e) {
cfgBasePath = "data" + File.separator + "configurations";
}
}
/**
* Scorre il percorso indicato da basePath alla ricerca di files, restituendone
* la lista.
*
* @param basePath il percorso dal quale avviare la ricerca
* @param v il vettore che conterra' la lista dei file
*/
private void listaFiles(String basePath, String filter, Vector v) {
//logger.trace("basePath = \"" + basePath + "\"");
//logger.trace("filter = \"" + filter + "\"");
String[] basePathList = new File(basePath).list();
//logger.trace("basePathList = \"" + basePathList + "\"");
for (int i = 0; i < basePathList.length; i++) {
File f = new File(basePath + File.separator + basePathList[i]);
if (f.isFile()) {
if (f.getName().endsWith(filter)) {
String n = new String(basePath + File.separator + basePathList[i]);
v.addElement(n.substring((cfgBasePath + File.separator).length()));
}
}
else {
listaFiles(basePath + File.separator + basePathList[i],filter,v);
}
}
}
public void deleteConfig(String name) {
Vector v = new Vector();
listaFiles(cfgBasePath + File.separator + name.substring(0, name.lastIndexOf(File.separator)),"",v);
Enumeration e = v.elements();
while (e.hasMoreElements()) {
String s = cfgBasePath + File.separator + (String) e.nextElement();
if(! (new File(s).delete()))
logger.warn("Unable to delete \"" + s + "\"");
}
if (! (new File(cfgBasePath + File.separator + name.substring(0, name.lastIndexOf(File.separator))).delete()))
logger.warn("Unable to delete \"" + cfgBasePath + File.separator + name + "\"");
}
public String[] getList() {
Vector v = new Vector();
listaFiles(cfgBasePath,".xml",v);
String[] s = new String[v.size()];
v.copyInto(s);
return s;
}
public void selectConfig(String name) throws FileNotFoundException,
InvalidConfigurationFileException,
GenericConfigurationParsingException {
activeConfig = new Configuration(name);
activeConfig.load(cfgBasePath);
}
public void storeConfig(Configuration cfg) throws CannotWriteFileException,
GenericConfigurationTrasformException {
cfg.save(cfgBasePath);
}
public void updateConfig(Configuration cfg) throws CannotWriteFileException,
GenericConfigurationTrasformException {
deleteConfig(cfg.getName()); // Qui il cfgBasePath e' aggiunto dalla deleteConfig
cfg.save(cfgBasePath);
}
/**
* Restituisce la <code>Configuration</code> attiva
*
* @return la <code>Configuration</code> attiva
*/
public Configuration getActiveConfig() {
return activeConfig;
}
}