package org.jboss.jbossts.xts.recovery.coordinator;
import com.arjuna.ats.arjuna.recovery.RecoveryManager;
import com.arjuna.ats.arjuna.recovery.RecoveryModule;
import org.jboss.jbossts.xts.environment.RecoveryEnvironmentBean;
import org.jboss.jbossts.xts.environment.XTSPropertyManager;
import org.jboss.jbossts.xts.recovery.logging.RecoveryLogger;
import org.jboss.jbossts.xts.recovery.XTSRecoveryModule;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* manager allowing XTS coordinator recovery modules to be registered at startup and unregistered at shutdown.
*/
public class CoordinatorRecoveryInitialisation
{
/**
* the list of XTS recovery modules actually registered with the JBossTS recovery manager
*/
private static List<XTSRecoveryModule> recoveryModules = new ArrayList<XTSRecoveryModule>();
/**
* flag to identify if we have already been initialised
*/
private static boolean initialised = false;
/**
* initialisation routine which registers all configured XTS recovery modules
*/
public static void startup()
{
if (initialised) {
return;
}
RecoveryEnvironmentBean recoveryEnvironmentBean = XTSPropertyManager.getRecoveryEnvironmentBean();
List<String> modules = recoveryEnvironmentBean.getCoordinatorRecoveryModules();
Iterator<String> iterator = modules.iterator();
while (iterator.hasNext())
{
String className = (String) iterator.next();
Class<?> clazz = null;
try {
clazz = CoordinatorRecoveryInitialisation.class.getClassLoader().loadClass(className);
} catch (ClassNotFoundException cnfe) {
RecoveryLogger.i18NLogger.error_recovery_coordinator_CoordinatorRecoveryInitialisation_1(className, cnfe);
continue;
}
if (!RecoveryModule.class.isAssignableFrom(clazz)) {
RecoveryLogger.i18NLogger.error_recovery_coordinator_CoordinatorRecoveryInitialisation_2(className);
continue;
}
try {
XTSRecoveryModule module = (XTSRecoveryModule)clazz.newInstance();
module.install();
RecoveryManager.manager().addModule(module);
recoveryModules.add(module);
} catch (InstantiationException ie) {
RecoveryLogger.i18NLogger.error_recovery_coordinator_CoordinatorRecoveryInitialisation_3(className, ie);
} catch (IllegalAccessException iae) {
RecoveryLogger.i18NLogger.error_recovery_coordinator_CoordinatorRecoveryInitialisation_4(className, iae);
}
}
initialised = true;
}
/**
* shutdown routine which removes all installed recovery modules
*/
public static void shutdown()
{
if (!initialised) {
return;
}
Iterator<XTSRecoveryModule> iterator = recoveryModules.iterator();
while (iterator.hasNext()) {
XTSRecoveryModule module = iterator.next();
RecoveryManager.manager().removeModule(module, true);
module.uninstall();
}
recoveryModules.clear();
initialised = false;
}
}