/*******************************************************************************
 * Copyright (c) 1998, 2008 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.internal.eis.adapters.aq;

import javax.resource.cci.*;

/**
 * Provides the behavior of instantiating a XML file adapter ConnectionSpec.
 *
 * @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;
        }
    }

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