1 /*
2 * Copyright 2007 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.core.database;
17
18 import java.sql.Connection;
19
20 import org.apache.ojb.broker.accesslayer.LookupException;
21 import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
22 import org.apache.ojb.broker.util.pooling.ByPassConnection;
23 import org.springmodules.orm.ojb.support.LocalDataSourceConnectionFactory;
24
25 /**
26 * <p>A subclass of the standard Spring LocalDataSourceConnectionFactory (that supplies
27 * OJB with connections to datasource defined in Spring) that wraps the connection in a
28 * ByPassConnection so that the JTA defined in the managed environment can control the
29 * transaction.</p>
30 * <p>This class works in concert with the following parameter in the corresponding OJB properties
31 * config:</p>
32 * <blockquote>
33 * <code>
34 * ConnectionFactoryClass=org.kuali.rice.core.database.SpringConnectionFactoryManagedImpl
35 * </code>
36 * </blockquote>
37 * Apparently this strategy is not required in OJB 1.0.4:
38 * http://db.apache.org/ojb/release-notes.txt
39 * <blockquote>
40 * "ConnectionFactoryManagedImpl is declared deprecated. Now OJB automatic detect the
41 * running JTA-transaction and suppress critical method calls on the used connection"
42 * </blockquote>
43 * <br/>
44 * Details:
45 * <blockquote>This is to overcome a shortcoming in Spring/OJB that in 1.03 you can't
46 * run in a managed environment with Spring and OJB if Spring is giving OJB its Connections
47 * through it's LocalDataSourceConnectionFactory (which doesn't wrap the connection in a bypass
48 * connection). This is suppressing commits - so that JTA can do it.
49 * If one uses JNDI to grab the DS this wouldn't be necessary because both
50 * Spring and OJB would grab the DS from there and we'd be cool.
51 * The ByPassConnection is a class that comes with OJB which essentially turns calls
52 * to commit, rollback, etc. into NO-OPS. The reason it does this is because, in a
53 * managed environment these methods are invoked on the individual connections by
54 * the transaction manager and if you call the explicitly from the code they will
55 * typically throw an exception (depending on the JTA implementation).
56 * </blockquote>
57 * (what about TransactionAwareDataSourceConnectionFactory mentioned in Spring docs?)
58 */
59 public class SpringConnectionFactoryManagedImpl extends LocalDataSourceConnectionFactory {
60
61 public Connection lookupConnection(JdbcConnectionDescriptor jcd) throws LookupException {
62 return new ByPassConnection(super.lookupConnection(jcd));
63 }
64
65 protected Connection newConnectionFromDriverManager(JdbcConnectionDescriptor arg0) throws LookupException {
66 throw new UnsupportedOperationException("Not supported in managed environment");
67 }
68 }