/*******************************************************************************
 * Copyright (c) 2006, 2007 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the terms of
 * the Eclipse Public License v1.0, which accompanies this distribution and is available at
 * http://www.eclipse.org/legal/epl-v10.html.
 *
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.db.internal;

import java.text.Collator;
import java.util.NoSuchElementException;
import org.eclipse.datatools.connectivity.sqm.core.rte.ICatalogObjectListener;

/**
 *  ConnectionProfile wrapper base class.
 */
public abstract class ConnectionProfile extends DTPWrapper {
	
	private Connection connection; // Lazy initialized
	private Database database; // Lazy initialized
	private String catalogName;  // Catalog used for this profile
	
	private ConnectionListener connectionListener;
	
	private ConnectionProfileRepository profileRepository;
	
	// ********** constructors **********

	static ConnectionProfile createProfile( ConnectionProfileRepository profileRepository, org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile) {
		return ( dtpProfile == null) ? NullConnectionProfile.instance() : new DTPConnectionProfileWrapper( profileRepository, dtpProfile);
	}

	ConnectionProfile( ConnectionProfileRepository profileRepository) {
		super();
		this.profileRepository = profileRepository;
		this.connectionListener = buildConnectionListener();
		this.catalogName = "";
	}
	
	// ********** behavior **********

	public abstract void connect();
	
	public abstract void disconnect();
	
	protected abstract Connection buildConnection();
	
	protected abstract Database buildDatabase();
	
	abstract void databaseChanged( Database database, int eventType);
	
	abstract void catalogChanged( Catalog catalog, Database database, int eventType);
	
	abstract void schemaChanged( Schema schema, Database database, int eventType);
	
	abstract void tableChanged( Table table, Schema schema, Database database, int eventType);

	protected void refreshDatabase() {
		this.disposeDatabase();
		this.database = null;
    }
    
	protected void dispose() {
		this.disengageConnectionListener();
		
		this.disposeConnection();
		this.disposeDatabase();
	}
	
	private void disposeConnection() {
		if( this.connection != null) {
			this.getConnection().dispose();
		}
	}
	
	private void disposeDatabase() {
		if( this.database != null) {
			this.getDatabase().dispose();
		}
	}

	// ********** queries **********
	
	public Connection getConnection() {
		
		if( this.connection == null) {
			this.connection = this.buildConnection();
			this.engageConnectionListener();

		}
		return this.connection;
	}

	public Database getDatabase() {
		
		if( this.database == null) {
			this.database = this.buildDatabase();
			this.setDefaultCatalogName();
		}
		return this.database;
	}
	
	public abstract String getDatabaseName();

	public abstract String getDatabaseProduct();
	
	public abstract String getDatabaseVendor();
	
	public abstract String getDatabaseVersion();

	public abstract String getUserName();
	
	public abstract String getInstanceId();

	public abstract String getProviderId();
	
	public abstract boolean isConnected();

	protected boolean connectionIsOnline() {
		return this.isConnected();
	}
	
	abstract boolean wraps( org.eclipse.datatools.connectivity.IConnectionProfile dtpProfile);
	
	public boolean isNull() {
		return true;
	}
	
	ConnectionProfileRepository getProfileRepository() {
		return this.profileRepository;
	}
	
	public String getCatalogName() {
		return this.catalogName;
	}
	
	/**
	 * Set the default catalog name for this profile.
	 */
	public void setDefaultCatalogName() {
		this.setCatalogName( this.database.getDefaultCatalogName());
	}

	/**
	 * Can only set the catalog to use for this profile, when the database supports catalogs.
	 */
	public void setCatalogName( String catalogName) {
		if( this.catalogName == catalogName) {
			return;
		}
		if( this.database.supportsCatalogs()) {
			String name = ( catalogName != null) ? catalogName : this.database.getDefaultCatalogName();
			
			Catalog catalog = this.database.catalogNamed( name);
			if( catalog == null) {
				throw new NoSuchElementException();
			}
			this.catalogName = name;
			this.database.refresh();
			this.catalogChanged( catalog, this.database, ICatalogObjectListener.EventTypeEnumeration.ELEMENT_REFRESH);
		}
		else {
			this.catalogName = "";
			this.database.refresh();
		}
	}
	
	// ********** listeners **********

	abstract public void addProfileListener( ProfileListener listener);

	abstract public void removeProfileListener( ProfileListener listener);

	abstract public void addConnectionListener( ConnectionListener listener);

	abstract public void removeConnectionListener( ConnectionListener listener);

    private ConnectionListener buildConnectionListener() {
		return new ConnectionListener() {

			public void aboutToClose(Connection connection) {
				// not interested to this event.
			}

			public void closed(Connection connection) {
				ConnectionProfile.this.refreshDatabase();
				}

			public void modified(Connection connection) {
				// not interested to this event.
				return;
				}

			public boolean okToClose(Connection connection) {
				// not interested to this event.
				return true;
			}

			public void opened(Connection connection) {
				ConnectionProfile.this.refreshDatabase();
			}

			public void databaseChanged(Connection connection, final Database database) {
				// not interested to this event.
				return;
				}
			
			public void schemaChanged(Connection connection, final Schema schema) {
				// not interested to this event.
				return;
				}

			public void tableChanged(Connection connection, final Table table) {
				// not interested to this event.
				return;
			}
		};
    }
    
	protected void disengageConnectionListener() {
		this.removeConnectionListener();
	}

	protected void engageConnectionListener() {
		this.addConnectionListener();
	}

	private void addConnectionListener() {
		this.addConnectionListener( this.connectionListener);
	}
	
	private void removeConnectionListener() {
		this.removeConnectionListener( this.connectionListener);
	}
	
	// ********** Comparable implementation **********

	public int compareTo( Object o) {
		return Collator.getInstance().compare( this.getName(), (( ConnectionProfile)o).getName());
	}

}
