1 /**
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one or more
4 * contributor license agreements. See the NOTICE file distributed with
5 * this work for additional information regarding copyright ownership.
6 * The ASF licenses this file to You under the Apache License, Version 2.0
7 * (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.commons.dbcp.managed;
19
20 import javax.sql.XAConnection;
21 import javax.sql.XADataSource;
22 import javax.transaction.TransactionManager;
23 import javax.transaction.xa.XAResource;
24 import java.sql.Connection;
25 import java.sql.SQLException;
26
27 /**
28 * An implementation of XAConnectionFactory which uses a real XADataSource to obtain connections and XAResources.
29 *
30 * @author Dain Sundstrom
31 * @version $Revision$
32 */
33 public class DataSourceXAConnectionFactory implements XAConnectionFactory {
34 protected TransactionRegistry transactionRegistry;
35 protected XADataSource xaDataSource;
36 protected String username;
37 protected String password;
38
39 /**
40 * Creates an DataSourceXAConnectionFactory which uses the specified XADataSource to create database
41 * connections. The connections are enlisted into transactions using the specified transaction manager.
42 *
43 * @param transactionManager the transaction manager in which connections will be enlisted
44 * @param xaDataSource the data source from which connections will be retrieved
45 */
46 public DataSourceXAConnectionFactory(TransactionManager transactionManager, XADataSource xaDataSource) {
47 this(transactionManager, xaDataSource, null, null);
48 }
49
50 /**
51 * Creates an DataSourceXAConnectionFactory which uses the specified XADataSource to create database
52 * connections. The connections are enlisted into transactions using the specified transaction manager.
53 *
54 * @param transactionManager the transaction manager in which connections will be enlisted
55 * @param xaDataSource the data source from which connections will be retrieved
56 * @param username the username used for authenticating new connections or null for unauthenticated
57 * @param password the password used for authenticating new connections
58 */
59 public DataSourceXAConnectionFactory(TransactionManager transactionManager, XADataSource xaDataSource, String username, String password) {
60 if (transactionManager == null) throw new NullPointerException("transactionManager is null");
61 if (xaDataSource == null) throw new NullPointerException("xaDataSource is null");
62
63 this.transactionRegistry = new TransactionRegistry(transactionManager);
64 this.xaDataSource = xaDataSource;
65 this.username = username;
66 this.password = password;
67 }
68
69 /**
70 * Gets the username used to authenticate new connections.
71 * @return the user name or null if unauthenticated connections are used
72 */
73 public String getUsername() {
74 return username;
75 }
76
77 /**
78 * Sets the username used to authenticate new connections.
79 * @param username the username used for authenticating the connection or null for unauthenticated
80 */
81 public void setUsername(String username) {
82 this.username = username;
83 }
84
85 /**
86 * Sets the password used to authenticate new connections.
87 * @param password the password used for authenticating the connection or null for unauthenticated
88 */
89 public void setPassword(String password) {
90 this.password = password;
91 }
92
93 public TransactionRegistry getTransactionRegistry() {
94 return transactionRegistry;
95 }
96
97 public Connection createConnection() throws SQLException {
98 // create a new XAConection
99 XAConnection xaConnection;
100 if (username == null) {
101 xaConnection = xaDataSource.getXAConnection();
102 } else {
103 xaConnection = xaDataSource.getXAConnection(username, password);
104 }
105
106 // get the real connection and XAResource from the connection
107 Connection connection = xaConnection.getConnection();
108 XAResource xaResource = xaConnection.getXAResource();
109
110 // register the xa resource for the connection
111 transactionRegistry.registerConnection(connection, xaResource);
112
113 return connection;
114 }
115 }