001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.dbcp2;
018
019import java.sql.Connection;
020import java.sql.SQLException;
021
022import javax.sql.DataSource;
023
024/**
025 * A {@link DataSource}-based implementation of {@link ConnectionFactory}.
026 *
027 * @since 2.0
028 */
029public class DataSourceConnectionFactory implements ConnectionFactory {
030
031    private final DataSource dataSource;
032
033    private final String userName;
034
035    private final char[] userPassword;
036
037    /**
038     * Constructs an instance for the given DataSource.
039     *
040     * @param dataSource
041     *            The DataSource for this factory.
042     */
043    public DataSourceConnectionFactory(final DataSource dataSource) {
044        this(dataSource, null, (char[]) null);
045    }
046
047    /**
048     * Constructs an instance for the given DataSource.
049     *
050     * @param dataSource
051     *            The DataSource for this factory.
052     * @param userName
053     *            The user name.
054     * @param userPassword
055     *            The user password.
056     * @since 2.4.0
057     */
058    public DataSourceConnectionFactory(final DataSource dataSource, final String userName, final char[] userPassword) {
059        this.dataSource = dataSource;
060        this.userName = userName;
061        this.userPassword = Utils.clone(userPassword);
062    }
063
064    /**
065     * Constructs an instance for the given DataSource.
066     *
067     * @param dataSource
068     *            The DataSource for this factory.
069     * @param userName
070     *            The user name.
071     * @param password
072     *            The user password.
073     */
074    public DataSourceConnectionFactory(final DataSource dataSource, final String userName, final String password) {
075        this.dataSource = dataSource;
076        this.userName = userName;
077        this.userPassword = Utils.toCharArray(password);
078    }
079
080    @Override
081    public Connection createConnection() throws SQLException {
082        if (null == userName && null == userPassword) {
083            return dataSource.getConnection();
084        }
085        return dataSource.getConnection(userName, Utils.toString(userPassword));
086    }
087
088    /**
089     * @return The data source.
090     * @since 2.6.0
091     */
092    public DataSource getDataSource() {
093        return dataSource;
094    }
095
096    /**
097     * @return The user name.
098     * @since 2.6.0
099     */
100    public String getUserName() {
101        return userName;
102    }
103
104    /**
105     * @return The user password.
106     * @since 2.6.0
107     */
108    public char[] getUserPassword() {
109        return userPassword == null ? null : userPassword.clone();
110    }
111}