/*
 * Copyright (c) 1998, 2020 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,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.eis.adapters.aq;

import jakarta.resource.cci.*;

/**
 * Connection spec for AQ JCA adapter.
 *
 * @author James
 * @since OracleAS TopLink 10<i>g</i> (10.0.3)
 */
public class AQConnectionSpec implements ConnectionSpec {

    /** AQ database user name. */
    protected String user;

    /** AQ database user password. */
    protected char[] password;

    /** Database JDBC URL. */
    protected String url;

    /** DataSource JNDI name. */
    protected String datasource;

    /**
     * PUBLIC:
     * Default constructor.
     */
    public AQConnectionSpec() {
        this.user = "";
        this.password = new char[0];
        this.url = "jdbc:oracle:thin@localhost:1521:orcl";
        this.datasource = "";
    }

    /**
     * PUBLIC:
     * Construct the spec with the default directory.
     */
    public AQConnectionSpec(String user, String password, String url) {
        this.user = user;
        setPassword(password);
        this.url = url;
    }

    /**
     * PUBLIC:
     * Return the JDBC url.
     */
    public String getURL() {
        return url;
    }

    /**
     * PUBLIC:
     * Set the JDBC url.
     */
    public void setURL(String url) {
        this.url = url;
    }

    /**
     * PUBLIC:
     * Return the DataSource JNDI name.
     */
    public String getDatasource() {
        return datasource;
    }

    /**
     * PUBLIC:
     * Set the DataSource JNDI name.
     */
    public void setDatasource(String datasource) {
        this.datasource = datasource;
    }

    /**
     * PUBLIC:
     * Return the database user name.
     */
    public String getUser() {
        return user;
    }

    /**
     * PUBLIC:
     * Set the database user name.
     */
    public void setUser(String user) {
        this.user = user;
    }

    /**
     * PUBLIC:
     * Return the database user password.
     */
    public String getPassword() {
        // Bug 4117441 - Secure programming practices, store password in char[]
        if (this.password != null) {
            return new String(this.password);
        } else {
            return null;
        }
    }

    /**
     * PUBLIC:
     * Return if a datasource is used.
     */
    public boolean hasDatasource() {
        return (datasource != null) && (datasource.length() > 0);
    }

    /**
     * PUBLIC:
     * Set the database user password.
     */
    public void setPassword(String password) {
        // Bug 4117441 - Secure programming practices, store password in char[]
        if (password != null) {
            this.password = password.toCharArray();
        } else {
            // respect explicit de-referencing of password
            this.password = null;
        }
    }

    @Override
    public String toString() {
        return "AQConnectionSpec(" + getURL() + ")";
    }
}
