01: /*
02: * Copyright 2007 The Kuali Foundation
03: *
04: * Licensed under the Educational Community License, Version 1.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.opensource.org/licenses/ecl1.php
09: *
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.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.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
60: LocalDataSourceConnectionFactory {
61:
62: public Connection lookupConnection(JdbcConnectionDescriptor jcd)
63: throws LookupException {
64: return new ByPassConnection(super .lookupConnection(jcd));
65: }
66:
67: protected Connection newConnectionFromDriverManager(
68: JdbcConnectionDescriptor arg0) throws LookupException {
69: throw new UnsupportedOperationException(
70: "Not supported in managed environment");
71: }
72: }
|