View Javadoc

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  }