1 package com.quantum.model;
 
   3 import java.beans.PropertyChangeListener;
 
   4 import java.beans.PropertyChangeSupport;
 
   5 import java.sql.Connection;
 
   6 import java.sql.SQLException;
 
   7 import java.util.ArrayList;
 
   8 import java.util.Collections;
 
   9 import java.util.HashSet;
 
  10 import java.util.Hashtable;
 
  11 import java.util.List;
 
  15 import com.quantum.IQuantumConstants;
 
  16 import com.quantum.QuantumPlugin;
 
  17 import com.quantum.adapters.AdapterFactory;
 
  18 import com.quantum.adapters.DatabaseAdapter;
 
  19 import com.quantum.sql.ConnectionEstablisher;
 
  20 import com.quantum.sql.MultiSQLServer;
 
  22 import org.eclipse.jface.preference.IPreferenceStore;
 
  25  * Class Bookmark holds the "static" information of a bookmark, that is the data that
 
  26  * is saved and loaded from the external file and describes a bookmark. This info will
 
  27  * be filled up by the end user.
 
  31 public class Bookmark {
 
  33     private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
 
  34         private String name = ""; //$NON-NLS-1$
 
  35         private String username = ""; //$NON-NLS-1$
 
  36     private String password = ""; //$NON-NLS-1$
 
  37     private String connect = ""; //$NON-NLS-1$
 
  38     private String driver = ""; //$NON-NLS-1$
 
  39     private String type = ""; //$NON-NLS-1$
 
  40     private String driverFile = ""; //$NON-NLS-1$
 
  43      * A quick list is a list of favourite tables that a person might want to view
 
  44      * without having to look at the entire list of tables.
 
  46     private Map quickList = new Hashtable();
 
  47         private Set schemas = new HashSet();   
 
  48         private Connection connection = null;
 
  49     private ConnectionEstablisher connectionEstablisher;
 
  50     private boolean changed = true;
 
  51     private List queries = Collections.synchronizedList(new ArrayList());
 
  52     private boolean promptForPassword = false;
 
  53     private boolean autoCommit = true;
 
  54     private String autoCommitPreference = IQuantumConstants.autoCommitTrue;
 
  57         this(MultiSQLServer.getInstance());
 
  60     public Bookmark(ConnectionEstablisher connectionEstablisher) {
 
  61         this.connectionEstablisher = connectionEstablisher;
 
  64         public Bookmark(Bookmark data) {
 
  66                 setName(data.getName());
 
  67                 setUsername(data.getUsername());
 
  68                 setPassword(data.getPassword());
 
  69                 setConnect(data.getConnect());
 
  70                 setDriver(data.getDriver());
 
  71                 setType(data.getType());
 
  72                 setDriverFile(data.getDriverFile());
 
  73         setPromptForPassword(data.getPromptForPassword());
 
  74         setAutoCommit(data.isAutoCommit());
 
  75         setAutoCommitPreference(data.getAutoCommitPreference());
 
  77         this.schemas.addAll(data.schemas);
 
  78         this.quickList = new Hashtable(data.quickList);
 
  82          * Returns the JDBC URL.
 
  85         public String getConnect() {
 
  93         public String getDriver() {
 
  98          * Returns the driverFile.
 
 101         public String getDriverFile() {
 
 106          * Returns the password.
 
 109         public String getPassword() {
 
 114          * Returns the username.
 
 117         public String getUsername() {
 
 123          * @param connect The connect to set
 
 125         public void setConnect(String connect) {
 
 126                 if (connect == null) {
 
 127                         connect = ""; //$NON-NLS-1$
 
 129                 this.connect = connect;
 
 134          * @param driver The driver to set
 
 136         public void setDriver(String driver) {
 
 137                 if (driver == null) {
 
 138                         driver = ""; //$NON-NLS-1$
 
 140                 this.driver = driver;
 
 144          * Sets the driverFile.
 
 145          * @param driverFile The driverFile to set
 
 147         public void setDriverFile(String driverFile) {
 
 148                 if (driverFile == null) {
 
 149                         driverFile = ""; //$NON-NLS-1$
 
 151                 this.driverFile = driverFile;
 
 156          * @param password The password to set
 
 158         public void setPassword(String password) {
 
 159                 if (password == null) {
 
 160                         password = ""; //$NON-NLS-1$
 
 162                 this.password = password;
 
 167          * @param username The username to set
 
 169         public void setUsername(String username) {
 
 170                 if (username == null) {
 
 171                         username = ""; //$NON-NLS-1$
 
 173                 this.username = username;
 
 180         public String getName() {
 
 186          * @param name The name to set
 
 188         public void setName(String name) {
 
 190                         name = ""; //$NON-NLS-1$
 
 192         if (!name.equals(this.name)) {
 
 194             String oldName = this.name;
 
 196             this.propertyChangeSupport.firePropertyChange("name", oldName, this.name);
 
 201         public boolean isEmpty() {
 
 202                 if (name.equals("") && //$NON-NLS-1$
 
 203                 username.equals("") && //$NON-NLS-1$
 
 204                 password.equals("") && //$NON-NLS-1$
 
 205                 connect.equals("") && //$NON-NLS-1$
 
 206                 driver.equals("") && //$NON-NLS-1$
 
 207                 type.equals("") && //$NON-NLS-1$
 
 208                 driverFile.equals("")) { //$NON-NLS-1$
 
 213         public String toString() {
 
 214                 StringBuffer buffer = new StringBuffer();
 
 215                 buffer.append("["); //$NON-NLS-1$
 
 216                 buffer.append("name="); //$NON-NLS-1$
 
 218                 buffer.append(", "); //$NON-NLS-1$
 
 219                 buffer.append("username="); //$NON-NLS-1$
 
 220                 buffer.append(username);
 
 221                 buffer.append(", "); //$NON-NLS-1$
 
 222                 buffer.append("password=****"); //$NON-NLS-1$
 
 223                 buffer.append(", "); //$NON-NLS-1$
 
 224                 buffer.append("connect="); //$NON-NLS-1$
 
 225                 buffer.append(connect);
 
 226                 buffer.append(", "); //$NON-NLS-1$
 
 227                 buffer.append("driver="); //$NON-NLS-1$
 
 228                 buffer.append(driver);
 
 229                 buffer.append(", "); //$NON-NLS-1$
 
 230                 buffer.append("type="); //$NON-NLS-1$
 
 232                 buffer.append(", "); //$NON-NLS-1$
 
 233                 buffer.append("driverFile="); //$NON-NLS-1$
 
 234                 buffer.append(driverFile);
 
 235                 buffer.append("]"); //$NON-NLS-1$
 
 236                 return buffer.toString();
 
 239         public String getType() {
 
 243         public void setType(String type) {
 
 247     public Connection connect(PasswordFinder passwordFinder) throws ConnectionException {
 
 248         boolean isConnected = isConnected();
 
 249         if (this.connection == null) {
 
 250             this.connection = this.connectionEstablisher.connect(this, passwordFinder);
 
 253         if (isConnected() != isConnected) {
 
 254             this.propertyChangeSupport.firePropertyChange(
 
 255                 "connected", isConnected, isConnected());
 
 257         return this.connection;
 
 261          * Returns the connection object. 
 
 262          * @return the Connection object associated with the current JDBC source.
 
 265     public Connection getConnection() throws NotConnectedException {
 
 266         if (this.connection == null) {
 
 267             throw new NotConnectedException();
 
 269         return this.connection;
 
 273          * @return true if the BookmarkNode is connected to a JDBC source
 
 275     public boolean isConnected() {
 
 276         return (connection != null);
 
 280          * Sets the connection member. From that moment on the BookmarkNode is "connected" (open)
 
 281          * @param connection : a valid connection to a JDBC source
 
 283     public void setConnection(Connection connection) {
 
 284         this.connection = connection;
 
 287     public void disconnect() throws ConnectionException {
 
 288         boolean isConnected = isConnected();
 
 290             if (this.connection != null) {
 
 291                 this.connectionEstablisher.disconnect(this.connection);
 
 294             this.connection = null;
 
 295             if (isConnected() != isConnected) {
 
 296                 this.propertyChangeSupport.firePropertyChange(
 
 297                     "connected", isConnected, isConnected());
 
 301     public void addSchema(String schema) {
 
 302         if (schema != null && schema.trim().length() > 0) {
 
 303             addSchema(new Schema(schema));
 
 307     public void addSchema(Schema qualifier) {
 
 308         if (qualifier != null) {
 
 309             this.schemas.add(qualifier);
 
 311             this.propertyChangeSupport.firePropertyChange("schemas", null, null);
 
 315     public void setSchemas(Schema[] schemas) {
 
 316         this.schemas.clear();
 
 317         for (int i = 0, length = (schemas == null) ? 0 : schemas.length;
 
 320             this.schemas.add(schemas[i]);
 
 324         this.propertyChangeSupport.firePropertyChange("schemas", null, null);
 
 328      * @return a list of all the schemas that have been set up.
 
 330     public Schema[] getSchemas() {
 
 331         Set set = new HashSet();
 
 332         set.addAll(this.schemas);
 
 334             set.add(new Schema(getAdapter().getDefaultSchema(this.username), 
 
 335                 this.username, true));
 
 337         List list = new ArrayList(set);
 
 338         Collections.sort(list);
 
 339         return (Schema[]) list.toArray(new Schema[list.size()]);
 
 343          * @see java.lang.Object#equals(java.lang.Object)
 
 345         public boolean equals(Object obj) {
 
 346                 if (!(obj instanceof Bookmark)) return false;
 
 347                 String name = ((Bookmark)obj).getName();
 
 348                 if (name.equals(this.getName())) return true;
 
 355     public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
 
 356         this.propertyChangeSupport.addPropertyChangeListener(listener);
 
 362     public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
 
 363         this.propertyChangeSupport.removePropertyChangeListener(listener);
 
 366     public void addQuickListEntry(String type, String schemaName, String name) {
 
 367         Entity entity = EntityFactory.getInstance().create(this, schemaName, name, type);
 
 368         this.quickList.put(entity.getCondQualifiedName(), entity);
 
 369         this.propertyChangeSupport.firePropertyChange("quickList", null, null);
 
 373     public void addQuickListEntry(Entity entity) {
 
 374         addQuickListEntry(entity.getType(), entity.getSchema(), entity.getName());
 
 377     public void removeQuickListEntry(Entity entity) {
 
 378         if (entity != null  && this.quickList.containsKey(entity.getCondQualifiedName())) {
 
 379             this.quickList.remove(entity.getCondQualifiedName());
 
 380             this.propertyChangeSupport.firePropertyChange("quickList", null, null);
 
 385     public Entity[] getQuickListEntries() {
 
 386         return (Entity[]) this.quickList.values().toArray(new Entity[this.quickList.size()]);
 
 389     public boolean hasQuickList() {
 
 390         return !this.quickList.isEmpty();
 
 395     public boolean isChanged() {
 
 402     public void setChanged(boolean b) {
 
 406     public Database getDatabase() throws NotConnectedException {
 
 407         if (!isConnected()) {
 
 408             throw new NotConnectedException();
 
 410         return new Database(this);
 
 413     public DatabaseAdapter getAdapter() {
 
 414         return AdapterFactory.getInstance().getAdapter(getType());
 
 417     public Entity[] getEntitiesForSchema(Schema schema, String type) throws SQLException {
 
 419             Entity[] entities = getDatabase().getEntities(this, schema, type);
 
 421         } catch (NotConnectedException e) {
 
 422             return new Entity[0];
 
 426     public Entity getEntity(Schema schema, String name) throws SQLException {
 
 427         Entity result = null;
 
 428         if (schema != null && name != null) {
 
 429             Entity[] entities = getEntitiesForSchema(schema, null);
 
 430             for (int i = 0, length = (entities == null) ? 0 : entities.length;
 
 431                 result == null && i < length;
 
 433                 if (schema.equals(entities[i].getSchema()) &&
 
 434                     name.equals(entities[i].getName())) {
 
 435                     result = entities[i];
 
 442     public boolean isInQuickList(Entity entity) {
 
 443         return this.quickList.containsKey(entity.getCondQualifiedName());
 
 450     public void addQuery(String queryString) {
 
 451         if (this.queries.contains(queryString)) {
 
 452             this.queries.remove(queryString);
 
 454         this.queries.add(queryString);
 
 456         int size = getQueryHistorySize();
 
 458         while (this.queries.size() > size) {
 
 459             this.queries.remove(0);
 
 461         this.propertyChangeSupport.firePropertyChange("queries", null, null);
 
 465     public String[] getQueries() {
 
 466         return (String[]) this.queries.toArray(new String[this.queries.size()]);
 
 469     private int getQueryHistorySize() {
 
 470         IPreferenceStore store =
 
 471             QuantumPlugin.getDefault().getPreferenceStore();
 
 472         return store.getInt(getClass().getName() + ".queryHistorySize"); //$NON-NLS-1$
 
 477     public boolean getPromptForPassword() {
 
 478         return promptForPassword;
 
 484     public void setPromptForPassword(boolean b) {
 
 485         promptForPassword = b;
 
 491         public boolean isAutoCommit() {
 
 498         public String getAutoCommitPreference() {
 
 499                 return autoCommitPreference;
 
 505         public void setAutoCommit(boolean b) {
 
 512         public void setAutoCommitPreference(String string) {
 
 513                 autoCommitPreference = string;
 
 516         // Returns true or false indicating whether this bookmark must be set to AutoCommit on connection or not 
 
 517         public boolean getDefaultAutoCommit(){
 
 518                 if (autoCommitPreference.equals(IQuantumConstants.autoCommitTrue)) return true;
 
 519                 else if (autoCommitPreference.equals(IQuantumConstants.autoCommitFalse)) return false;
 
 520                 else if (autoCommitPreference.equals(IQuantumConstants.autoCommitSaved)) return autoCommit;