package com.vividsolutions.jump.workbench.datastore;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.vividsolutions.jump.datastore.DataStoreConnection;
import com.vividsolutions.jump.datastore.DataStoreDriver;
import com.vividsolutions.jump.parameter.ParameterList;
import com.vividsolutions.jump.parameter.ParameterListSchema;
import com.vividsolutions.jump.util.Block;
import com.vividsolutions.jump.util.CollectionUtil;
import com.vividsolutions.jump.util.SimpleStringEncrypter;
import com.vividsolutions.jump.util.StringUtil;
/**
* Contains a ParameterList and its associated DataStoreDriver.
*/
public class ConnectionDescriptor
{
private static String getBasicClassName(String fullClassName)
{
int dotPos = fullClassName.lastIndexOf('.');
String name = fullClassName;
if (dotPos > 0) {
name = fullClassName.substring(dotPos + 1);
}
return name;
}
private static String getDataStoreDriverClassName(String fullClassName)
{
String className = getBasicClassName(fullClassName);
int dsdSuffixIndex = className.indexOf("DataStoreDriver");
if (dsdSuffixIndex < 1)
return className;
return className.substring(0, dsdSuffixIndex);
}
// the display name of the connection
private String name = null;
private ParameterList parameterList;
private String dataStoreDriverClassName;
public ConnectionDescriptor() {
}
public ConnectionDescriptor(Class dataStoreDriverClass,
ParameterList parameterList) {
this(null, dataStoreDriverClass, parameterList);
}
public ConnectionDescriptor(String name,
Class dataStoreDriverClass,
ParameterList parameterList) {
this.name = name;
setDataStoreDriverClassName(dataStoreDriverClass.getName());
setParameterList(parameterList);
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public DataStoreConnection createConnection(DataStoreDriver driver) throws Exception {
return driver.createConnection(parameterList);
}
public int hashCode() {
// Implement #hashCode so that ConnectionDescriptor works
// as a HashMap key. But just set it to 0 for now, to
// avoid the work of creating code to generate a proper hash.
// This will unfortunately force a linear scan of the keys whenever
// HashMap#get is used; however, this will not be a big problem, as
// I don't expect there to be many keys in HashMaps of
// ConnectionDescriptors [Jon Aquino 2005-03-07]
return 0;
}
public boolean equals(Object other) {
return equals((ConnectionDescriptor) other);
}
private boolean equals(ConnectionDescriptor other) {
if (!(other instanceof ConnectionDescriptor)) {
// This case includes null. [Jon Aquino 2005-03-16]
return false;
}
return getDataStoreDriverClassName().equals(other.getDataStoreDriverClassName())
&& getParameterListWithoutPassword().equals(
other.getParameterListWithoutPassword());
}
public ParameterList getParameterList() {
return parameterList;
}
public String toString()
{
if (name != null) {
return name + " (" + getParametersString() + ")";
}
return getParametersString();
}
public String getParametersString() {
return getDataStoreDriverClassName(dataStoreDriverClassName)
+ ":"
+ StringUtil
.toCommaDelimitedString(
CollectionUtil
.select(
parameterValues(getParameterListWithoutPassword()),
new Block() {
public Object yield(
Object name) {
// Don't include null
// parameters e.g.
// passwords [Jon Aquino
// 2005-03-15]
return Boolean
.valueOf(name != null);
}
})).replaceAll(", ", ":");
}
private List parameterValues(ParameterList parameterList) {
List parameterValues = new ArrayList();
for (Iterator i = Arrays.asList(parameterList.getSchema().getNames())
.iterator(); i.hasNext();) {
String name = (String) i.next();
parameterValues.add(parameterList.getParameter(name));
}
return parameterValues;
}
public ParameterList getParameterListWithoutPassword() {
ParameterList parameterListWithoutPassword = new ParameterList(
parameterList);
if (passwordParameterName(parameterList.getSchema()) != null) {
parameterListWithoutPassword.setParameter(
passwordParameterName(parameterList.getSchema()), null);
}
return parameterListWithoutPassword;
}
public void setParameterListWithObfuscatedPassword(
PersistentParameterList parameterListWithObfuscatedPassword) {
ParameterList parameterList = new ParameterList(
parameterListWithObfuscatedPassword);
if (passwordParameterName(parameterList.getSchema()) != null) {
parameterList.setParameter(passwordParameterName(parameterList
.getSchema()), unobfuscate(parameterList
.getParameterString(passwordParameterName(parameterList
.getSchema()))));
}
setParameterList(parameterList);
}
public PersistentParameterList getParameterListWithObfuscatedPassword() {
ParameterList parameterListWithObfuscatedPassword = new ParameterList(
parameterList);
if (passwordParameterName(parameterList.getSchema()) != null) {
parameterListWithObfuscatedPassword
.setParameter(
passwordParameterName(parameterList.getSchema()),
obfuscate(parameterList
.getParameterString(passwordParameterName(parameterList
.getSchema()))));
}
return new PersistentParameterList(parameterListWithObfuscatedPassword);
}
private String obfuscate(String s) {
return s != null ? new SimpleStringEncrypter().encrypt(s) : null;
}
private String unobfuscate(String s) {
return s != null ? new SimpleStringEncrypter().decrypt(s) : null;
}
public void setDataStoreDriverClassName(String dataStoreDriverClassName) {
this.dataStoreDriverClassName = dataStoreDriverClassName;
}
public String getDataStoreDriverClassName() {
return dataStoreDriverClassName;
}
public void setParameterList(ParameterList parameterList) {
this.parameterList = parameterList;
}
public static String passwordParameterName(ParameterListSchema schema) {
for (Iterator i = Arrays.asList(schema.getNames()).iterator(); i
.hasNext();) {
String name = (String) i.next();
if (name.equalsIgnoreCase("password")) {
return name;
}
}
return null;
}
public static class PersistentParameterList extends ParameterList {
public PersistentParameterList() {
super(new ParameterListSchema(new String[] {}, new Class[] {}));
}
public PersistentParameterList(ParameterList parameterList) {
this();
setSchema(new PersistentParameterListSchema(parameterList
.getSchema()));
setNameToValueMap(nameToValueMap(parameterList));
}
private static Map nameToValueMap(ParameterList parameterList) {
Map nameToValueMap = new HashMap();
for (Iterator i = Arrays.asList(
parameterList.getSchema().getNames()).iterator(); i
.hasNext();) {
String name = (String) i.next();
nameToValueMap.put(name, parameterList.getParameter(name));
}
return nameToValueMap;
}
public Map getNameToValueMap() {
return nameToValueMap(this);
}
public void setNameToValueMap(Map nameToValueMap) {
for (Iterator i = nameToValueMap.keySet().iterator(); i.hasNext();) {
String name = (String) i.next();
setParameter(name, nameToValueMap.get(name));
}
}
public void setSchema(PersistentParameterListSchema schema) {
initialize(schema);
}
}
public static class PersistentParameterListSchema extends
ParameterListSchema {
public PersistentParameterListSchema() {
super(new String[] {}, new Class[] {});
}
public PersistentParameterListSchema(ParameterListSchema schema) {
this();
initialize(schema.getNames(), schema.getClasses());
}
public List getPersistentNames() {
return Arrays.asList(getNames());
}
public void addPersistentName(String name) {
String[] newNames = new String[getNames().length + 1];
System.arraycopy(getNames(), 0, newNames, 0, getNames().length);
newNames[getNames().length] = name;
initialize(newNames, getClasses());
}
public List getPersistentClasses() {
return Arrays.asList(getClasses());
}
public void addPersistentClass(Class c) {
Class[] newClasses = new Class[getClasses().length + 1];
System.arraycopy(getClasses(), 0, newClasses, 0,
getClasses().length);
newClasses[getClasses().length] = c;
initialize(getNames(), newClasses);
}
}
}