package org.safehaus.penrose.mapping; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.LinkedHashMap; import java.util.Collection; import java.io.Serializable; /** * @author Endi Sukma Dewata */ public class MappingConfigManager implements Serializable, Cloneable { public final static long serialVersionUID = 1L; static { log = LoggerFactory.getLogger(MappingConfigManager.class); } public static transient Logger log; private Map<String,MappingConfig> mappingConfigs = new LinkedHashMap<String,MappingConfig>(); public void addMappingConfig(MappingConfig mappingConfig) throws Exception { Logger log = LoggerFactory.getLogger(getClass()); boolean debug = log.isDebugEnabled(); String mappingName = mappingConfig.getName(); if (debug) log.debug("Adding mapping \""+mappingName+"\"."); validate(mappingConfig); mappingConfigs.put(mappingName, mappingConfig); } public void validate(MappingConfig mappingConfig) throws Exception { String mappingName = mappingConfig.getName(); if (mappingName == null || "".equals(mappingName)) { throw new Exception("Missing mapping name."); } char startingChar = mappingName.charAt(0); if (!Character.isLetter(startingChar)) { throw new Exception("Invalid mapping name: "+mappingName); } for (int i = 1; i<mappingName.length(); i++) { char c = mappingName.charAt(i); if (Character.isLetterOrDigit(c) || c == '_') continue; throw new Exception("Invalid mapping name: "+mappingName); } if (mappingConfigs.containsKey(mappingName)) { throw new Exception("Mapping "+mappingName+" already exists."); } } public MappingConfig getMappingConfig(String name) { return mappingConfigs.get(name); } public Collection<String> getMappingNames() { return mappingConfigs.keySet(); } public Collection<MappingConfig> getMappingConfigs() { return mappingConfigs.values(); } public void updateMappingConfig(String name, MappingConfig mappingConfig) throws Exception { MappingConfig oldMappingConfig = mappingConfigs.get(name); oldMappingConfig.copy(mappingConfig); if (!name.equals(mappingConfig.getName())) { mappingConfigs.remove(name); mappingConfigs.put(mappingConfig.getName(), mappingConfig); } } public MappingConfig removeMappingConfig(String name) { return mappingConfigs.remove(name); } public void copy(MappingConfigManager mappingConfigManager) throws CloneNotSupportedException { mappingConfigs = new LinkedHashMap<String,MappingConfig>(); for (MappingConfig mappingConfig : mappingConfigManager.mappingConfigs.values()) { mappingConfigs.put(mappingConfig.getName(), (MappingConfig)mappingConfig.clone()); } } public Object clone() throws CloneNotSupportedException { MappingConfigManager mappingConfigManager = (MappingConfigManager)super.clone(); mappingConfigManager.copy(this); return mappingConfigManager; } }