package org.safehaus.penrose.management.source;
import org.safehaus.penrose.management.BaseService;
import org.safehaus.penrose.management.PenroseJMXService;
import org.safehaus.penrose.source.*;
import org.safehaus.penrose.partition.PartitionManager;
import org.safehaus.penrose.partition.PartitionConfig;
import org.safehaus.penrose.partition.Partition;
import org.safehaus.penrose.directory.Directory;
import org.safehaus.penrose.directory.Entry;
import org.safehaus.penrose.util.TextUtil;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;
/**
* @author Endi Sukma Dewata
*/
public class SourceManagerService extends BaseService implements SourceManagerServiceMBean {
private PartitionManager partitionManager;
private String partitionName;
Map<String,SourceService> sourceServices = new LinkedHashMap<String,SourceService>();
public SourceManagerService(PenroseJMXService jmxService, PartitionManager partitionManager, String partitionName) throws Exception {
this.jmxService = jmxService;
this.partitionManager = partitionManager;
this.partitionName = partitionName;
}
public String getObjectName() {
return SourceManagerClient.getStringObjectName(partitionName);
}
public Object getObject() {
return getSourceManager();
}
public PartitionConfig getPartitionConfig() {
return partitionManager.getPartitionConfig(partitionName);
}
public Partition getPartition() {
return partitionManager.getPartition(partitionName);
}
public SourceConfigManager getSourceConfigManager() {
PartitionConfig partitionConfig = getPartitionConfig();
if (partitionConfig == null) return null;
return partitionConfig.getSourceConfigManager();
}
public SourceManager getSourceManager() {
Partition partition = getPartition();
if (partition == null) return null;
return partition.getSourceManager();
}
public void createSourceService(String sourceName) throws Exception {
SourceService sourceService = new SourceService(jmxService, partitionManager, partitionName, sourceName);
sourceService.init();
sourceServices.put(sourceName, sourceService);
}
public SourceService getSourceService(String sourceName) throws Exception {
return sourceServices.get(sourceName);
}
public void removeSourceService(String sourceName) throws Exception {
SourceService sourceService = sourceServices.remove(sourceName);
if (sourceService == null) return;
sourceService.destroy();
}
public void init() throws Exception {
super.init();
SourceConfigManager sourceConfigManager = getSourceConfigManager();
for (String sourceName : sourceConfigManager.getSourceNames()) {
createSourceService(sourceName);
}
}
public void destroy() throws Exception {
SourceConfigManager sourceConfigManager = getSourceConfigManager();
for (String sourceName : sourceConfigManager.getSourceNames()) {
removeSourceService(sourceName);
}
super.destroy();
}
////////////////////////////////////////////////////////////////////////////////
// Sources
////////////////////////////////////////////////////////////////////////////////
public Collection<String> getSourceNames() throws Exception {
PartitionConfig partitionConfig = getPartitionConfig();
SourceConfigManager sourceConfigManager = partitionConfig.getSourceConfigManager();
Collection<String> list = new ArrayList<String>();
list.addAll(sourceConfigManager.getSourceNames());
return list;
}
public void createSource(SourceConfig sourceConfig) throws Exception {
String sourceName = sourceConfig.getName();
PartitionConfig partitionConfig = getPartitionConfig();
SourceConfigManager sourceConfigManager = partitionConfig.getSourceConfigManager();
sourceConfigManager.addSourceConfig(sourceConfig);
Partition partition = getPartition();
if (partition != null) {
SourceManager sourceManager = partition.getSourceManager();
sourceManager.startSource(sourceName);
}
createSourceService(sourceName);
}
public void renameSource(String name, String newName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) {
log.debug(TextUtil.repeat("-", 70));
log.debug("Renaming source "+name+" to "+newName+".");
}
Partition partition = getPartition();
boolean running = false;
if (partition != null) {
SourceManager sourceManager = partition.getSourceManager();
running = sourceManager.isRunning(name);
if (running) sourceManager.stopSource(name);
}
removeSourceService(name);
PartitionConfig partitionConfig = getPartitionConfig();
SourceConfigManager sourceConfigManager = partitionConfig.getSourceConfigManager();
sourceConfigManager.renameSourceConfig(name, newName);
if (partition != null) {
SourceManager sourceManager = partition.getSourceManager();
if (running) sourceManager.startSource(newName);
}
createSourceService(newName);
}
public void updateSource(String sourceName, SourceConfig sourceConfig) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) {
log.debug(TextUtil.repeat("-", 70));
log.debug("Updating source "+sourceName+".");
}
Partition partition = getPartition();
if (partition == null) {
PartitionConfig partitionConfig = getPartitionConfig();
SourceConfigManager sourceConfigManager = partitionConfig.getSourceConfigManager();
sourceConfigManager.updateSourceConfig(sourceConfig);
} else {
SourceManager sourceManager = partition.getSourceManager();
sourceManager.updateSource(sourceConfig);
}
/*
Partition partition = getPartition();
boolean running = false;
if (partition != null) {
SourceManager sourceManager = partition.getSourceManager();
running = sourceManager.isRunning(sourceName);
if (running) sourceManager.stopSource(sourceName);
}
PartitionConfig partitionConfig = getPartitionConfig();
SourceConfigManager sourceConfigManager = partitionConfig.getSourceConfigManager();
sourceConfigManager.updateSourceConfig(sourceConfig);
if (partition != null) {
SourceManager sourceManager = partition.getSourceManager();
if (running) sourceManager.startSource(sourceName);
}
*/
}
public void removeSource(String name) throws Exception {
Partition partition = getPartition();
Directory directory = partition.getDirectory();
Collection<Entry> entries = directory.getEntriesBySourceName(name);
if (entries != null && !entries.isEmpty()) {
throw new Exception("Source "+name+" is in use.");
}
SourceManager sourceManager = partition.getSourceManager();
sourceManager.stopSource(name);
SourceConfigManager sourceConfigManager = sourceManager.getSourceConfigManager();
sourceConfigManager.removeSourceConfig(name);
removeSourceService(name);
}
}