001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.commons.dbcp.managed;
019
020 import org.apache.commons.pool.ObjectPool;
021 import org.apache.commons.dbcp.PoolingDataSource;
022
023 import java.sql.Connection;
024 import java.sql.SQLException;
025
026 /**
027 * The ManagedDataSource is a PoolingDataSource that creates ManagedConnections.
028 *
029 * @author Dain Sundstrom
030 * @version $Revision: 892307 $
031 */
032 public class ManagedDataSource extends PoolingDataSource {
033 private TransactionRegistry transactionRegistry;
034
035 /**
036 * Creates an uninitialized datasource. Before this data source can be used a pool and
037 * transaction registry must be set.
038 */
039 public ManagedDataSource() {
040 }
041
042 /**
043 * Creates a ManagedDataSource which obtains connections from the specified pool and
044 * manages them using the specified transaction registry. The TransactionRegistry must
045 * be the transaction registry obtained from the XAConnectionFactory used to create
046 * the connection pool. If not an error will occure when attempting to use the connection
047 * in a global transaction because the XAResource object associated with the connection
048 * will be unavailable.
049 *
050 * @param pool the connection pool
051 * @param transactionRegistry the transaction registry obtained from the
052 * XAConnectionFactory used to create the connection pool object factory
053 */
054 public ManagedDataSource(ObjectPool pool, TransactionRegistry transactionRegistry) {
055 super(pool);
056 this.transactionRegistry = transactionRegistry;
057 }
058
059 /**
060 * Sets the transaction registry from the XAConnectionFactory used to create the pool.
061 * The transaction registry can only be set once using either a connector or this setter
062 * method.
063 * @param transactionRegistry the transaction registry acquired from the XAConnectionFactory
064 * used to create the pool
065 */
066 public void setTransactionRegistry(TransactionRegistry transactionRegistry) {
067 if(this.transactionRegistry != null) throw new IllegalStateException("TransactionRegistry already set");
068 if(transactionRegistry == null) throw new NullPointerException("TransactionRegistry is null");
069
070 this.transactionRegistry = transactionRegistry;
071 }
072
073 public Connection getConnection() throws SQLException {
074 if (_pool == null) throw new IllegalStateException("Pool has not been set");
075 if (transactionRegistry == null) throw new IllegalStateException("TransactionRegistry has not been set");
076
077 Connection connection = new ManagedConnection(_pool, transactionRegistry, isAccessToUnderlyingConnectionAllowed());
078 return connection;
079 }
080 }