package org.insightech.er.db;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.ui.PlatformUI;
import org.insightech.er.editor.model.settings.JDBCDriverSetting;
import org.insightech.er.preference.PreferenceInitializer;
import org.insightech.er.preference.jdbc.JDBCPathDialog;
public abstract class DBManagerBase implements DBManager {
private Set<String> reservedWords = new HashSet<String>();
public DBManagerBase() {
DBManagerFactory.addDB(this);
this.reservedWords = this.getReservedWords();
}
public String getURL(String serverName, String dbName, int port) {
String temp = serverName.replaceAll("\\\\", "\\\\\\\\");
String url = this.getURL().replaceAll("<SERVER NAME>", temp);
url = url.replaceAll("<PORT>", String.valueOf(port));
temp = dbName.replaceAll("\\\\", "\\\\\\\\");
url = url.replaceAll("<DB NAME>", temp);
return url;
}
@SuppressWarnings("unchecked")
public Class<Driver> getDriverClass(String driverClassName) {
String path = null;
Class clazz = null;
try {
if (driverClassName.equals("sun.jdbc.odbc.JdbcOdbcDriver")) {
return (Class<Driver>) Class
.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} else {
path = PreferenceInitializer.getJDBCDriverPath(this.getId(),
driverClassName);
ClassLoader loader = this.getClassLoader(path);
clazz = loader.loadClass(driverClassName);
}
} catch (Exception e) {
JDBCPathDialog dialog = new JDBCPathDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(), this
.getId(), driverClassName, path,
new ArrayList<JDBCDriverSetting>(), false);
if (dialog.open() == IDialogConstants.OK_ID) {
JDBCDriverSetting newDriverSetting = new JDBCDriverSetting(this
.getId(), dialog.getDriverClassName(), dialog.getPath());
List<JDBCDriverSetting> driverSettingList = PreferenceInitializer
.getJDBCDriverSettingList();
if (driverSettingList.contains(newDriverSetting)) {
driverSettingList.remove(newDriverSetting);
}
driverSettingList.add(newDriverSetting);
PreferenceInitializer
.saveJDBCDriverSettingList(driverSettingList);
clazz = this.getDriverClass(dialog.getDriverClassName());
}
}
return clazz;
}
private ClassLoader getClassLoader(String uri) throws SQLException,
MalformedURLException {
StringTokenizer tokenizer = new StringTokenizer(uri, ";");
int count = tokenizer.countTokens();
URL[] urls = new URL[count];
for (int i = 0; i < urls.length; i++) {
urls[i] = new URL("file", "", tokenizer.nextToken());
}
URLClassLoader loader = new URLClassLoader(urls, this.getClass()
.getClassLoader());
return loader;
}
abstract protected String getURL();
abstract public String getDriverClassName();
protected Set<String> getReservedWords() {
Set<String> reservedWords = new HashSet<String>();
ResourceBundle bundle = ResourceBundle.getBundle(this.getClass()
.getPackage().getName()
+ ".reserved_word");
Enumeration<String> keys = bundle.getKeys();
while (keys.hasMoreElements()) {
reservedWords.add(keys.nextElement().toUpperCase());
}
return reservedWords;
}
public boolean isReservedWord(String str) {
return reservedWords.contains(str.toUpperCase());
}
public boolean isSupported(int supportItem) {
int[] supportItems = this.getSupportItems();
for (int i = 0; i < supportItems.length; i++) {
if (supportItems[i] == supportItem) {
return true;
}
}
return false;
}
/**
* {@inheritDoc}
*/
public boolean doesNeedURLDatabaseName() {
return true;
}
/**
* {@inheritDoc}
*/
public boolean doesNeedURLServerName() {
return true;
}
abstract protected int[] getSupportItems();
public List<String> getImportSchemaList(Connection con) throws SQLException {
List<String> schemaList = new ArrayList<String>();
DatabaseMetaData metaData = con.getMetaData();
try {
ResultSet rs = metaData.getSchemas();
while (rs.next()) {
schemaList.add(rs.getString(1));
}
} catch (SQLException e) {
// when schema is not supported
}
return schemaList;
}
public List<String> getSystemSchemaList() {
List<String> list = new ArrayList<String>();
return list;
}
}