package org.safehaus.penrose.source;
import org.safehaus.penrose.directory.EntrySourceConfig;
import org.safehaus.penrose.directory.EntryFieldConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.io.Serializable;
/**
* @author Endi S. Dewata
*/
public class SourceConfigManager implements Serializable, Cloneable {
public final static long serialVersionUID = 1L;
protected Map<String,SourceConfig> sourceConfigs = new LinkedHashMap<String,SourceConfig>();
protected Map<String,Collection<SourceConfig>> sourceConfigsByConnectionName = new LinkedHashMap<String,Collection<SourceConfig>>();
public void addSourceConfig(SourceConfig sourceConfig) throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
String sourceName = sourceConfig.getName();
if (debug) log.debug("Adding source \""+sourceName+"\".");
validate(sourceConfig);
sourceConfigs.put(sourceName, sourceConfig);
String connectionName = sourceConfig.getConnectionName();
if (connectionName != null) {
Collection<SourceConfig> list = sourceConfigsByConnectionName.get(connectionName);
if (list == null) {
list = new ArrayList<SourceConfig>();
sourceConfigsByConnectionName.put(connectionName, list);
}
list.add(sourceConfig);
}
}
public void validate(SourceConfig sourceConfig) throws Exception {
String sourceName = sourceConfig.getName();
if (sourceName == null || "".equals(sourceName)) {
throw new Exception("Missing source name.");
}
char startingChar = sourceName.charAt(0);
if (!Character.isLetter(startingChar)) {
throw new Exception("Invalid source name: "+sourceName);
}
for (int i = 1; i<sourceName.length(); i++) {
char c = sourceName.charAt(i);
if (Character.isLetterOrDigit(c) || c == '_') continue;
throw new Exception("Invalid source name: "+sourceName);
}
if (sourceConfigs.containsKey(sourceName)) {
throw new Exception("Source "+sourceName+" already exists.");
}
}
public Collection<String> getSourceNames() {
return sourceConfigs.keySet();
}
public void renameSourceConfig(String name, String newName) throws Exception {
SourceConfig sourceConfig = sourceConfigs.remove(name);
sourceConfig.setName(newName);
sourceConfigs.put(newName, sourceConfig);
}
public void updateSourceConfig(SourceConfig sourceConfig) throws Exception {
String sourceName = sourceConfig.getName();
SourceConfig oldSourceConfig = sourceConfigs.get(sourceName);
if (oldSourceConfig == null) {
throw new Exception("Source "+sourceName+" not found.");
}
String oldConnectionName = oldSourceConfig.getConnectionName();
String connectionName = sourceConfig.getConnectionName();
oldSourceConfig.copy(sourceConfig);
if (oldConnectionName != null && !oldConnectionName.equals(connectionName)
|| connectionName != null && !connectionName.equals(oldConnectionName)) {
if (oldConnectionName != null) {
Collection<SourceConfig> list = sourceConfigsByConnectionName.get(oldConnectionName);
if (list != null) {
list.remove(oldSourceConfig);
if (list.isEmpty()) sourceConfigsByConnectionName.remove(oldConnectionName);
}
}
if (connectionName != null) {
Collection<SourceConfig> list = sourceConfigsByConnectionName.get(connectionName);
if (list == null) {
list = new ArrayList<SourceConfig>();
sourceConfigsByConnectionName.put(connectionName, list);
}
list.add(sourceConfig);
}
}
}
public SourceConfig removeSourceConfig(String sourceName) {
SourceConfig sourceConfig = sourceConfigs.remove(sourceName);
String connectionName = sourceConfig.getConnectionName();
if (connectionName != null) {
Collection<SourceConfig> list = sourceConfigsByConnectionName.get(connectionName);
if (list != null) {
list.remove(sourceConfig);
if (list.isEmpty()) sourceConfigsByConnectionName.remove(connectionName);
}
}
return sourceConfig;
}
public SourceConfig getSourceConfig(String name) {
return sourceConfigs.get(name);
}
public Collection<SourceConfig> getSourceConfigsByConnectionName(String connectionName) {
return sourceConfigsByConnectionName.get(connectionName);
}
public SourceConfig getSourceConfig(EntrySourceConfig entrySourceConfig) {
return getSourceConfig(entrySourceConfig.getSourceName());
}
public Collection<SourceConfig> getSourceConfigs() {
return sourceConfigs.values();
}
public Collection<EntryFieldConfig> getSearchableFields(EntrySourceConfig entrySourceConfig) {
SourceConfig sourceConfig = getSourceConfig(entrySourceConfig.getSourceName());
Collection<EntryFieldConfig> results = new ArrayList<EntryFieldConfig>();
for (EntryFieldConfig entryFieldConfig : entrySourceConfig.getFieldConfigs()) {
FieldConfig fieldConfig = sourceConfig.getFieldConfig(entryFieldConfig.getName());
if (fieldConfig == null) continue;
if (!fieldConfig.isSearchable()) continue;
results.add(entryFieldConfig);
}
return results;
}
public Object clone() throws CloneNotSupportedException {
SourceConfigManager sources = (SourceConfigManager)super.clone();
sources.sourceConfigs = new LinkedHashMap<String,SourceConfig>();
for (SourceConfig sourceConfig : sourceConfigs.values()) {
sources.sourceConfigs.put(sourceConfig.getName(), (SourceConfig)sourceConfig.clone());
}
return sources;
}
}