package it.unina.seclab.jafimon;
import org.apache.log4j.Logger;
import it.unina.seclab.jafimon.activators.IPhysicalActivator;
import it.unina.seclab.jafimon.exceptions.CannotIstantiatePhysicalActivatorException;
import it.unina.seclab.jafimon.exceptions.CannotPrepareSystemException;
import it.unina.seclab.jafimon.interfaces.IActivator;
/**
* L'<code>Activator</code> si fa carico di instanziare lo specifico attivatore
* fisico per il sistema oggetto. L'uso di questa classe realizza in effetti la
* separazione tra il comportamento generale di un attivatore di sistema e lo
* specifico attivatore proprio del sistema da testare secondo il pattern di
* progettazione utilizzato.
*
* @author Mauro Iorio
*
*/
public class Activator implements IActivator {
private static final Logger logger = Logger.getRootLogger();
/**
* La reference all'istanza corrente del <code>PhysicalActivator</code>
*/
private IPhysicalActivator physicalActivator;
/**
* La reference alla <code>Configuration</code> utilizzata durante il test
*/
private Configuration theCfg = null;
/**
* La reference al <code>MonitoredDataManager</code> utilizzato durenta il test
*/
private MonitoredDataManager theDataMgr = null;
/**
* Crea il <code>PhysicalActivator</code> corrispondente al sistema da testare e gli delega
* il compito di preparare ed avviare il sistema.
* Questo metodo e' basato sull'assunto che il <code>PhysicalActivator</code> desiderato
* esporti un costruttore pubblico a zero operandi (es. public Tomcat5Activator() ). In
* tal modo puo' ottenere una istanza del costruttore della classe e da questo una istanza
* della classe stessa tramite reflection.
*
* @param sysName il nome del sistema da avviare. Esso consente di istanziare correttamente il <code>PhysicalActivator</code>
* @param cfg la configurazione da utilizzare
* @param dataMgr il <code>MonitoredDataManager</code> da utilizzare per il log degli eventi di monitoraggio.
* NOTA: l'oggetto identificato dal parametro deve essere agganciato all'istanza della classe <code>Monitor</code>
* che si occupa di caricare la main class del sistema in test.
*
* @throws CannotIstantiatePhysicalActivatorException
*/
public void startSystem(String sysName, Configuration cfg, MonitoredDataManager dataMgr) throws CannotIstantiatePhysicalActivatorException {
String paName = "it.unina.seclab.jafimon.activators." + sysName + "Activator";
logger.info("Preparing " + sysName + " activation");
theCfg = cfg;
theDataMgr = dataMgr;
try {
physicalActivator = (IPhysicalActivator) Class.forName(paName).getConstructor(new Class[0]).newInstance(new Object[0]);
physicalActivator.prepareSystem(theCfg,theDataMgr);
physicalActivator.startSystem(theCfg,theDataMgr);
} catch (CannotPrepareSystemException e) {
logger.error(e.getLocalizedMessage());
throw new CannotIstantiatePhysicalActivatorException(e.getLocalizedMessage());
} catch (Exception e) {
logger.error("Unable to create an instance of " + sysName + "Activator. The message is \"" + e.getClass().getName() + ": " + e.getLocalizedMessage() + "\"");
throw new CannotIstantiatePhysicalActivatorException(sysName, e.getClass().getName() + ": " + e.getLocalizedMessage());
}
logger.info(sysName + " activated and started");
}
public void stopSystem() {
logger.info("Stopping " + physicalActivator.getSystemName() + " ...");
try {
physicalActivator.stopSystem();
physicalActivator.restoreSystem(theCfg, theDataMgr);
theCfg = null;
theDataMgr= null;
} catch (Exception e) {
logger.error(e.getLocalizedMessage());
// TODO Propago l'eccezione
}
logger.info(physicalActivator.getSystemName() + " stopped");
}
}