/*
* Copyright (C) 2007 SQL Explorer Development Team http://sourceforge.net/projects/eclipsesql
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package net.sourceforge.sqlexplorer.dbproduct;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeMap;
import net.sourceforge.sqlexplorer.ApplicationFiles;
import net.sourceforge.sqlexplorer.ExplorerException;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultElement;
import org.talend.cwm.helper.ConnectionHelper;
/**
* Maintains the list of Alias objects
*
* @author John Spackman
*
*/
public class AliasManager implements ConnectionListener {
// List of aliases, indexed by alias name
private TreeMap<String, Alias> aliases = new TreeMap<String, Alias>();
// Connection Listeners
private LinkedList<ConnectionListener> connectionListeners = new LinkedList<ConnectionListener>();
/**
* Loads Aliases from the users preferences
*
*/
public void loadAliases() throws ExplorerException {
aliases.clear();
try {
SAXReader reader = new SAXReader();
File file = new File(ApplicationFiles.USER_ALIAS_FILE_NAME);
if (file.exists()) {
Element root = reader.read(file).getRootElement();
if (root.getName().equals("Beans")) {
root = convertToV350(root);
}
List<Element> list = root.elements(Alias.ALIAS);
// MOD mzhao bug:19539 Judge if the alias need to save again because it was not encripted in previouse
// workspace. (before
// 4.2)
Boolean needToSave = false;
if (list != null) {
for (Element elem : list) {
Alias alias = new Alias(elem);
Boolean needToSaveUnit = getDecryptUser(alias.getDefaultUser());
if (!needToSave) {
needToSave = needToSaveUnit;
}
addAlias(alias);
}
}
if (needToSave) {
saveAliases();
}
// ~ 19539
}
} catch (DocumentException e) {
throw new ExplorerException(e);
}
}
private Boolean getDecryptUser(User user) throws ExplorerException {
Boolean needToSave = Boolean.FALSE;
if (user == null) {
return needToSave;
}
String password = user.getPassword();
if (password == null || password.trim().equals("")) { //$NON-NLS-1$
return needToSave;
}
String decPassword = ConnectionHelper.getDecryptPassword(password);
if (decPassword != null) {
user.setPassword(decPassword);
} else {
needToSave = Boolean.TRUE;
}
return needToSave;
}
/**
* Saves all the Aliases to the users preferences
*
*/
public void saveAliases() throws ExplorerException {
DefaultElement root = new DefaultElement(Alias.ALIASES);
for (Alias alias : aliases.values()) {
root.add(alias.describeAsXml());
}
try {
FileWriter writer = new FileWriter(new File(ApplicationFiles.USER_ALIAS_FILE_NAME));
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(root);
writer.flush();
writer.close();
} catch (IOException e) {
throw new ExplorerException(e);
}
}
/**
* Adds an Alias
*
* @param alias
*/
public void addAlias(Alias alias) throws ExplorerException {
aliases.put(alias.getName(), alias);
}
/**
* Removes an Alias with a given name
*
* @param aliasName
*/
public void removeAlias(String aliasName) {
Alias alias = aliases.remove(aliasName);
if (alias != null) {
alias.closeAllConnections();
SQLExplorerPlugin.getDefault().getAliasManager().modelChanged();
}
}
/**
* Locates an Alias by name
*
* @param aliasName
* @return
*/
public Alias getAlias(String aliasName) {
return aliases.get(aliasName);
}
/**
* Provides a list of all Aliases
*
* @return
*/
public Collection<Alias> getAliases() {
return aliases.values();
}
/**
* Returns true if the alias is in our list
*
* @param alias
* @return
*/
public boolean contains(Alias alias) {
return aliases.values().contains(alias);
}
/**
* Closes all connections in all aliases; note that ConnectionListeners are NOT invoked
*
*/
public void closeAllConnections() throws ExplorerException {
for (Alias alias : aliases.values()) {
alias.closeAllConnections();
}
}
/**
* Adds a listener for the connections
*
* @param listener
*/
public void addListener(ConnectionListener listener) {
connectionListeners.add(listener);
}
/**
* Removes a listener
*
* @param listener
*/
public void removeListener(ConnectionListener listener) {
connectionListeners.remove(listener);
}
/**
* Called to notify that the list of connections has changed; passes this onto the listeners
*/
public void modelChanged() {
for (ConnectionListener listener : connectionListeners) {
listener.modelChanged();
}
}
/**
* Upgrades a v3 definition (java beans style) to v3.5.0beta2 and onwards
*
* @param beans
* @return
*/
protected Element convertToV350(Element beans) {
Element result = new DefaultElement(Alias.ALIASES);
for (Element bean : beans.elements("Bean")) {
Element alias = result.addElement(Alias.ALIAS);
alias.addAttribute(Alias.AUTO_LOGON, Boolean.toString(getBoolean(bean.elementText("autoLogon"), false)));
alias.addAttribute(Alias.CONNECT_AT_STARTUP,
Boolean.toString(getBoolean(bean.elementText("connectAtStartup"), false)));
alias.addAttribute(Alias.DRIVER_ID, bean.element("driverIdentifier").elementText("string"));
alias.addElement(Alias.NAME).setText(bean.elementText("name"));
Element userElem = alias.addElement(Alias.USERS).addElement(User.USER);
userElem.addElement(User.USER_NAME).setText(bean.elementText("userName"));
userElem.addElement(User.PASSWORD).setText(bean.elementText("password"));
alias.addElement(Alias.URL).setText(bean.elementText("url"));
alias.addElement(Alias.FOLDER_FILTER_EXPRESSION).setText(bean.elementText("folderFilterExpression"));
alias.addElement(Alias.NAME_FILTER_EXPRESSION).setText(bean.elementText("nameFilterExpression"));
alias.addElement(Alias.SCHEMA_FILTER_EXPRESSION).setText(bean.elementText("schemaFilterExpression"));
}
return result;
}
/**
* Helper method to convert a string to a boolean
*
* @param value
* @param defaultValue
* @return
*/
private boolean getBoolean(String value, boolean defaultValue) {
if (value == null || value.trim().length() == 0) {
return defaultValue;
}
return value.equals("true") || value.equals("yes") || value.equals("on");
}
}