package org.safehaus.penrose.module;
import org.safehaus.penrose.ldap.DN;
import org.safehaus.penrose.partition.Partition;
import org.safehaus.penrose.partition.PartitionConfig;
import org.safehaus.penrose.Penrose;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author Endi Sukma Dewata
*/
public class ModuleManager {
public Logger log = LoggerFactory.getLogger(getClass());
protected Partition partition;
protected ModuleConfigManager moduleConfigManager;
protected Map<String,Module> modules = new LinkedHashMap<String,Module>();
public ModuleManager(Partition partition) {
this.partition = partition;
PartitionConfig partitionConfig = partition.getPartitionConfig();
this.moduleConfigManager = partitionConfig.getModuleConfigManager();
}
public void init() throws Exception {
Collection<String> moduleNames = new ArrayList<String>();
moduleNames.addAll(getModuleNames());
for (String moduleName : moduleNames) {
ModuleConfig moduleConfig = getModuleConfig(moduleName);
if (!moduleConfig.isEnabled()) continue;
try {
startModule(moduleName);
} catch (Exception e) {
Penrose.errorLog.error("Failed creating module "+moduleName+" in partition "+partition.getName()+".", e);
}
}
}
public void destroy() throws Exception {
Collection<String> moduleNames = new ArrayList<String>();
moduleNames.addAll(modules.keySet());
for (String moduleName : moduleNames) {
try {
stopModule(moduleName);
} catch (Exception e) {
Penrose.errorLog.error("Failed removing module "+moduleName+" in partition "+partition.getName()+".", e);
}
}
}
public Collection<String> getModuleNames() {
return moduleConfigManager.getModuleNames();
}
public ModuleConfig getModuleConfig(String moduleName) {
return moduleConfigManager.getModuleConfig(moduleName);
}
public void startModule(String moduleName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Starting module "+moduleName+".");
ModuleConfig moduleConfig = getModuleConfig(moduleName);
String className = moduleConfig.getModuleClass();
ClassLoader cl = partition.getPartitionContext().getClassLoader();
Class clazz = cl.loadClass(className);
Module module = (Module)clazz.newInstance();
ModuleContext moduleContext = new ModuleContext();
moduleContext.setPartition(partition);
module.init(moduleConfig, moduleContext);
modules.put(module.getName(), module);
}
public void stopModule(String moduleName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Stopping module "+moduleName+".");
Module module = modules.remove(moduleName);
module.destroy();
}
public Collection<Module> getModules() {
return modules.values();
}
public Module getModule(String moduleName) {
Module module = modules.get(moduleName);
if (module != null) return module;
if (partition.getName().equals(PartitionConfig.ROOT)) return null;
Partition rootPartition = partition.getPartitionContext().getPartition(PartitionConfig.ROOT);
ModuleManager moduleManager = rootPartition.getModuleManager();
return moduleManager.getModule(moduleName);
}
public Collection<Module> findModules(DN dn) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Modules:");
Collection<Module> list = new ArrayList<Module>();
for (ModuleMapping moduleMapping : moduleConfigManager.getModuleMappings()) {
String moduleName = moduleMapping.getModuleName();
boolean b = moduleMapping.match(dn);
if (!b) continue;
Module module = getModule(moduleName);
if (module == null) continue;
if (!module.isEnabled()) continue;
if (debug) log.debug(" - "+moduleName);
list.add(module);
}
return list;
}
}