OPENJPA-295

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@562530 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Dick 2007-08-03 17:35:54 +00:00
parent 60d4f7cd70
commit 4150e7f566
11 changed files with 97 additions and 18 deletions

View File

@ -0,0 +1,41 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openjpa.ee;
import javax.transaction.SystemException;
/*
* AbstractManagedRuntime.java
*
* Created on August 2, 2007, 2:38 PM
*
*/
public abstract class AbstractManagedRuntime implements ManagedRuntime {
/**
* Returns a transaction key that can be used to associate transactions
* and Brokers.
* The default implementation returns the Transaction associated
* with the current thread's transaction.
* @return the transaction key
*/
public Object getTransactionKey() throws Exception, SystemException {
return getTransactionManager().getTransaction();
}
}

View File

@ -20,6 +20,8 @@ package org.apache.openjpa.ee;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager; import javax.transaction.TransactionManager;
import org.apache.openjpa.lib.conf.Configurable; import org.apache.openjpa.lib.conf.Configurable;
@ -47,7 +49,7 @@ import org.apache.openjpa.util.InvalidStateException;
* *
* @author Marc Prud'hommeaux * @author Marc Prud'hommeaux
*/ */
public class AutomaticManagedRuntime public class AutomaticManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime, Configurable { implements ManagedRuntime, Configurable {
private static final String [] JNDI_LOCS = new String []{ private static final String [] JNDI_LOCS = new String []{
@ -244,4 +246,14 @@ public class AutomaticManagedRuntime
return null; return null;
} }
public Object getTransactionKey() throws Exception, SystemException {
if(_runtime == null)
getTransactionManager();
if(_runtime != null )
return _runtime.getTransactionKey();
return null;
}
} }

View File

@ -34,7 +34,7 @@ import org.apache.openjpa.lib.conf.Configuration;
* *
* @author Marc Prud'hommeaux * @author Marc Prud'hommeaux
*/ */
public class InvocationManagedRuntime public class InvocationManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime, Configurable { implements ManagedRuntime, Configurable {
private String _methodName = null; private String _methodName = null;

View File

@ -28,7 +28,7 @@ import javax.transaction.TransactionManager;
* *
* @author Abe White * @author Abe White
*/ */
public class JNDIManagedRuntime public class JNDIManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime { implements ManagedRuntime {
private String _tmLoc = "java:/TransactionManager"; private String _tmLoc = "java:/TransactionManager";

View File

@ -18,6 +18,7 @@
*/ */
package org.apache.openjpa.ee; package org.apache.openjpa.ee;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager; import javax.transaction.TransactionManager;
/** /**
@ -56,4 +57,13 @@ public interface ManagedRuntime {
*/ */
public Throwable getRollbackCause() public Throwable getRollbackCause()
throws Exception; throws Exception;
/**
* Returns a transaction key that can be used to associate transactions
* and Brokers.
* @return the transaction key
*/
public Object getTransactionKey()
throws Exception, SystemException;
} }

View File

@ -45,7 +45,7 @@ public class RegistryManagedRuntime
private String _registryName = private String _registryName =
"java:comp/TransactionSynchronizationRegistry"; "java:comp/TransactionSynchronizationRegistry";
private TransactionManager _tm = null; private TransactionManagerRegistryFacade _tm = null;
/** /**
* Return the cached TransactionManager instance. * Return the cached TransactionManager instance.
@ -84,6 +84,10 @@ public class RegistryManagedRuntime
return _registryName; return _registryName;
} }
public Object getTransactionKey() throws Exception, SystemException {
return _tm.getTransactionKey();
}
/** /**
* A {@link TransactionManager} and {@link Transaction} facade * A {@link TransactionManager} and {@link Transaction} facade
* that delegates the appropriate methods to the internally-held * that delegates the appropriate methods to the internally-held
@ -126,6 +130,10 @@ public class RegistryManagedRuntime
return _registry.getTransactionStatus(); return _registry.getTransactionStatus();
} }
public Object getTransactionKey() {
return _registry.getTransactionKey();
}
////////////////////////////// //////////////////////////////
// Unsupported methods follow // Unsupported methods follow
////////////////////////////// //////////////////////////////

View File

@ -26,7 +26,7 @@ import javax.transaction.TransactionManager;
* *
* @author Marc Prud'hommeaux * @author Marc Prud'hommeaux
*/ */
public class SunOneManagedRuntime public class SunOneManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime { implements ManagedRuntime {
private Method _switchMeth; private Method _switchMeth;

View File

@ -59,9 +59,10 @@ import serp.bytecode.Project;
* WASManagedRuntime provides the wrapper classes needed to interact with the * WASManagedRuntime provides the wrapper classes needed to interact with the
* WAS proprietary interface and the OpenJPA kernel. * WAS proprietary interface and the OpenJPA kernel.
* *
* @author Michael Dick, Kevin Sutter * @author Kevin Sutter
*/ */
public class WASManagedRuntime implements ManagedRuntime, Configurable { public class WASManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime, Configurable {
private static final Localizer _loc = private static final Localizer _loc =
Localizer.forPackage(WASManagedRuntime.class); Localizer.forPackage(WASManagedRuntime.class);

View File

@ -28,7 +28,7 @@ import javax.transaction.TransactionManager;
* *
* @author Arunabh Hazarika, Patrick Linskey * @author Arunabh Hazarika, Patrick Linskey
*/ */
public class WLSManagedRuntime public class WLSManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime { implements ManagedRuntime {
private final Method _txHelperMeth; private final Method _txHelperMeth;

View File

@ -38,6 +38,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.conf.OpenJPAConfiguration; import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.conf.OpenJPAVersion; import org.apache.openjpa.conf.OpenJPAVersion;
import org.apache.openjpa.datacache.DataCacheStoreManager; import org.apache.openjpa.datacache.DataCacheStoreManager;
import org.apache.openjpa.ee.ManagedRuntime;
import org.apache.openjpa.enhance.PCRegistry; import org.apache.openjpa.enhance.PCRegistry;
import org.apache.openjpa.enhance.PersistenceCapable; import org.apache.openjpa.enhance.PersistenceCapable;
import org.apache.openjpa.event.RemoteCommitEventManager; import org.apache.openjpa.event.RemoteCommitEventManager;
@ -526,9 +527,12 @@ public abstract class AbstractBrokerFactory
*/ */
protected BrokerImpl findTransactionalBroker(String user, String pass) { protected BrokerImpl findTransactionalBroker(String user, String pass) {
Transaction trans; Transaction trans;
ManagedRuntime mr = _conf.getManagedRuntimeInstance();
Object txKey;
try { try {
trans = _conf.getManagedRuntimeInstance().getTransactionManager(). trans = mr.getTransactionManager().
getTransaction(); getTransaction();
txKey = mr.getTransactionKey();
if (trans == null if (trans == null
|| trans.getStatus() == Status.STATUS_NO_TRANSACTION || trans.getStatus() == Status.STATUS_NO_TRANSACTION
@ -540,7 +544,7 @@ public abstract class AbstractBrokerFactory
throw new GeneralException(e); throw new GeneralException(e);
} }
Collection brokers = (Collection) _transactional.get(trans); Collection brokers = (Collection) _transactional.get(txKey);
if (brokers != null) { if (brokers != null) {
// we don't need to synchronize on brokers since one JTA transaction // we don't need to synchronize on brokers since one JTA transaction
// can never be active on multiple concurrent threads. // can never be active on multiple concurrent threads.
@ -703,8 +707,8 @@ public abstract class AbstractBrokerFactory
boolean syncWithManagedTransaction(BrokerImpl broker, boolean begin) { boolean syncWithManagedTransaction(BrokerImpl broker, boolean begin) {
Transaction trans; Transaction trans;
try { try {
TransactionManager tm = broker.getManagedRuntime(). ManagedRuntime mr = broker.getManagedRuntime();
getTransactionManager(); TransactionManager tm = mr.getTransactionManager();
trans = tm.getTransaction(); trans = tm.getTransaction();
if (trans != null if (trans != null
&& (trans.getStatus() == Status.STATUS_NO_TRANSACTION && (trans.getStatus() == Status.STATUS_NO_TRANSACTION
@ -723,11 +727,13 @@ public abstract class AbstractBrokerFactory
// we don't need to synchronize on brokers or guard against multiple // we don't need to synchronize on brokers or guard against multiple
// threads using the same trans since one JTA transaction can never // threads using the same trans since one JTA transaction can never
// be active on multiple concurrent threads. // be active on multiple concurrent threads.
Collection brokers = (Collection) _transactional.get(trans); Object txKey = mr.getTransactionKey();
Collection brokers = (Collection) _transactional.get(txKey);
if (brokers == null) { if (brokers == null) {
brokers = new ArrayList(2); brokers = new ArrayList(2);
_transactional.put(trans, brokers); _transactional.put(txKey, brokers);
trans.registerSynchronization(new RemoveTransactionSync(trans)); trans.registerSynchronization(new RemoveTransactionSync(txKey));
} }
brokers.add(broker); brokers.add(broker);
@ -754,9 +760,9 @@ public abstract class AbstractBrokerFactory
private class RemoveTransactionSync private class RemoveTransactionSync
implements Synchronization { implements Synchronization {
private final Transaction _trans; private final Object _trans;
public RemoveTransactionSync(Transaction trans) { public RemoveTransactionSync(Object trans) {
_trans = trans; _trans = trans;
} }

View File

@ -26,6 +26,7 @@ import javax.transaction.Transaction;
import javax.transaction.TransactionManager; import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource; import javax.transaction.xa.XAResource;
import org.apache.openjpa.ee.AbstractManagedRuntime;
import org.apache.openjpa.ee.ManagedRuntime; import org.apache.openjpa.ee.ManagedRuntime;
import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.InternalException; import org.apache.openjpa.util.InternalException;
@ -40,7 +41,7 @@ import org.apache.openjpa.util.UserException;
* *
* @author Abe White * @author Abe White
*/ */
class LocalManagedRuntime class LocalManagedRuntime extends AbstractManagedRuntime
implements ManagedRuntime, TransactionManager, Transaction { implements ManagedRuntime, TransactionManager, Transaction {
private static final Localizer _loc = Localizer.forPackage private static final Localizer _loc = Localizer.forPackage