/*
 * Copyright (c) 2003, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.jdbcra.spi;

import jakarta.resource.ResourceException;
import jakarta.resource.spi.ConnectionRequestInfo;
import com.sun.jdbcra.spi.ConnectionManager;
import com.sun.jdbcra.common.DataSourceSpec;
import com.sun.jdbcra.common.DataSourceObjectBuilder;
import com.sun.jdbcra.util.SecurityUtils;
import jakarta.resource.spi.security.PasswordCredential;
import com.sun.jdbcra.spi.ManagedConnectionFactory;
import com.sun.jdbcra.common.DataSourceSpec;
import java.util.logging.Logger;
import java.util.logging.Level;

/**
 * Data Source <code>ManagedConnectionFactory</code> implementation for Generic JDBC Connector.
 *
 * @version        1.0, 02/07/30
 * @author        Evani Sai Surya Kiran
 */

public class DSManagedConnectionFactory extends ManagedConnectionFactory {

    private transient javax.sql.DataSource dataSourceObj;

    private static Logger _logger;
    static {
        _logger = Logger.getAnonymousLogger();
    }
    private boolean debug = false;

    /**
     * Creates a new physical connection to the underlying EIS resource
     * manager.
     *
     * @param        subject        <code>Subject</code> instance passed by the application server
     * @param        cxRequestInfo        <code>ConnectionRequestInfo</code> which may be created
     *                                    as a result of the invocation <code>getConnection(user, password)</code>
     *                                    on the <code>DataSource</code> object
     * @return        <code>ManagedConnection</code> object created
     * @throws        ResourceException        if there is an error in instantiating the
     *                                         <code>DataSource</code> object used for the
     *                                       creation of the <code>ManagedConnection</code> object
     * @throws        SecurityException        if there ino <code>PasswordCredential</code> object
     *                                         satisfying this request
     * @throws        ResourceAllocationException        if there is an error in allocating the
     *                                                physical connection
     */
    public jakarta.resource.spi.ManagedConnection createManagedConnection(javax.security.auth.Subject subject,
        ConnectionRequestInfo cxRequestInfo) throws ResourceException {
        if(logWriter != null) {
                logWriter.println("In createManagedConnection");
        }
        PasswordCredential pc = SecurityUtils.getPasswordCredential(this, subject, cxRequestInfo);

        if(dataSourceObj == null) {
            if(dsObjBuilder == null) {
                dsObjBuilder = new DataSourceObjectBuilder(spec);
            }

            System.out.println("V3-TEST : before getting datasource object");
            try {
                dataSourceObj = (javax.sql.DataSource) dsObjBuilder.constructDataSourceObject();
            } catch(ClassCastException cce) {
                _logger.log(Level.SEVERE, "jdbc.exc_cce", cce);
                throw new jakarta.resource.ResourceException(cce.getMessage());
            }
        }

        java.sql.Connection dsConn = null;

        try {
            /* For the case where the user/passwd of the connection pool is
             * equal to the PasswordCredential for the connection request
             * get a connection from this pool directly.
             * for all other conditions go create a new connection
             */
            if ( isEqual( pc, getUser(), getPassword() ) ) {
                dsConn = dataSourceObj.getConnection();
            } else {
                dsConn = dataSourceObj.getConnection(pc.getUserName(),
                    new String(pc.getPassword()));
            }
        } catch(java.sql.SQLException sqle) {
            sqle.printStackTrace();
            _logger.log(Level.WARNING, "jdbc.exc_create_conn", sqle);
            throw new jakarta.resource.spi.ResourceAllocationException("The connection could not be allocated: " +
                sqle.getMessage());
        } catch(Exception e){
            System.out.println("V3-TEST : unable to get connection");
            e.printStackTrace();
        }
        System.out.println("V3-TEST : got connection");

        com.sun.jdbcra.spi.ManagedConnection mc = new com.sun.jdbcra.spi.ManagedConnection(null, dsConn, pc, this);
        //GJCINT
/*
        setIsolation(mc);
        isValid(mc);
*/
        System.out.println("V3-TEST : returning connection");
        return mc;
    }

    /**
     * Check if this <code>ManagedConnectionFactory</code> is equal to
     * another <code>ManagedConnectionFactory</code>.
     *
     * @param        other        <code>ManagedConnectionFactory</code> object for checking equality with
     * @return        true        if the property sets of both the
     *                        <code>ManagedConnectionFactory</code> objects are the same
     *                false        otherwise
     */
    public boolean equals(Object other) {
        if(logWriter != null) {
                logWriter.println("In equals");
        }
        /**
         * The check below means that two ManagedConnectionFactory objects are equal
         * if and only if their properties are the same.
         */
        if(other instanceof com.sun.jdbcra.spi.DSManagedConnectionFactory) {
            com.sun.jdbcra.spi.DSManagedConnectionFactory otherMCF =
                (com.sun.jdbcra.spi.DSManagedConnectionFactory) other;
            return this.spec.equals(otherMCF.spec);
        }
        return false;
    }

    /**
     * Sets the server name.
     *
     * @param        serverName        <code>String</code>
     * @see        <code>getServerName</code>
     */
    public void setserverName(String serverName) {
        spec.setDetail(DataSourceSpec.SERVERNAME, serverName);
    }

    /**
     * Gets the server name.
     *
     * @return        serverName
     * @see        <code>setServerName</code>
     */
    public String getserverName() {
        return spec.getDetail(DataSourceSpec.SERVERNAME);
    }

    /**
     * Sets the server name.
     *
     * @param        serverName        <code>String</code>
     * @see        <code>getServerName</code>
     */
    public void setServerName(String serverName) {
        spec.setDetail(DataSourceSpec.SERVERNAME, serverName);
    }

    /**
     * Gets the server name.
     *
     * @return        serverName
     * @see        <code>setServerName</code>
     */
    public String getServerName() {
        return spec.getDetail(DataSourceSpec.SERVERNAME);
    }

    /**
     * Sets the port number.
     *
     * @param        portNumber        <code>String</code>
     * @see        <code>getPortNumber</code>
     */
    public void setportNumber(String portNumber) {
        spec.setDetail(DataSourceSpec.PORTNUMBER, portNumber);
    }

    /**
     * Gets the port number.
     *
     * @return        portNumber
     * @see        <code>setPortNumber</code>
     */
    public String getportNumber() {
        return spec.getDetail(DataSourceSpec.PORTNUMBER);
    }

    /**
     * Sets the port number.
     *
     * @param        portNumber        <code>String</code>
     * @see        <code>getPortNumber</code>
     */
    public void setPortNumber(String portNumber) {
        spec.setDetail(DataSourceSpec.PORTNUMBER, portNumber);
    }

    /**
     * Gets the port number.
     *
     * @return        portNumber
     * @see        <code>setPortNumber</code>
     */
    public String getPortNumber() {
        return spec.getDetail(DataSourceSpec.PORTNUMBER);
    }

    /**
     * Sets the database name.
     *
     * @param        databaseName        <code>String</code>
     * @see        <code>getDatabaseName</code>
     */
    public void setdatabaseName(String databaseName) {
        spec.setDetail(DataSourceSpec.DATABASENAME, databaseName);
    }

    /**
     * Gets the database name.
     *
     * @return        databaseName
     * @see        <code>setDatabaseName</code>
     */
    public String getdatabaseName() {
        return spec.getDetail(DataSourceSpec.DATABASENAME);
    }

    /**
     * Sets the database name.
     *
     * @param        databaseName        <code>String</code>
     * @see        <code>getDatabaseName</code>
     */
    public void setDatabaseName(String databaseName) {
        spec.setDetail(DataSourceSpec.DATABASENAME, databaseName);
    }

    /**
     * Gets the database name.
     *
     * @return        databaseName
     * @see        <code>setDatabaseName</code>
     */
    public String getDatabaseName() {
        return spec.getDetail(DataSourceSpec.DATABASENAME);
    }

    /**
     * Sets the data source name.
     *
     * @param        dsn <code>String</code>
     * @see        <code>getDataSourceName</code>
     */
    public void setdataSourceName(String dsn) {
        spec.setDetail(DataSourceSpec.DATASOURCENAME, dsn);
    }

    /**
     * Gets the data source name.
     *
     * @return        dsn
     * @see        <code>setDataSourceName</code>
     */
    public String getdataSourceName() {
        return spec.getDetail(DataSourceSpec.DATASOURCENAME);
    }

    /**
     * Sets the data source name.
     *
     * @param        dsn <code>String</code>
     * @see        <code>getDataSourceName</code>
     */
    public void setDataSourceName(String dsn) {
        spec.setDetail(DataSourceSpec.DATASOURCENAME, dsn);
    }

    /**
     * Gets the data source name.
     *
     * @return        dsn
     * @see        <code>setDataSourceName</code>
     */
    public String getDataSourceName() {
        return spec.getDetail(DataSourceSpec.DATASOURCENAME);
    }

    /**
     * Sets the description.
     *
     * @param        desc        <code>String</code>
     * @see        <code>getDescription</code>
     */
    public void setdescription(String desc) {
        spec.setDetail(DataSourceSpec.DESCRIPTION, desc);
    }

    /**
     * Gets the description.
     *
     * @return        desc
     * @see        <code>setDescription</code>
     */
    public String getdescription() {
        return spec.getDetail(DataSourceSpec.DESCRIPTION);
    }

    /**
     * Sets the description.
     *
     * @param        desc        <code>String</code>
     * @see        <code>getDescription</code>
     */
    public void setDescription(String desc) {
        spec.setDetail(DataSourceSpec.DESCRIPTION, desc);
    }

    /**
     * Gets the description.
     *
     * @return        desc
     * @see        <code>setDescription</code>
     */
    public String getDescription() {
        return spec.getDetail(DataSourceSpec.DESCRIPTION);
    }

    /**
     * Sets the network protocol.
     *
     * @param        nwProtocol        <code>String</code>
     * @see        <code>getNetworkProtocol</code>
     */
    public void setnetworkProtocol(String nwProtocol) {
        spec.setDetail(DataSourceSpec.NETWORKPROTOCOL, nwProtocol);
    }

    /**
     * Gets the network protocol.
     *
     * @return        nwProtocol
     * @see        <code>setNetworkProtocol</code>
     */
    public String getnetworkProtocol() {
        return spec.getDetail(DataSourceSpec.NETWORKPROTOCOL);
    }

    /**
     * Sets the network protocol.
     *
     * @param        nwProtocol        <code>String</code>
     * @see        <code>getNetworkProtocol</code>
     */
    public void setNetworkProtocol(String nwProtocol) {
        spec.setDetail(DataSourceSpec.NETWORKPROTOCOL, nwProtocol);
    }

    /**
     * Gets the network protocol.
     *
     * @return        nwProtocol
     * @see        <code>setNetworkProtocol</code>
     */
    public String getNetworkProtocol() {
        return spec.getDetail(DataSourceSpec.NETWORKPROTOCOL);
    }

    /**
     * Sets the role name.
     *
     * @param        roleName        <code>String</code>
     * @see        <code>getRoleName</code>
     */
    public void setroleName(String roleName) {
        spec.setDetail(DataSourceSpec.ROLENAME, roleName);
    }

    /**
     * Gets the role name.
     *
     * @return        roleName
     * @see        <code>setRoleName</code>
     */
    public String getroleName() {
        return spec.getDetail(DataSourceSpec.ROLENAME);
    }

    /**
     * Sets the role name.
     *
     * @param        roleName        <code>String</code>
     * @see        <code>getRoleName</code>
     */
    public void setRoleName(String roleName) {
        spec.setDetail(DataSourceSpec.ROLENAME, roleName);
    }

    /**
     * Gets the role name.
     *
     * @return        roleName
     * @see        <code>setRoleName</code>
     */
    public String getRoleName() {
        return spec.getDetail(DataSourceSpec.ROLENAME);
    }


    /**
     * Sets the login timeout.
     *
     * @param        loginTimeOut        <code>String</code>
     * @see        <code>getLoginTimeOut</code>
     */
    public void setloginTimeOut(String loginTimeOut) {
        spec.setDetail(DataSourceSpec.LOGINTIMEOUT, loginTimeOut);
    }

    /**
     * Gets the login timeout.
     *
     * @return        loginTimeout
     * @see        <code>setLoginTimeOut</code>
     */
    public String getloginTimeOut() {
        return spec.getDetail(DataSourceSpec.LOGINTIMEOUT);
    }

    /**
     * Sets the login timeout.
     *
     * @param        loginTimeOut        <code>String</code>
     * @see        <code>getLoginTimeOut</code>
     */
    public void setLoginTimeOut(String loginTimeOut) {
        spec.setDetail(DataSourceSpec.LOGINTIMEOUT, loginTimeOut);
    }

    /**
     * Gets the login timeout.
     *
     * @return        loginTimeout
     * @see        <code>setLoginTimeOut</code>
     */
    public String getLoginTimeOut() {
        return spec.getDetail(DataSourceSpec.LOGINTIMEOUT);
    }

    /**
     * Sets the delimiter.
     *
     * @param        delim        <code>String</code>
     * @see        <code>getDelimiter</code>
     */
    public void setdelimiter(String delim) {
        spec.setDetail(DataSourceSpec.DELIMITER, delim);
    }

    /**
     * Gets the delimiter.
     *
     * @return        delim
     * @see        <code>setDelimiter</code>
     */
    public String getdelimiter() {
        return spec.getDetail(DataSourceSpec.DELIMITER);
    }

    /**
     * Sets the delimiter.
     *
     * @param        delim        <code>String</code>
     * @see        <code>getDelimiter</code>
     */
    public void setDelimiter(String delim) {
        spec.setDetail(DataSourceSpec.DELIMITER, delim);
    }

    /**
     * Gets the delimiter.
     *
     * @return        delim
     * @see        <code>setDelimiter</code>
     */
    public String getDelimiter() {
        return spec.getDetail(DataSourceSpec.DELIMITER);
    }

    /**
     * Sets the driver specific properties.
     *
     * @param        driverProps        <code>String</code>
     * @see        <code>getDriverProperties</code>
     */
    public void setdriverProperties(String driverProps) {
        spec.setDetail(DataSourceSpec.DRIVERPROPERTIES, driverProps);
    }

    /**
     * Gets the driver specific properties.
     *
     * @return        driverProps
     * @see        <code>setDriverProperties</code>
     */
    public String getdriverProperties() {
        return spec.getDetail(DataSourceSpec.DRIVERPROPERTIES);
    }

    /**
     * Sets the driver specific properties.
     *
     * @param        driverProps        <code>String</code>
     * @see        <code>getDriverProperties</code>
     */
    public void setDriverProperties(String driverProps) {
        spec.setDetail(DataSourceSpec.DRIVERPROPERTIES, driverProps);
    }

    /**
     * Gets the driver specific properties.
     *
     * @return        driverProps
     * @see        <code>setDriverProperties</code>
     */
    public String getDriverProperties() {
        return spec.getDetail(DataSourceSpec.DRIVERPROPERTIES);
    }

    /*
     * Check if the PasswordCredential passed for this get connection
     * request is equal to the user/passwd of this connection pool.
     */
    private boolean isEqual( PasswordCredential pc, String user,
        String password) {

        //if equal get direct connection else
        //get connection with user and password.

        if (user == null && pc == null) {
            return true;
        }

        if ( user == null && pc != null ) {
            return false;
        }

        if( pc == null ) {
            return true;
        }

        if ( user.equals( pc.getUserName() ) ) {
            if ( password == null && pc.getPassword() == null ) {
                return true;
            }
        }

        if ( user.equals(pc.getUserName()) && password.equals(pc.getPassword()) ) {
            return true;
        }


        return false;
    }
}
