commit 6cd0529f68f63018b57ca510d2d4b4f111e0432e Author: Juan Hernandez <juan.hernandez@redhat.com> Date: Sun Mar 4 00:39:21 2012 +0100 Remove dependency on WebSphere UOW diff --git a/org.springframework.integration-tests/pom.xml b/org.springframework.integration-tests/pom.xml index b7f58fe..9190c19 100644 --- a/org.springframework.integration-tests/pom.xml +++ b/org.springframework.integration-tests/pom.xml @@ -28,12 +28,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>com.ibm.websphere</groupId> - <artifactId>com.ibm.websphere.uow</artifactId> - <version>6.0.2.17</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>com.opensymphony.quartz</groupId> <artifactId>org.quartz</artifactId> <version>1.6.2</version> diff --git a/org.springframework.transaction/pom.xml b/org.springframework.transaction/pom.xml index d83b65f..db2acfc 100644 --- a/org.springframework.transaction/pom.xml +++ b/org.springframework.transaction/pom.xml @@ -22,14 +22,6 @@ </licenses> <dependencies> <dependency> - <groupId>com.ibm.websphere</groupId> - <artifactId>com.springsource.com.ibm.websphere.uow</artifactId> - <version>6.0.2.17</version> - <type>jar</type> - <scope>provided</scope> - <optional>true</optional> - </dependency> - <dependency> <groupId>javax.ejb</groupId> <artifactId>com.springsource.javax.ejb</artifactId> <version>3.0.0</version> diff --git a/org.springframework.transaction/src/main/java/org/springframework/transaction/jta/WebSphereUowTransactionManager.java b/org.springframework.transaction/src/main/java/org/springframework/transaction/jta/WebSphereUowTransactionManager.java deleted file mode 100644 index e2349a4..0000000 --- a/org.springframework.transaction/src/main/java/org/springframework/transaction/jta/WebSphereUowTransactionManager.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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.springframework.transaction.jta; - -import java.util.List; -import javax.naming.NamingException; - -import com.ibm.websphere.uow.UOWSynchronizationRegistry; -import com.ibm.wsspi.uow.UOWAction; -import com.ibm.wsspi.uow.UOWActionException; -import com.ibm.wsspi.uow.UOWException; -import com.ibm.wsspi.uow.UOWManager; -import com.ibm.wsspi.uow.UOWManagerFactory; - -import org.springframework.transaction.IllegalTransactionStateException; -import org.springframework.transaction.InvalidTimeoutException; -import org.springframework.transaction.NestedTransactionNotSupportedException; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionException; -import org.springframework.transaction.TransactionSystemException; -import org.springframework.transaction.support.CallbackPreferringPlatformTransactionManager; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.transaction.support.DefaultTransactionStatus; -import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; -import org.springframework.util.ReflectionUtils; - -/** - * WebSphere-specific PlatformTransactionManager implementation that delegates - * to a {@link com.ibm.wsspi.uow.UOWManager} instance, obtained from WebSphere's - * JNDI environment. This allows Spring to leverage the full power of the WebSphere - * transaction coordinator, including transaction suspension, in a manner that is - * perfectly compliant with officially supported WebSphere API. - * - * <p>The {@link CallbackPreferringPlatformTransactionManager} interface - * implemented by this class indicates that callers should preferably pass in - * a {@link TransactionCallback} through the {@link #execute} method, which - * will be handled through the callback-based WebSphere UOWManager API instead - * of through standard JTA API (UserTransaction / TransactionManager). This avoids - * the use of the non-public <code>javax.transaction.TransactionManager</code> - * API on WebSphere, staying within supported WebSphere API boundaries. - * - * <p>This transaction manager implementation derives from Spring's standard - * {@link JtaTransactionManager}, inheriting the capability to support programmatic - * transaction demarcation via <code>getTransaction</code> / <code>commit</code> / - * <code>rollback</code> calls through a JTA UserTransaction handle, for callers - * that do not use the TransactionCallback-based {@link #execute} method. However, - * transaction suspension is <i>not</i> supported in this <code>getTransaction</code> - * style (unless you explicitly specify a {@link #setTransactionManager} reference, - * despite the official WebSphere recommendations). Use the {@link #execute} style - * for any code that might require transaction suspension. - * - * <p>This transaction manager is compatible with WebSphere 6.1.0.9 and above. - * The default JNDI location for the UOWManager is "java:comp/websphere/UOWManager". - * If the location happens to differ according to your WebSphere documentation, - * simply specify the actual location through this transaction manager's - * "uowManagerName" bean property. - * - * @author Juergen Hoeller - * @since 2.5 - * @see #setUowManager - * @see #setUowManagerName - * @see com.ibm.wsspi.uow.UOWManager - */ -public class WebSphereUowTransactionManager extends JtaTransactionManager - implements CallbackPreferringPlatformTransactionManager { - - /** - * Default JNDI location for the WebSphere UOWManager. - * @see #setUowManagerName - */ - public static final String DEFAULT_UOW_MANAGER_NAME = "java:comp/websphere/UOWManager"; - - - private UOWManager uowManager; - - private String uowManagerName; - - - /** - * Create a new WebSphereUowTransactionManager. - */ - public WebSphereUowTransactionManager() { - setAutodetectTransactionManager(false); - } - - /** - * Create a new WebSphereUowTransactionManager for the given UOWManager. - * @param uowManager the WebSphere UOWManager to use as direct reference - */ - public WebSphereUowTransactionManager(UOWManager uowManager) { - this(); - this.uowManager = uowManager; - } - - - /** - * Set the WebSphere UOWManager to use as direct reference. - * <p>Typically just used for test setups; in a J2EE environment, - * the UOWManager will always be fetched from JNDI. - * @see #setUserTransactionName - */ - public void setUowManager(UOWManager uowManager) { - this.uowManager = uowManager; - } - - /** - * Set the JNDI name of the WebSphere UOWManager. - * The default "java:comp/websphere/UOWManager" is used if not set. - * @see #DEFAULT_USER_TRANSACTION_NAME - * @see #setUowManager - */ - public void setUowManagerName(String uowManagerName) { - this.uowManagerName = uowManagerName; - } - - - @Override - public void afterPropertiesSet() throws TransactionSystemException { - initUserTransactionAndTransactionManager(); - - // Fetch UOWManager handle from JNDI, if necessary. - if (this.uowManager == null) { - if (this.uowManagerName != null) { - this.uowManager = lookupUowManager(this.uowManagerName); - } - else { - this.uowManager = lookupDefaultUowManager(); - } - } - } - - /** - * Look up the WebSphere UOWManager in JNDI via the configured name. - * @param uowManagerName the JNDI name of the UOWManager - * @return the UOWManager object - * @throws TransactionSystemException if the JNDI lookup failed - * @see #setJndiTemplate - * @see #setUowManagerName - */ - protected UOWManager lookupUowManager(String uowManagerName) throws TransactionSystemException { - try { - if (logger.isDebugEnabled()) { - logger.debug("Retrieving WebSphere UOWManager from JNDI location [" + uowManagerName + "]"); - } - return getJndiTemplate().lookup(uowManagerName, UOWManager.class); - } - catch (NamingException ex) { - throw new TransactionSystemException( - "WebSphere UOWManager is not available at JNDI location [" + uowManagerName + "]", ex); - } - } - - /** - * Obtain the WebSphere UOWManager from the default JNDI location - * "java:comp/websphere/UOWManager". - * @return the UOWManager object - * @throws TransactionSystemException if the JNDI lookup failed - * @see #setJndiTemplate - */ - protected UOWManager lookupDefaultUowManager() throws TransactionSystemException { - try { - logger.debug("Retrieving WebSphere UOWManager from default JNDI location [" + DEFAULT_UOW_MANAGER_NAME + "]"); - return getJndiTemplate().lookup(DEFAULT_UOW_MANAGER_NAME, UOWManager.class); - } - catch (NamingException ex) { - logger.debug("WebSphere UOWManager is not available at default JNDI location [" + - DEFAULT_UOW_MANAGER_NAME + "] - falling back to UOWManagerFactory lookup"); - return UOWManagerFactory.getUOWManager(); - } - } - - /** - * Registers the synchronizations as interposed JTA Synchronization on the UOWManager. - */ - @Override - protected void doRegisterAfterCompletionWithJtaTransaction( - JtaTransactionObject txObject, List<TransactionSynchronization> synchronizations) { - - this.uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations)); - } - - /** - * Returns <code>true</code> since WebSphere ResourceAdapters (as exposed in JNDI) - * implicitly perform transaction enlistment if the MessageEndpointFactory's - * <code>isDeliveryTransacted</code> method returns <code>true</code>. - * In that case we'll simply skip the {@link #createTransaction} call. - * @see javax.resource.spi.endpoint.MessageEndpointFactory#isDeliveryTransacted - * @see org.springframework.jca.endpoint.AbstractMessageEndpointFactory - * @see TransactionFactory#createTransaction - */ - @Override - public boolean supportsResourceAdapterManagedTransactions() { - return true; - } - - - public <T> T execute(TransactionDefinition definition, TransactionCallback<T> callback) throws TransactionException { - if (definition == null) { - // Use defaults if no transaction definition given. - definition = new DefaultTransactionDefinition(); - } - - if (definition.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) { - throw new InvalidTimeoutException("Invalid transaction timeout", definition.getTimeout()); - } - int pb = definition.getPropagationBehavior(); - boolean existingTx = (this.uowManager.getUOWStatus() != UOWSynchronizationRegistry.UOW_STATUS_NONE && - this.uowManager.getUOWType() != UOWSynchronizationRegistry.UOW_TYPE_LOCAL_TRANSACTION); - - int uowType = UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION; - boolean joinTx = false; - boolean newSynch = false; - - if (existingTx) { - if (pb == TransactionDefinition.PROPAGATION_NEVER) { - throw new IllegalTransactionStateException( - "Transaction propagation 'never' but existing transaction found"); - } - if (pb == TransactionDefinition.PROPAGATION_NESTED) { - throw new NestedTransactionNotSupportedException( - "Transaction propagation 'nested' not supported for WebSphere UOW transactions"); - } - if (pb == TransactionDefinition.PROPAGATION_SUPPORTS || - pb == TransactionDefinition.PROPAGATION_REQUIRED || pb == TransactionDefinition.PROPAGATION_MANDATORY) { - joinTx = true; - newSynch = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - } - else if (pb == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) { - uowType = UOWSynchronizationRegistry.UOW_TYPE_LOCAL_TRANSACTION; - newSynch = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS); - } - else { - newSynch = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - } - } - else { - if (pb == TransactionDefinition.PROPAGATION_MANDATORY) { - throw new IllegalTransactionStateException( - "Transaction propagation 'mandatory' but no existing transaction found"); - } - if (pb == TransactionDefinition.PROPAGATION_SUPPORTS || - pb == TransactionDefinition.PROPAGATION_NOT_SUPPORTED || pb == TransactionDefinition.PROPAGATION_NEVER) { - uowType = UOWSynchronizationRegistry.UOW_TYPE_LOCAL_TRANSACTION; - newSynch = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS); - } - else { - newSynch = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER); - } - } - - boolean debug = logger.isDebugEnabled(); - if (debug) { - logger.debug("Creating new transaction with name [" + definition.getName() + "]: " + definition); - } - SuspendedResourcesHolder suspendedResources = (!joinTx ? suspend(null) : null); - try { - if (definition.getTimeout() > TransactionDefinition.TIMEOUT_DEFAULT) { - this.uowManager.setUOWTimeout(uowType, definition.getTimeout()); - } - if (debug) { - logger.debug("Invoking WebSphere UOW action: type=" + uowType + ", join=" + joinTx); - } - UOWActionAdapter<T> action = new UOWActionAdapter<T>( - definition, callback, (uowType == UOWManager.UOW_TYPE_GLOBAL_TRANSACTION), !joinTx, newSynch, debug); - this.uowManager.runUnderUOW(uowType, joinTx, action); - if (debug) { - logger.debug("Returned from WebSphere UOW action: type=" + uowType + ", join=" + joinTx); - } - return action.getResult(); - } - catch (UOWException ex) { - throw new TransactionSystemException("UOWManager transaction processing failed", ex); - } - catch (UOWActionException ex) { - throw new TransactionSystemException("UOWManager threw unexpected UOWActionException", ex); - } - finally { - if (suspendedResources != null) { - resume(null, suspendedResources); - } - } - } - - - /** - * Adapter that executes the given Spring transaction within the WebSphere UOWAction shape. - */ - private class UOWActionAdapter<T> implements UOWAction { - - private final TransactionDefinition definition; - - private final TransactionCallback<T> callback; - - private final boolean actualTransaction; - - private final boolean newTransaction; - - private final boolean newSynchronization; - - private boolean debug; - - private T result; - - private Throwable exception; - - public UOWActionAdapter(TransactionDefinition definition, TransactionCallback<T> callback, - boolean actualTransaction, boolean newTransaction, boolean newSynchronization, boolean debug) { - this.definition = definition; - this.callback = callback; - this.actualTransaction = actualTransaction; - this.newTransaction = newTransaction; - this.newSynchronization = newSynchronization; - this.debug = debug; - } - - public void run() { - DefaultTransactionStatus status = prepareTransactionStatus( - this.definition, (this.actualTransaction ? this : null), - this.newTransaction, this.newSynchronization, this.debug, null); - try { - this.result = this.callback.doInTransaction(status); - triggerBeforeCommit(status); - } - catch (Throwable ex) { - this.exception = ex; - uowManager.setRollbackOnly(); - } - finally { - if (status.isLocalRollbackOnly()) { - if (status.isDebug()) { - logger.debug("Transactional code has requested rollback"); - } - uowManager.setRollbackOnly(); - } - triggerBeforeCompletion(status); - if (status.isNewSynchronization()) { - List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations(); - TransactionSynchronizationManager.clear(); - if (!synchronizations.isEmpty()) { - uowManager.registerInterposedSynchronization(new JtaAfterCompletionSynchronization(synchronizations)); - } - } - } - } - - public T getResult() { - if (this.exception != null) { - ReflectionUtils.rethrowRuntimeException(this.exception); - } - return this.result; - } - } - -} diff --git a/org.springframework.transaction/src/test/java/org/springframework/transaction/jta/WebSphereUowTransactionManagerTests.java b/org.springframework.transaction/src/test/java/org/springframework/transaction/jta/WebSphereUowTransactionManagerTests.java deleted file mode 100644 index b6dbf51..0000000 --- a/org.springframework.transaction/src/test/java/org/springframework/transaction/jta/WebSphereUowTransactionManagerTests.java +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed 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.springframework.transaction.jta; - -import javax.transaction.RollbackException; -import javax.transaction.Status; -import javax.transaction.UserTransaction; - -import com.ibm.wsspi.uow.UOWAction; -import com.ibm.wsspi.uow.UOWException; -import com.ibm.wsspi.uow.UOWManager; -import junit.framework.TestCase; -import org.easymock.MockControl; - -import org.springframework.dao.OptimisticLockingFailureException; -import org.springframework.mock.jndi.ExpectedLookupTemplate; -import org.springframework.transaction.IllegalTransactionStateException; -import org.springframework.transaction.NestedTransactionNotSupportedException; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.TransactionSystemException; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -/** - * @author Juergen Hoeller - */ -public class WebSphereUowTransactionManagerTests extends TestCase { - - public void testUowManagerFoundInJndi() { - MockUOWManager manager = new MockUOWManager(); - ExpectedLookupTemplate jndiTemplate = - new ExpectedLookupTemplate(WebSphereUowTransactionManager.DEFAULT_UOW_MANAGER_NAME, manager); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(); - ptm.setJndiTemplate(jndiTemplate); - ptm.afterPropertiesSet(); - - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - return "result"; - } - })); - - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testUowManagerAndUserTransactionFoundInJndi() throws Exception { - MockControl utControl = MockControl.createControl(UserTransaction.class); - UserTransaction ut = (UserTransaction) utControl.getMock(); - ut.getStatus(); - utControl.setReturnValue(Status.STATUS_NO_TRANSACTION, 1); - ut.getStatus(); - utControl.setReturnValue(Status.STATUS_ACTIVE, 2); - ut.begin(); - utControl.setVoidCallable(1); - ut.commit(); - utControl.setVoidCallable(1); - utControl.replay(); - - MockUOWManager manager = new MockUOWManager(); - ExpectedLookupTemplate jndiTemplate = new ExpectedLookupTemplate(); - jndiTemplate.addObject(WebSphereUowTransactionManager.DEFAULT_USER_TRANSACTION_NAME, ut); - jndiTemplate.addObject(WebSphereUowTransactionManager.DEFAULT_UOW_MANAGER_NAME, manager); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(); - ptm.setJndiTemplate(jndiTemplate); - ptm.afterPropertiesSet(); - - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - TransactionStatus ts = ptm.getTransaction(definition); - ptm.commit(ts); - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - return "result"; - } - })); - - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testPropagationMandatoryFailsInCaseOfNoExistingTransaction() { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY); - - try { - ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - return "result"; - } - }); - fail("Should have thrown IllegalTransactionStateException"); - } - catch (IllegalTransactionStateException ex) { - // expected - } - } - - public void testNewTransactionSynchronizationUsingPropagationSupports() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionSynchronizationUsingPropagationNotSupported() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionSynchronizationUsingPropagationNever() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionSynchronizationUsingPropagationSupportsAndSynchOnActual() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionSynchronizationUsingPropagationNotSupportedAndSynchOnActual() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionSynchronizationUsingPropagationNeverAndSynchOnActual() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionSynchronizationUsingPropagationSupportsAndSynchNever() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - public void testNewTransactionSynchronizationUsingPropagationNotSupportedAndSynchNever() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - public void testNewTransactionSynchronizationUsingPropagationNeverAndSynchNever() { - doTestNewTransactionSynchronization( - TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - private void doTestNewTransactionSynchronization(int propagationBehavior, final int synchMode) { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - ptm.setTransactionSynchronization(synchMode); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setPropagationBehavior(propagationBehavior); - definition.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - if (synchMode == WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertTrue(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - } - else { - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - } - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_LOCAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testNewTransactionWithCommitUsingPropagationRequired() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionWithCommitUsingPropagationRequiresNew() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionWithCommitUsingPropagationNested() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS); - } - - public void testNewTransactionWithCommitUsingPropagationRequiredAndSynchOnActual() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionWithCommitUsingPropagationRequiresNewAndSynchOnActual() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionWithCommitUsingPropagationNestedAndSynchOnActual() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION); - } - - public void testNewTransactionWithCommitUsingPropagationRequiredAndSynchNever() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - public void testNewTransactionWithCommitUsingPropagationRequiresNewAndSynchNever() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - public void testNewTransactionWithCommitUsingPropagationNestedAndSynchNever() { - doTestNewTransactionWithCommit( - TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER); - } - - private void doTestNewTransactionWithCommit(int propagationBehavior, final int synchMode) { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - ptm.setTransactionSynchronization(synchMode); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setPropagationBehavior(propagationBehavior); - definition.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - if (synchMode != WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertTrue(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - } - else { - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - } - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testNewTransactionWithCommitAndTimeout() { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setTimeout(10); - definition.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertTrue(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(10, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testNewTransactionWithCommitException() { - final RollbackException rex = new RollbackException(); - MockUOWManager manager = new MockUOWManager() { - public void runUnderUOW(int type, boolean join, UOWAction action) throws UOWException { - throw new UOWException(rex); - } - }; - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - try { - ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result"; - } - }); - fail("Should have thrown TransactionSystemException"); - } - catch (TransactionSystemException ex) { - // expected - assertTrue(ex.getCause() instanceof UOWException); - assertSame(rex, ex.getRootCause()); - assertSame(rex, ex.getMostSpecificCause()); - } - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - } - - public void testNewTransactionWithRollback() { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - try { - ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - throw new OptimisticLockingFailureException(""); - } - }); - fail("Should have thrown OptimisticLockingFailureException"); - } - catch (OptimisticLockingFailureException ex) { - // expected - } - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertTrue(manager.getRollbackOnly()); - } - - public void testNewTransactionWithRollbackOnly() { - MockUOWManager manager = new MockUOWManager(); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - status.setRollbackOnly(); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertTrue(manager.getRollbackOnly()); - } - - public void testExistingNonSpringTransaction() { - MockUOWManager manager = new MockUOWManager(); - manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertTrue(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testPropagationNeverFailsInCaseOfExistingTransaction() { - MockUOWManager manager = new MockUOWManager(); - manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NEVER); - - try { - ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - return "result"; - } - }); - fail("Should have thrown IllegalTransactionStateException"); - } - catch (IllegalTransactionStateException ex) { - // expected - } - } - - public void testPropagationNestedFailsInCaseOfExistingTransaction() { - MockUOWManager manager = new MockUOWManager(); - manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE); - WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); - - try { - ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - return "result"; - } - }); - fail("Should have thrown NestedTransactionNotSupportedException"); - } - catch (NestedTransactionNotSupportedException ex) { - // expected - } - } - - public void testExistingTransactionWithParticipationUsingPropagationRequired() { - doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_REQUIRED); - } - - public void testExistingTransactionWithParticipationUsingPropagationSupports() { - doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_SUPPORTS); - } - - public void testExistingTransactionWithParticipationUsingPropagationMandatory() { - doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_MANDATORY); - } - - private void doTestExistingTransactionWithParticipation(int propagationBehavior) { - MockUOWManager manager = new MockUOWManager(); - final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition(); - definition2.setPropagationBehavior(propagationBehavior); - definition2.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - assertEquals("result2", ptm.execute(definition2, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result2"; - } - })); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - assertTrue(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testExistingTransactionWithSuspensionUsingPropagationRequiresNew() { - doTestExistingTransactionWithSuspension(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - } - - public void testExistingTransactionWithSuspensionUsingPropagationNotSupported() { - doTestExistingTransactionWithSuspension(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); - } - - private void doTestExistingTransactionWithSuspension(final int propagationBehavior) { - MockUOWManager manager = new MockUOWManager(); - final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition(); - definition2.setPropagationBehavior(propagationBehavior); - definition2.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - assertEquals("result2", ptm.execute(definition2, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertEquals(propagationBehavior == TransactionDefinition.PROPAGATION_REQUIRES_NEW, - TransactionSynchronizationManager.isActualTransactionActive()); - assertTrue(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result2"; - } - })); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - if (propagationBehavior == TransactionDefinition.PROPAGATION_REQUIRES_NEW) { - assertEquals(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION, manager.getUOWType()); - } - else { - assertEquals(UOWManager.UOW_TYPE_LOCAL_TRANSACTION, manager.getUOWType()); - } - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - - public void testExistingTransactionUsingPropagationNotSupported() { - MockUOWManager manager = new MockUOWManager(); - final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager); - DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); - final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition(); - definition2.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); - definition2.setReadOnly(true); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals("result", ptm.execute(definition, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - assertEquals("result2", ptm.execute(definition2, new TransactionCallback() { - public Object doInTransaction(TransactionStatus status) { - assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertTrue(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - return "result2"; - } - })); - return "result"; - } - })); - - assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); - assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); - assertFalse(TransactionSynchronizationManager.isCurrentTransactionReadOnly()); - - assertEquals(0, manager.getUOWTimeout()); - assertEquals(UOWManager.UOW_TYPE_LOCAL_TRANSACTION, manager.getUOWType()); - assertFalse(manager.getJoined()); - assertFalse(manager.getRollbackOnly()); - } - -}