blob: 86edf0510758f922e85bcb2d5de3baae50a36da1 [file] [log] [blame]
/* Copyright (c) 2001-2010, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hsqldb.util;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.util.Enumeration;
import java.util.Hashtable;
import org.hsqldb.lib.java.JavaSystem;
// sqlbob@users 20020407 - patch 1.7.0 - reengineering
// fredt@users - 20040508 - modified patch by lonbinder@users for saving settings
// weconsultants@users - 20041114 - patch 1.8.0 - Added MySQL Connector/J jbcDriver and granulated imports
/**
* Common code in the Swing and AWT versions of ConnectionDialog
*
* New class based on Hypersonic original
*
* @author Thomas Mueller (Hypersonic SQL Group)
* @version 1.7.2
* @since 1.7.0
*/
class ConnectionDialogCommon {
private static String[][] connTypes;
private static final String[][] sJDBCTypes = {
{
"HSQL Database Engine In-Memory", "org.hsqldb.jdbcDriver",
"jdbc:hsqldb:mem:."
}, {
"HSQL Database Engine Standalone", "org.hsqldb.jdbcDriver",
"jdbc:hsqldb:file:\u00ABdatabase/path?\u00BB"
}, {
"HSQL Database Engine Server", "org.hsqldb.jdbcDriver",
"jdbc:hsqldb:hsql://localhost/"
}, {
"HSQL Database Engine WebServer", "org.hsqldb.jdbcDriver",
"jdbc:hsqldb:http://\u00ABhostname/?\u00BB"
}, {
"JDBC-ODBC Bridge from Sun", "sun.jdbc.odbc.JdbcOdbcDriver",
"jdbc:odbc:\u00ABdatabase?\u00BB"
}, {
"Cloudscape RMI", "RmiJdbc.RJDriver",
"jdbc:rmi://\u00ABhost?\u00BB:1099/jdbc:cloudscape:"
+ "\u00ABdatabase?\u00BB;create=true"
}, {
"IBM DB2", "COM.ibm.db2.jdbc.app.DB2Driver",
"jdbc:db2:\u00ABdatabase?\u00BB"
}, {
"IBM DB2 (thin)", "COM.ibm.db2.jdbc.net.DB2Driver",
"jdbc:db2://\u00ABhost?\u00BB:6789/\u00ABdatabase?\u00BB"
}, {
"Informix", "com.informix.jdbc.IfxDriver",
"jdbc:informix-sqli://\u00ABhost?\u00BB:1533/\u00ABdatabase?\u00BB:"
+ "INFORMIXSERVER=\u00ABserver?\u00BB"
}, {
"InstantDb", "jdbc.idbDriver", "jdbc:idb:\u00ABdatabase?\u00BB.prp"
}, {
"MySQL Connector/J", "com.mysql.jdbc.Driver",
"jdbc:mysql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB"
}, {
"MM.MySQL", "org.gjt.mm.mysql.Driver",
"jdbc:mysql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB"
}, {
"Oracle", "oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:oci8:@\u00ABdatabase?\u00BB"
}, {
"Oracle (thin)", "oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@\u00ABhost?\u00BB:1521:\u00ABdatabase?\u00BB"
}, {
"PointBase", "com.pointbase.jdbc.jdbcUniversalDriver",
"jdbc:pointbase://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB"
}, {
"PostgreSQL", "org.postgresql.Driver",
"jdbc:postgresql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB"
}, {
"PostgreSQL v6.5", "postgresql.Driver",
"jdbc:postgresql://\u00ABhost?\u00BB/\u00ABdatabase?\u00BB"
}
};
static String[][] getTypes() {
return sJDBCTypes;
/*
if (connTypes == null) {
// Pluggable connection types:
Vector plugTypes = new Vector();
try {
plugTypes = (Vector) Class.forName(
System.getProperty(
"org.hsqldb.util.ConnectionTypeClass")).newInstance();
} catch (Exception e) {
;
}
connTypes =
new String[(plugTypes.size() / 3) + sJDBCTypes.length][3];
int i = 0;
for (int j = 0; j < plugTypes.size(); i++) {
connTypes[i] = new String[3];
connTypes[i][0] = plugTypes.elementAt(j++).toString();
connTypes[i][1] = plugTypes.elementAt(j++).toString();
connTypes[i][2] = plugTypes.elementAt(j++).toString();
}
for (int j = 0; j < sJDBCTypes.length; i++, j++) {
connTypes[i] = new String[3];
connTypes[i][0] = sJDBCTypes[j][0];
connTypes[i][1] = sJDBCTypes[j][1];
connTypes[i][2] = sJDBCTypes[j][2];
}
}
return (connTypes);
*/
}
private static final String fileName = "hsqlprefs.dat";
private static File recentSettings = null;
static synchronized Hashtable loadRecentConnectionSettings()
throws IOException {
Hashtable list = new Hashtable();
try {
if (recentSettings == null) {
setHomeDir();
if (homedir == null) {
return list;
}
recentSettings = new File(homedir, fileName);
if (!recentSettings.exists()) {
JavaSystem.createNewFile(recentSettings);
return list;
}
}
} catch (Throwable e) {
return list;
}
FileInputStream in = null;
ObjectInputStream objStream = null;
try {
in = new FileInputStream(recentSettings);
objStream = new ObjectInputStream(in);
list.clear();
while (true) {
ConnectionSetting setting =
(ConnectionSetting) objStream.readObject();
if (!emptySettingName.equals(setting.getName())) {
list.put(setting.getName(), setting);
}
}
} catch (EOFException eof) {
// reached end of file -- this is not clean but it works
} catch (ClassNotFoundException cnfe) {
throw (IOException) new IOException("Unrecognized class type "
+ cnfe.getMessage());
} catch (ClassCastException cce) {
throw (IOException) new IOException("Unrecognized class type "
+ cce.getMessage());
} catch (Throwable t) {}
finally {
if (objStream != null) {
objStream.close();
}
if (in != null) {
in.close();
}
}
return list;
}
static String emptySettingName = "Recent settings...";
/**
* Adds the new settings name if it does not nexist, or overwrites the old one.
*/
static void addToRecentConnectionSettings(Hashtable settings,
ConnectionSetting newSetting) throws IOException {
settings.put(newSetting.getName(), newSetting);
ConnectionDialogCommon.storeRecentConnectionSettings(settings);
}
/**
* Here's a non-secure method of storing recent connection settings.
*
* @param settings ConnectionSetting[]
* @throw IOException if something goes wrong while writing
*/
private static void storeRecentConnectionSettings(Hashtable settings) {
try {
if (recentSettings == null) {
setHomeDir();
if (homedir == null) {
return;
}
recentSettings = new File(homedir, fileName);
if (!recentSettings.exists()) {
// recentSettings.createNewFile();
}
}
if (settings == null || settings.size() == 0) {
return;
}
// setup a stream to a physical file on the filesystem
FileOutputStream out = new FileOutputStream(recentSettings);
ObjectOutputStream objStream = new ObjectOutputStream(out);
Enumeration en = settings.elements();
while (en.hasMoreElements()) {
objStream.writeObject(en.nextElement());
}
objStream.flush();
objStream.close();
out.close();
} catch (Throwable t) {}
}
/**
* Removes the recent connection settings file store.
*/
static void deleteRecentConnectionSettings() {
try {
if (recentSettings == null) {
setHomeDir();
if (homedir == null) {
return;
}
recentSettings = new File(homedir, fileName);
}
if (!recentSettings.exists()) {
recentSettings = null;
return;
}
recentSettings.delete();
recentSettings = null;
} catch (Throwable t) {}
}
private static String homedir = null;
public static void setHomeDir() {
//#ifdef JAVA2FULL
if (homedir == null) {
try {
Class c =
Class.forName("sun.security.action.GetPropertyAction");
Constructor constructor = c.getConstructor(new Class[]{
String.class });
java.security.PrivilegedAction a =
(java.security.PrivilegedAction) constructor.newInstance(
new Object[]{ "user.home" });
homedir =
(String) java.security.AccessController.doPrivileged(a);
} catch (Exception e) {
System.err.println(
"No access to home directory. Continuing without...");
}
}
//#endif
}
}