package org.safehaus.penrose.mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.safehaus.penrose.partition.Partition;
import org.safehaus.penrose.partition.PartitionConfig;
import org.safehaus.penrose.partition.PartitionContext;
import org.safehaus.penrose.Penrose;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.Collection;
import java.util.ArrayList;
/**
* @author Endi Sukma Dewata
*/
public class MappingManager {
public Logger log = LoggerFactory.getLogger(getClass());
protected Partition partition;
protected MappingConfigManager mappingConfigManager;
protected Map<String,Mapping> mappings = new LinkedHashMap<String,Mapping>();
public MappingManager(Partition partition) {
this.partition = partition;
PartitionConfig partitionConfig = partition.getPartitionConfig();
mappingConfigManager = partitionConfig.getMappingConfigManager();
}
public void init() throws Exception {
Collection<String> mappingNames = new ArrayList<String>();
mappingNames.addAll(getMappingNames());
for (String mappingName : mappingNames) {
MappingConfig mappingConfig = getMappingConfig(mappingName);
if (!mappingConfig.isEnabled()) continue;
try {
startMapping(mappingName);
} catch (Exception e) {
Penrose.errorLog.error("Failed creating mapping "+mappingName+" in partition "+partition.getName()+".", e);
}
}
}
public void destroy() throws Exception {
Collection<String> mappingNames = new ArrayList<String>();
mappingNames.addAll(mappings.keySet());
for (String mappingName : mappingNames) {
try {
stopMapping(mappingName);
} catch (Exception e) {
Penrose.errorLog.error("Failed removing mapping "+mappingName+" in partition "+partition.getName()+".", e);
}
}
}
public Collection<String> getMappingNames() {
return mappingConfigManager.getMappingNames();
}
public MappingConfig getMappingConfig(String mappingName) {
return mappingConfigManager.getMappingConfig(mappingName);
}
public void startMapping(String mappingName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Starting mapping "+mappingName+".");
MappingConfig mappingConfig = getMappingConfig(mappingName);
PartitionContext partitionContext = partition.getPartitionContext();
ClassLoader cl = partitionContext.getClassLoader();
MappingContext connectionContext = new MappingContext();
connectionContext.setPartition(partition);
connectionContext.setClassLoader(cl);
String mappingClass = mappingConfig.getMappingClass();
Mapping mapping;
if (mappingClass == null) {
mapping = new Mapping();
} else {
Class clazz = cl.loadClass(mappingClass);
mapping = (Mapping)clazz.newInstance();
}
mapping.init(mappingConfig, connectionContext);
mappings.put(mapping.getName(), mapping);
}
public void stopMapping(String mappingName) throws Exception {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Stopping mapping "+mappingName+".");
Mapping mapping = mappings.remove(mappingName);
mapping.destroy();
}
public boolean isRunning(String mappingName) {
return mappings.containsKey(mappingName);
}
public Mapping getMapping(String mappingName) {
if (mappingName == null) return null;
Mapping mapping = mappings.get(mappingName);
if (mapping != null) return mapping;
if (partition.getName().equals(PartitionConfig.ROOT)) return null;
Partition rootPartition = partition.getPartitionContext().getPartition(PartitionConfig.ROOT);
MappingManager mappingManager = rootPartition.getMappingManager();
return mappingManager.getMapping(mappingName);
}
public MappingConfigManager getMappingConfigs() {
return mappingConfigManager;
}
public void updateMappingConfig(String mappingName, MappingConfig mappingConfig) throws Exception {
mappingConfigManager.updateMappingConfig(mappingName, mappingConfig);
}
public MappingConfig removeMappingConfig(String name) {
return mappingConfigManager.removeMappingConfig(name);
}
public Collection<Mapping> getMappings() {
return mappings.values();
}
}