package org.safehaus.penrose.management.module;
import org.safehaus.penrose.management.BaseService;
import org.safehaus.penrose.management.PenroseJMXService;
import org.safehaus.penrose.module.*;
import org.safehaus.penrose.partition.PartitionManager;
import org.safehaus.penrose.partition.PartitionConfig;
import org.safehaus.penrose.partition.Partition;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;
/**
* @author Endi Sukma Dewata
*/
public class ModuleManagerService extends BaseService implements ModuleManagerServiceMBean {
private PartitionManager partitionManager;
private String partitionName;
Map<String,ModuleService> moduleServices = new LinkedHashMap<String,ModuleService>();
public ModuleManagerService(PenroseJMXService jmxService, PartitionManager partitionManager, String partitionName) throws Exception {
this.jmxService = jmxService;
this.partitionManager = partitionManager;
this.partitionName = partitionName;
}
public String getObjectName() {
return ModuleManagerClient.getStringObjectName(partitionName);
}
public Object getObject() {
return getModuleManager();
}
public PartitionConfig getPartitionConfig() {
return partitionManager.getPartitionConfig(partitionName);
}
public Partition getPartition() {
return partitionManager.getPartition(partitionName);
}
public ModuleConfigManager getModuleConfigManager() {
PartitionConfig partitionConfig = getPartitionConfig();
if (partitionConfig == null) return null;
return partitionConfig.getModuleConfigManager();
}
public ModuleManager getModuleManager() {
Partition partition = getPartition();
if (partition == null) return null;
return partition.getModuleManager();
}
public void createModuleService(String moduleName) throws Exception {
ModuleService moduleService = new ModuleService(jmxService, partitionManager, partitionName, moduleName);
moduleService.init();
moduleServices.put(moduleName, moduleService);
}
public ModuleService getModuleService(String moduleName) throws Exception {
return moduleServices.get(moduleName);
}
public void removeModuleService(String moduleName) throws Exception {
ModuleService moduleService = moduleServices.remove(moduleName);
if (moduleService == null) return;
moduleService.destroy();
}
public void init() throws Exception {
super.init();
ModuleConfigManager moduleConfigManager = getModuleConfigManager();
for (String moduleName : moduleConfigManager.getModuleNames()) {
createModuleService(moduleName);
}
}
public void destroy() throws Exception {
ModuleConfigManager moduleConfigManager = getModuleConfigManager();
for (String moduleName : moduleConfigManager.getModuleNames()) {
removeModuleService(moduleName);
}
super.destroy();
}
////////////////////////////////////////////////////////////////////////////////
// Modules
////////////////////////////////////////////////////////////////////////////////
public Collection<String> getModuleNames() throws Exception {
PartitionConfig partitionConfig = getPartitionConfig();
ModuleConfigManager moduleConfigManager = partitionConfig.getModuleConfigManager();
Collection<String> list = new ArrayList<String>();
list.addAll(moduleConfigManager.getModuleNames());
return list;
}
public void createModule(ModuleConfig moduleConfig) throws Exception {
boolean debug = log.isDebugEnabled();
String moduleName = moduleConfig.getName();
if (debug) log.debug("Creating module "+moduleName+".");
PartitionConfig partitionConfig = getPartitionConfig();
ModuleConfigManager moduleConfigManager = partitionConfig.getModuleConfigManager();
moduleConfigManager.addModuleConfig(moduleConfig);
Partition partition = getPartition();
if (partition != null) {
ModuleManager moduleManager = partition.getModuleManager();
moduleManager.startModule(moduleName);
}
createModuleService(moduleName);
}
public void updateModule(String moduleName, ModuleConfig moduleConfig) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Updating module "+moduleName+".");
Partition partition = getPartition();
if (partition != null) {
ModuleManager moduleManager = partition.getModuleManager();
moduleManager.stopModule(moduleName);
}
removeModuleService(moduleName);
PartitionConfig partitionConfig = getPartitionConfig();
ModuleConfigManager moduleConfigManager = partitionConfig.getModuleConfigManager();
moduleConfigManager.updateModuleConfig(moduleName, moduleConfig);
if (partition != null) {
ModuleManager moduleManager = partition.getModuleManager();
moduleManager.startModule(moduleName);
}
createModuleService(moduleConfig.getName());
}
public void removeModule(String moduleName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Removing module "+moduleName+".");
Partition partition = getPartition();
if (partition != null) {
ModuleManager moduleManager = partition.getModuleManager();
moduleManager.stopModule(moduleName);
}
PartitionConfig partitionConfig = getPartitionConfig();
ModuleConfigManager moduleConfigManager = partitionConfig.getModuleConfigManager();
moduleConfigManager.removeModuleConfig(moduleName);
removeModuleService(moduleName);
}
}