/*
* Copyright (C) 2004 Anthony Smith
*
* 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.
*
* ----------------------------------------------------------------------------
* TITLE $Id$
* ---------------------------------------------------------------------------
*
* --------------------------------------------------------------------------*/
package opendbcopy.config;
import opendbcopy.io.ExportToXML;
import opendbcopy.io.ImportFromXML;
import opendbcopy.plugin.model.exception.MissingAttributeException;
import opendbcopy.plugin.model.exception.MissingElementException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.TreeMap;
/**
* class description
*
* @author Anthony Smith
* @version $Revision$
*/
public class SQLDriverManager {
private Document driversDoc;
private TreeMap drivers;
private File personalSQLDriversFile;
/**
* Creates a new SQLDrivers object.
*
* @param personalSQLDriversFile DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws JDOMException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
public SQLDriverManager(File personalSQLDriversFile) throws MissingAttributeException, MissingElementException, JDOMException, IOException {
this.personalSQLDriversFile = personalSQLDriversFile;
this.drivers = new TreeMap();
loadAvailableDrivers();
}
/**
* DOCUMENT ME!
*
* @param nameOrClassName DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public final Driver getDriver(String nameOrClassName) {
if (nameOrClassName == null) {
throw new IllegalArgumentException("Missing nameOrClassName");
}
if (drivers.containsKey(nameOrClassName)) {
return (Driver) drivers.get(nameOrClassName);
} else {
return findDriverByClassName(nameOrClassName);
}
}
/**
* DOCUMENT ME!
*
* @param name DOCUMENT ME!
* @param className DOCUMENT ME!
* @param url DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws IllegalArgumentException DOCUMENT ME!
* @throws RuntimeException DOCUMENT ME!
*/
public final Driver saveDriver(String name,
String className,
String url) throws MissingAttributeException, MissingElementException {
// Driver exists which do not require className to work. Therefore only check existence of url
if (url == null) {
throw new IllegalArgumentException("Missing url");
}
Driver driver = null;
// check if driver already exists
driver = getDriver(name);
if (driver == null) {
driver = getDriver(className);
}
// ok, it is a new driver
if (driver == null) {
if (name == null) {
name = className;
}
if (name == null) {
throw new RuntimeException("Cannot store a driver without a name nor className");
}
Element driverElement = new Element(XMLTags.DRIVER);
driverElement.setAttribute(XMLTags.NAME, name);
Element classElement = new Element(XMLTags.CLASS);
Element urlElement = new Element(XMLTags.URL);
classElement.setAttribute(XMLTags.NAME, className);
urlElement.setAttribute(XMLTags.URL, url);
driverElement.addContent(classElement);
driverElement.addContent(urlElement);
driversDoc.getRootElement().addContent(driverElement);
driver = new Driver(driverElement);
drivers.put(driver.getName(), driver);
} else {
driver.setName(name);
driver.setClassName(className);
}
return driver;
}
/**
* DOCUMENT ME!
*
* @param driver DOCUMENT ME!
* @param url DOCUMENT ME!
* @param username DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public final void setSourceDriverDefault(Driver driver,
String url,
String username) {
if (driver == null) {
throw new IllegalArgumentException("Missing driver");
}
resetLastSelected(XMLTags.SOURCE_DB);
resetDefault(XMLTags.SOURCE_DB);
driver.setDefault(XMLTags.SOURCE_DB, url, username);
}
/**
* DOCUMENT ME!
*
* @param driver DOCUMENT ME!
* @param url DOCUMENT ME!
* @param username DOCUMENT ME!
*
* @throws IllegalArgumentException DOCUMENT ME!
*/
public final void setDestinationDriverDefault(Driver driver,
String url,
String username) {
if (driver == null) {
throw new IllegalArgumentException("Missing driver");
}
resetLastSelected(XMLTags.DESTINATION_DB);
resetDefault(XMLTags.DESTINATION_DB);
driver.setDefault(XMLTags.DESTINATION_DB, url, username);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final TreeMap getDrivers() {
return drivers;
}
/**
* DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
*/
public final void saveDriverFileIntoUserHome() throws IOException {
ExportToXML.createXML(driversDoc, personalSQLDriversFile.getAbsolutePath());
}
/**
* DOCUMENT ME!
*
* @throws MissingAttributeException DOCUMENT ME!
* @throws MissingElementException DOCUMENT ME!
* @throws JDOMException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
private void loadAvailableDrivers() throws MissingAttributeException, MissingElementException, JDOMException, IOException {
driversDoc = ImportFromXML.importFile(personalSQLDriversFile);
Element root = driversDoc.getRootElement();
if ((root == null) && (root.getChildren().size() == 0)) {
throw new MissingElementException(root, XMLTags.DRIVER);
}
Iterator itDrivers = root.getChildren(XMLTags.DRIVER).iterator();
while (itDrivers.hasNext()) {
Element driverElement = (Element) itDrivers.next();
Driver driver = new Driver(driverElement);
drivers.put(driver.getName(), driver);
}
}
private void resetLastSelected(String database) {
Iterator itDrivers = drivers.values().iterator();
while (itDrivers.hasNext()) {
Driver tempDriver = (Driver) itDrivers.next();
if ((tempDriver.getDefault(database) != null) && (tempDriver.getDefault(database).getName().compareTo(database) == 0)) {
tempDriver.setLastSelected(database, false);
}
}
}
/**
* DOCUMENT ME!
*
* @param database DOCUMENT ME!
*/
private void resetDefault(String database) {
Iterator itDrivers = drivers.values().iterator();
while (itDrivers.hasNext()) {
Driver tempDriver = (Driver) itDrivers.next();
if ((tempDriver.getDefault(database) != null) && (tempDriver.getDefault(database).getName().compareTo(database) == 0)) {
tempDriver.resetDefault(database);
}
}
}
/**
* DOCUMENT ME!
*
* @param className DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
/**
* DOCUMENT ME!
*
* @param className DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Driver findDriverByClassName(String className) {
Iterator itDrivers = drivers.values().iterator();
while (itDrivers.hasNext()) {
Driver driver = (Driver) itDrivers.next();
if (driver.getClassName().compareTo(className) == 0) {
return driver;
}
}
return null;
}
}