package org.safehaus.penrose.management.partition;
import org.safehaus.penrose.management.BaseService;
import org.safehaus.penrose.management.PenroseJMXService;
import org.safehaus.penrose.partition.PartitionConfig;
import org.safehaus.penrose.partition.PartitionManager;
import org.safehaus.penrose.partition.PartitionManagerClient;
import org.safehaus.penrose.partition.PartitionManagerServiceMBean;
import org.safehaus.penrose.partition.event.PartitionEvent;
import org.safehaus.penrose.partition.event.PartitionListener;
import org.safehaus.penrose.util.FileUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.LinkedHashMap;
/**
* @author Endi Sukma Dewata
*/
public class PartitionManagerService extends BaseService implements PartitionManagerServiceMBean, PartitionListener {
PartitionManager partitionManager;
Map<String,PartitionService> partitionServices = new LinkedHashMap<String,PartitionService>();
public PartitionManagerService(PenroseJMXService jmxService, PartitionManager partitionManager) {
this.jmxService = jmxService;
this.partitionManager = partitionManager;
partitionManager.addListener(this);
}
public Object getObject() {
return partitionManager;
}
public String getObjectName() {
return PartitionManagerClient.getStringObjectName();
}
public Collection<String> getPartitionNames() throws Exception {
Collection<String> list = new ArrayList<String>();
list.addAll(partitionManager.getAvailablePartitionNames());
return list;
}
public void storePartition(String name) throws Exception {
partitionManager.storePartition(name);
}
public void loadPartition(String name) throws Exception {
partitionManager.loadPartition(name);
}
public void unloadPartition(String name) throws Exception {
partitionManager.removePartition(name);
}
public void startPartition(String name) throws Exception {
partitionManager.startPartition(name);
}
public void stopPartition(String name) throws Exception {
partitionManager.stopPartition(name);
}
public void startPartitions() throws Exception {
partitionManager.startPartitions();
}
public void stopPartitions() throws Exception {
partitionManager.stopPartitions();
}
public PartitionConfig getPartitionConfig(String partitionName) throws Exception {
return partitionManager.getPartitionConfig(partitionName);
}
public void addPartition(PartitionConfig partitionConfig) throws Exception {
partitionManager.addPartitionConfig(partitionConfig);
partitionManager.storePartition(partitionConfig.getName());
}
public void updatePartition(String partitionName, PartitionConfig partitionConfig) throws Exception {
partitionManager.stopPartition(partitionName);
partitionManager.removePartition(partitionName);
File partitionsDir = partitionManager.getPartitionsDir();
File oldDir = new File(partitionsDir, partitionName);
File newDir = new File(partitionsDir, partitionConfig.getName());
oldDir.renameTo(newDir);
partitionManager.addPartitionConfig(partitionConfig);
partitionManager.storePartition(partitionConfig.getName());
partitionManager.startPartition(partitionConfig.getName());
}
public void removePartition(String partitionName) throws Exception {
removePartitionService(partitionName);
File partitionsDir = partitionManager.getPartitionsDir();
File partitionDir = new File(partitionsDir, partitionName);
partitionManager.stopPartition(partitionName);
partitionManager.removePartition(partitionName);
FileUtil.delete(partitionDir);
}
public void createPartitionService(String partitionName) throws Exception {
PartitionService partitionService = new PartitionService(jmxService, partitionManager, partitionName);
partitionService.init();
partitionServices.put(partitionName, partitionService);
}
public PartitionService getPartitionService(String partitionName) throws Exception {
return partitionServices.get(partitionName);
}
public void removePartitionService(String partitionName) throws Exception {
PartitionService partitionService = partitionServices.remove(partitionName);
if (partitionService == null) return;
partitionService.destroy();
}
public void init() throws Exception {
super.init();
createPartitionService(PartitionConfig.ROOT);
for (String partitionName : partitionManager.getPartitionNames()) {
createPartitionService(partitionName);
}
}
public void destroy() throws Exception {
for (String partitionName : partitionManager.getPartitionNames()) {
removePartitionService(partitionName);
}
removePartitionService(PartitionConfig.ROOT);
super.destroy();
}
public void partitionAdded(PartitionEvent event) throws Exception {
createPartitionService(event.getPartitionName());
}
public void partitionRemoved(PartitionEvent event) throws Exception {
removePartitionService(event.getPartitionName());
}
public void partitionStarted(PartitionEvent event) throws Exception {
}
public void partitionStopped(PartitionEvent event) throws Exception {
}
}