/*
 * Copyright (C) 2003 <a href="mailto:jochen.hiller@bauer-partner.com">Jochen Hiller</a>
 *
 * This library 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 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 org.mandarax.sql;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.mandarax.util.logging.LogCategories;

/**
 * The DefaultConnectionManager implements the 
 * interface of the SQLConnectionManager. 
 * 
 * It supports specification of a plain SQL connection,
 * or usage of the J2EE compliant data sources.
 * If a plain SQL connection will be given during initialize,
 * a data source wrapper will be used for this connection. 
 * 
 * @see SQLConnectionManager
 * @see java.sql.Connection
 * @see javax.sql.DataSource
 * 
 * @author <a href="mailto:jochen.hiller@bauer-partner.com">Jochen Hiller</a>
 * @version 3.3.1 <9 August 2004>
 * @since 2.2
 */
public class DefaultConnectionManager implements SQLConnectionManager {

	// attributes

	/** a data source */
	private DataSource dataSource = null;

	// constructors

	/**
	 * Instantiates a new connection manager for a given SQL connection.
	 * The connection will be wrapped through our data source
	 * connection wrapper.
	 * 
	 * @param con the plain sql connection
	 */
	public DefaultConnectionManager(Connection con) {
		if (con == null) {
			throw new IllegalArgumentException("Connection is null");
		}
		this.dataSource = new ConnectionWrapperDataSource (con);
	}

	/**
	 * Instantiates a new connection manager for a given data source.
	 * 
	 * @param ds the given data source
	 */
	public DefaultConnectionManager(DataSource ds) {
		if (ds == null) {
			throw new IllegalArgumentException("DataSource is null");
		}
		this.dataSource = ds;
	}

	// public methods

	/**
	 * Gets a data source from the connection manager.
	 * 
	 * @return a data source
	 */
	public DataSource getDataSource () {
		LogCategories.LOG_SQL.debug("getDataSource()");
		return this.dataSource;
	}

	/**
	 * Releases a connection, give it back to connection manager.
	 * 
	 * @todo close the connection, dependent on a bool setting
	 * @param con the connection to release 
	 */
	public void releaseConnection(Connection con) throws SQLException {
		LogCategories.LOG_SQL.debug("releaseConnection ()");
		// nothing to do for the moment
	}

	// inner classes

	/**
	 * A data source, which wraps a simple SQL connection.
	 * 
	 * Only in private scope.
	 * 
     * @author <a href="mailto:jochen.hiller@bauer-partner.com">Jochen Hiller</a>
 * @version 3.3.1 <9 August 2004>
     * @since 2.2
	 */
	private class ConnectionWrapperDataSource implements DataSource {

		/** the connection to wrap */
		private Connection wrappedConnection;

		/** the login timeout */
		private int loginTimeout;

		/** the log print writer */
		private PrintWriter logPrintWriter;

		/**
		 * Default constructor.
		 */
		public ConnectionWrapperDataSource(Connection con) {
			super();
			wrappedConnection = con;
		}

		/**
		 * Get a database connection.
		 * @return a database connection
		 */
		public Connection getConnection() throws SQLException {
			return wrappedConnection;
		}

		/**
		 * Get a database connection.
		 * 
		 * @todo support user/password
		 * @param userName a user name
		 * @param password a password
		 * @return a database connection
		 */
		public Connection getConnection(String userName, String password) throws SQLException {
			return getConnection ();
		}
	
		/**
		 * Get the login timeout.
		 * @return the login timeout (an integer).
		 */
		public int getLoginTimeout() throws SQLException {
			return loginTimeout; 
		}

		/**
		 * Get a log writer.
		 * @return a log writer.
		 */
		public PrintWriter getLogWriter() throws SQLException {
			return logPrintWriter;
		}

		/**
		 * Set the login timeout.
		 * @param millis the time in milli seconds
		 */
		public void setLoginTimeout(int millis) throws SQLException {
			loginTimeout = millis;
		}

		/**
		 * Set the log writer.
		 * @param writer a writer
		 */
		public void setLogWriter(PrintWriter writer) throws SQLException {
			logPrintWriter = writer;
		}

        public Object unwrap(Class iface) throws SQLException {
            return null;  //To change body of implemented methods use File | Settings | File Templates.
        }

        public boolean isWrapperFor(Class iface) throws SQLException {
            return false;  //To change body of implemented methods use File | Settings | File Templates.
        }
	}
}
