package org.safehaus.penrose.module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author Endi Sukma Dewata
*/
public class ModuleConfigManager implements Serializable, Cloneable {
public final static long serialVersionUID = 1L;
protected Map<String,ModuleConfig> moduleConfigs = new LinkedHashMap<String,ModuleConfig>();
public void addModuleConfig(ModuleConfig moduleConfig) throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
String moduleName = moduleConfig.getName();
if (debug) log.debug("Adding module \""+moduleName+"\".");
validate(moduleConfig);
moduleConfigs.put(moduleName, moduleConfig);
}
public void validate(ModuleConfig moduleConfig) throws Exception {
String moduleName = moduleConfig.getName();
if (moduleName == null || "".equals(moduleName)) {
throw new Exception("Missing module name.");
}
char startingChar = moduleName.charAt(0);
if (!Character.isLetter(startingChar)) {
throw new Exception("Invalid module name: "+moduleName);
}
for (int i = 1; i<moduleName.length(); i++) {
char c = moduleName.charAt(i);
if (Character.isLetterOrDigit(c) || c == '_') continue;
throw new Exception("Invalid module name: "+moduleName);
}
if (moduleConfigs.containsKey(moduleName)) {
throw new Exception("Module "+moduleName+" already exists.");
}
}
public ModuleConfig getModuleConfig(String moduleName) {
return moduleConfigs.get(moduleName);
}
public Collection<String> getModuleNames() {
return moduleConfigs.keySet();
}
public Collection<ModuleConfig> getModuleConfigs() {
return moduleConfigs.values();
}
public void updateModuleConfig(String moduleName, ModuleConfig newModuleConfig) throws Exception {
ModuleConfig moduleConfig = moduleConfigs.get(moduleName);
if (moduleConfig == null) {
throw new Exception("Module "+moduleName+" not found.");
}
moduleConfig.copy(newModuleConfig);
}
public ModuleConfig removeModuleConfig(String moduleName) {
return moduleConfigs.remove(moduleName);
}
public void addModuleMappings(Collection<ModuleMapping> moduleMappings) throws Exception {
for (ModuleMapping moduleMapping : moduleMappings) {
addModuleMapping(moduleMapping);
}
}
public void addModuleMapping(ModuleMapping moduleMapping) throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
String moduleName = moduleMapping.getModuleName();
if (debug) log.debug("Adding module mapping "+moduleName+" => "+ moduleMapping.getBaseDn());
ModuleConfig moduleConfig = moduleConfigs.get(moduleName);
if (moduleConfig == null) {
throw new Exception("Module "+moduleName+" not found.");
}
moduleConfig.addModuleMapping(moduleMapping);
}
public Collection<ModuleMapping> getModuleMappings() {
Collection<ModuleMapping> results = new ArrayList<ModuleMapping>();
for (ModuleConfig moduleConfig : moduleConfigs.values()) {
results.addAll(moduleConfig.getModuleMappings());
}
return results;
}
public Collection<ModuleMapping> getModuleMappings(String moduleName) throws Exception {
ModuleConfig moduleConfig = moduleConfigs.get(moduleName);
if (moduleConfig == null) {
throw new Exception("Module "+moduleName+" not found.");
}
return moduleConfig.getModuleMappings();
}
public void removeModuleMapping(ModuleMapping moduleMapping) throws Exception {
if (moduleMapping == null) return;
String moduleName = moduleMapping.getModuleName();
if (moduleName == null) return;
ModuleConfig moduleConfig = moduleConfigs.get(moduleName);
if (moduleConfig == null) {
throw new Exception("Module "+moduleName+" not found.");
}
moduleConfig.removeModuleMapping(moduleMapping);
}
public void removeModuleMapping(String moduleName) throws Exception {
ModuleConfig moduleConfig = moduleConfigs.get(moduleName);
if (moduleConfig == null) {
throw new Exception("Module "+moduleName+" not found.");
}
moduleConfig.removeModuleMappings();
}
public Object clone() throws CloneNotSupportedException {
ModuleConfigManager modules = (ModuleConfigManager)super.clone();
modules.moduleConfigs = new LinkedHashMap<String,ModuleConfig>();
for (ModuleConfig moduleConfig : moduleConfigs.values()) {
modules.moduleConfigs.put(moduleConfig.getName(), (ModuleConfig)moduleConfig.clone());
}
return modules;
}
}