/**
* Copyright 2009 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.safehaus.penrose.partition;
import org.safehaus.penrose.connection.ConnectionConfig;
import org.safehaus.penrose.directory.EntryConfig;
import org.safehaus.penrose.directory.EntrySourceConfig;
import org.safehaus.penrose.ldap.DN;
import org.safehaus.penrose.source.SourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author Endi S. Dewata
*/
public class PartitionConfigManager implements Serializable {
private Map<String,PartitionConfig> partitionConfigs = new LinkedHashMap<String,PartitionConfig>();
public PartitionConfigManager() {
}
public void addPartitionConfig(PartitionConfig partitionConfig) throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
String partitionName = partitionConfig.getName();
if (debug) log.debug("Adding partition \""+partitionName+"\".");
validate(partitionConfig);
partitionConfigs.put(partitionName, partitionConfig);
}
public void validate(PartitionConfig partitionConfig) throws Exception {
String partitionName = partitionConfig.getName();
if (partitionName == null || "".equals(partitionName)) {
throw new Exception("Missing partition name.");
}
char startingChar = partitionName.charAt(0);
if (!Character.isLetter(startingChar)) {
throw new Exception("Invalid partition name: "+partitionName);
}
for (int i = 1; i<partitionName.length(); i++) {
char c = partitionName.charAt(i);
if (Character.isLetterOrDigit(c) || c == '_') continue;
throw new Exception("Invalid partition name: "+partitionName);
}
if (partitionConfigs.containsKey(partitionName)) {
throw new Exception("Partition "+partitionName+" already exists.");
}
}
public PartitionConfig removePartitionConfig(String name) throws Exception {
return partitionConfigs.remove(name);
}
public void clear() throws Exception {
partitionConfigs.clear();
}
public PartitionConfig getPartitionConfig(EntrySourceConfig sourceMapping) throws Exception {
if (sourceMapping == null) return null;
String sourceName = sourceMapping.getSourceName();
for (PartitionConfig partitionConfig : partitionConfigs.values()) {
if (partitionConfig.getSourceConfigManager().getSourceConfig(sourceName) != null) return partitionConfig;
}
return null;
}
public PartitionConfig getPartitionConfig(SourceConfig sourceConfig) throws Exception {
if (sourceConfig == null) return null;
String connectionName = sourceConfig.getConnectionName();
for (PartitionConfig partitionConfig : partitionConfigs.values()) {
if (partitionConfig.getConnectionConfigManager().getConnectionConfig(connectionName) != null) return partitionConfig;
}
return null;
}
public PartitionConfig getPartitionConfig(ConnectionConfig connectionConfig) throws Exception {
if (connectionConfig == null) return null;
String connectionName = connectionConfig.getName();
for (PartitionConfig partitionConfig : partitionConfigs.values()) {
if (partitionConfig.getConnectionConfigManager().getConnectionConfig(connectionName) != null) return partitionConfig;
}
return null;
}
public PartitionConfig getPartitionConfig(EntryConfig entryConfig) throws Exception {
if (entryConfig == null) return null;
for (PartitionConfig partitionConfig : partitionConfigs.values()) {
if (partitionConfig.getDirectoryConfig().contains(entryConfig)) {
return partitionConfig;
}
}
return null;
}
public PartitionConfig getPartitionConfig(DN dn) throws Exception {
Logger log = LoggerFactory.getLogger(getClass());
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Finding partition for \""+dn+"\".");
if (dn == null) {
log.debug("DN is null.");
return null;
}
PartitionConfig p = null;
DN s = null;
for (PartitionConfig partitionConfig : partitionConfigs.values()) {
if (debug) log.debug("Checking "+partitionConfig.getName()+" partition.");
Collection<DN> suffixes = partitionConfig.getDirectoryConfig().getSuffixes();
for (DN suffix : suffixes) {
if (suffix.isEmpty() && dn.isEmpty() // Root DSE
|| dn.endsWith(suffix)) {
if (s == null || s.getLength() < suffix.getLength()) {
p = partitionConfig;
s = suffix;
}
}
}
}
if (debug) {
if (p == null) {
log.debug("Partition not found.");
} else {
log.debug("Found "+p.getName()+" partition.");
}
}
return p;
}
public Collection<String> getPartitionNames() {
return partitionConfigs.keySet();
}
public Collection<PartitionConfig> getPartitionConfigs() {
return partitionConfigs.values();
}
public PartitionConfig getPartitionConfig(String name) {
return partitionConfigs.get(name);
}
}