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 * https://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 * Gets the data source.. 090 * 091 * @return The data source. 092 * @since 2.6.0 093 */ 094 public DataSource getDataSource() { 095 return dataSource; 096 } 097 098 /** 099 * Gets the user name, may be null. 100 * 101 * @return The user name, may be null. 102 * @since 2.6.0 103 */ 104 public String getUserName() { 105 return userName; 106 } 107 108 /** 109 * Gets the user password, may be null. 110 * 111 * @return The user password, may be null. 112 * @since 2.6.0 113 */ 114 public char[] getUserPassword() { 115 return Utils.clone(userPassword); 116 } 117}