From bdc14b05bae595a6f7b1b2570d224b4a6ceb662c Mon Sep 17 00:00:00 2001 From: Mattias Arthursson Date: Fri, 20 Apr 2007 17:45:47 +0000 Subject: [PATCH] Reworked transaction package structure and refactored to extract generic compensating transaction functionality. --- spring-ldap/.classpath | 1 + spring-ldap/ivy.xml | 211 ++++++++++-------- .../ldapAndJdbcTransactionTestContext.xml | 8 +- .../ldapTemplateTransactionTestContext.xml | 6 +- ...urceTransactionManagerIntegrationTest.java | 4 +- ...urceTransactionManagerIntegrationTest.java | 4 +- .../{support => core}/DummyDao.java | 2 +- .../{support => core}/DummyException.java | 2 +- .../{support => core}/DummyServiceImpl.java | 2 +- .../LdapAndJdbcDummyDaoImpl.java | 2 +- .../{support => core}/LdapDummyDaoImpl.java | 2 +- .../DirContextProxy.java | 6 +- .../BindOperationExecutor.java | 2 +- .../BindOperationRecorder.java | 4 +- .../{ => compensating}/DirContextHolder.java | 59 +---- ...mpensatingTransactionOperationFactory.java | 15 +- .../LdapTransactionUtils.java} | 44 +--- .../ModifyAttributesOperationExecutor.java | 2 +- .../ModifyAttributesOperationRecorder.java | 4 +- .../NullOperationExecutor.java | 2 +- .../NullOperationRecorder.java | 2 +- .../RebindOperationExecutor.java | 2 +- .../RebindOperationRecorder.java | 4 +- .../RenameOperationExecutor.java | 2 +- .../RenameOperationRecorder.java | 6 +- .../TempEntryRenamingStrategy.java | 2 +- .../UnbindOperationExecutor.java | 2 +- .../UnbindOperationRecorder.java | 4 +- .../transaction/compensating/package.html | 7 + .../DefaultTempEntryRenamingStrategy.java | 4 +- ...erentSubtreeTempEntryRenamingStrategy.java | 4 +- .../compensating/support/package.html | 7 + ...SourceAndDataSourceTransactionManager.java | 4 +- .../ContextSourceTransactionManager.java | 9 +- ...ntextSourceTransactionManagerDelegate.java | 109 +++++++++ .../TransactionAwareContextSourceProxy.java | 10 +- ...ctionAwareDirContextInvocationHandler.java | 15 +- .../ldap/transaction/core/package.html | 7 + ...ntextSourceTransactionManagerDelegate.java | 165 -------------- .../ContextSourceTransactionObject.java | 57 ----- ...mpensatingTransactionOperationFactory.java | 2 + .../transaction/compensating/package.html | 8 + ...ompensatingTransactionManagerDelegate.java | 142 ++++++++++++ .../CompensatingTransactionHolderSupport.java | 78 +++++++ .../CompensatingTransactionObject.java | 61 +++++ .../support/CompensatingTransactionUtils.java | 57 +++++ ...mpensatingTransactionOperationManager.java | 6 +- .../compensating/support/package.html | 9 + .../ldap/support/TransactionUtilsTest.java | 171 -------------- .../BindOperationExecutorTest.java | 4 +- .../BindOperationRecorderTest.java | 6 +- ...satingTransactionOperationFactoryTest.java | 16 +- .../LdapTransactionUtilsTest.java | 136 +++++++++++ ...ModifyAttributesOperationExecutorTest.java | 4 +- ...ModifyAttributesOperationRecorderTest.java | 6 +- .../RebindOperationExecutorTest.java | 4 +- .../RebindOperationRecorderTest.java | 8 +- .../RenameOperationExecutorTest.java | 4 +- .../RenameOperationRecorderTest.java | 6 +- .../UnbindOperationExecutorTest.java | 4 +- .../UnbindOperationRecorderTest.java | 8 +- .../DefaultTempEntryRenamingStrategyTest.java | 4 +- ...tSubtreeTempEntryRenamingStrategyTest.java | 4 +- .../ContextSourceTransactionManagerTest.java | 31 +-- ...ransactionAwareContextSourceProxyTest.java | 6 +- .../CompensatingTransactionUtilsTest.java | 107 +++++++++ ...satingTransactionOperationManagerTest.java | 4 +- 67 files changed, 996 insertions(+), 704 deletions(-) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java (96%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/ContextSourceTransactionManagerIntegrationTest.java (95%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/DummyDao.java (94%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/DummyException.java (90%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/DummyServiceImpl.java (91%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/LdapAndJdbcDummyDaoImpl.java (96%) rename spring-ldap/src/itest/java/org/springframework/ldap/transaction/{support => core}/LdapDummyDaoImpl.java (96%) rename spring-ldap/src/main/java/org/springframework/ldap/{transaction => core}/DirContextProxy.java (80%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/BindOperationExecutor.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/BindOperationRecorder.java (92%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/DirContextHolder.java (50%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/LdapCompensatingTransactionOperationFactory.java (88%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{TransactionUtils.java => compensating/LdapTransactionUtils.java} (76%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/ModifyAttributesOperationExecutor.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/ModifyAttributesOperationRecorder.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/NullOperationExecutor.java (93%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/NullOperationRecorder.java (94%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/RebindOperationExecutor.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/RebindOperationRecorder.java (93%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/RenameOperationExecutor.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/RenameOperationRecorder.java (90%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/TempEntryRenamingStrategy.java (92%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/UnbindOperationExecutor.java (95%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/UnbindOperationRecorder.java (92%) create mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/package.html rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/support/DefaultTempEntryRenamingStrategy.java (92%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{ => compensating}/support/DifferentSubtreeTempEntryRenamingStrategy.java (92%) create mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/package.html rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{support => core}/ContextSourceAndDataSourceTransactionManager.java (96%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{support => core}/ContextSourceTransactionManager.java (93%) create mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerDelegate.java rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{support => core}/TransactionAwareContextSourceProxy.java (87%) rename spring-ldap/src/main/java/org/springframework/ldap/transaction/{support => core}/TransactionAwareDirContextInvocationHandler.java (80%) create mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/core/package.html delete mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerDelegate.java delete mode 100644 spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionObject.java create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/package.html create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/support/AbstractCompensatingTransactionManagerDelegate.java create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionHolderSupport.java create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionObject.java create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtils.java rename spring-ldap/src/main/java/org/springframework/transaction/compensating/{ => support}/DefaultCompensatingTransactionOperationManager.java (88%) create mode 100644 spring-ldap/src/main/java/org/springframework/transaction/compensating/support/package.html delete mode 100644 spring-ldap/src/test/java/org/springframework/ldap/support/TransactionUtilsTest.java rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/BindOperationExecutorTest.java (91%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/BindOperationRecorderTest.java (91%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/LdapCompensatingTransactionOperationFactoryTest.java (86%) create mode 100644 spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtilsTest.java rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/ModifyAttributesOperationExecutorTest.java (91%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/ModifyAttributesOperationRecorderTest.java (95%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/RebindOperationExecutorTest.java (93%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/RebindOperationRecorderTest.java (88%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/RenameOperationExecutorTest.java (91%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/RenameOperationRecorderTest.java (85%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/UnbindOperationExecutorTest.java (91%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/UnbindOperationRecorderTest.java (86%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/support/DefaultTempEntryRenamingStrategyTest.java (85%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{ => compensating}/support/DifferentSubtreeTempEntryRenamingStrategyTest.java (79%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{support => core}/ContextSourceTransactionManagerTest.java (80%) rename spring-ldap/src/test/java/org/springframework/ldap/transaction/{support => core}/TransactionAwareContextSourceProxyTest.java (92%) create mode 100644 spring-ldap/src/test/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtilsTest.java rename spring-ldap/src/test/java/org/springframework/transaction/compensating/{ => support}/DefaultCompensatingTransactionOperationManagerTest.java (94%) diff --git a/spring-ldap/.classpath b/spring-ldap/.classpath index d7c17c71..b4dc4d9f 100644 --- a/spring-ldap/.classpath +++ b/spring-ldap/.classpath @@ -50,5 +50,6 @@ + diff --git a/spring-ldap/ivy.xml b/spring-ldap/ivy.xml index ce41af21..e0f4180a 100644 --- a/spring-ldap/ivy.xml +++ b/spring-ldap/ivy.xml @@ -1,108 +1,135 @@ - - + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - + + + - - - - - - - + + + + + + + + + - - diff --git a/spring-ldap/src/itest/java/conf/ldapAndJdbcTransactionTestContext.xml b/spring-ldap/src/itest/java/conf/ldapAndJdbcTransactionTestContext.xml index 8ab52b25..cd74f83f 100644 --- a/spring-ldap/src/itest/java/conf/ldapAndJdbcTransactionTestContext.xml +++ b/spring-ldap/src/itest/java/conf/ldapAndJdbcTransactionTestContext.xml @@ -31,7 +31,7 @@ + class="org.springframework.ldap.transaction.core.TransactionAwareContextSourceProxy"> @@ -47,21 +47,21 @@ + class="org.springframework.ldap.transaction.core.ContextSourceAndDataSourceTransactionManager"> + class="org.springframework.ldap.transaction.core.LdapAndJdbcDummyDaoImpl"> diff --git a/spring-ldap/src/itest/java/conf/ldapTemplateTransactionTestContext.xml b/spring-ldap/src/itest/java/conf/ldapTemplateTransactionTestContext.xml index 099c1da5..ee31f80c 100644 --- a/spring-ldap/src/itest/java/conf/ldapTemplateTransactionTestContext.xml +++ b/spring-ldap/src/itest/java/conf/ldapTemplateTransactionTestContext.xml @@ -23,7 +23,7 @@ + class="org.springframework.ldap.transaction.core.TransactionAwareContextSourceProxy"> @@ -33,13 +33,13 @@ + class="org.springframework.ldap.transaction.core.ContextSourceTransactionManager"> + class="org.springframework.ldap.transaction.core.LdapDummyDaoImpl"> diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java similarity index 96% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java index f324bb09..2d7da412 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManagerIntegrationTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import java.sql.ResultSet; import java.sql.SQLException; @@ -30,7 +30,7 @@ import org.springframework.ldap.LdapServerManager; import org.springframework.ldap.NameNotFoundException; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.LdapTemplate; -import org.springframework.ldap.transaction.support.ContextSourceAndDataSourceTransactionManager; +import org.springframework.ldap.transaction.core.ContextSourceAndDataSourceTransactionManager; import org.springframework.test.AbstractDependencyInjectionSpringContextTests; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerIntegrationTest.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerIntegrationTest.java similarity index 95% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerIntegrationTest.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerIntegrationTest.java index 6253a736..3d5337c2 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerIntegrationTest.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerIntegrationTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import javax.naming.NamingException; import javax.naming.directory.Attributes; @@ -24,7 +24,7 @@ import org.springframework.ldap.LdapServerManager; import org.springframework.ldap.NameNotFoundException; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.LdapTemplate; -import org.springframework.ldap.transaction.support.ContextSourceAndDataSourceTransactionManager; +import org.springframework.ldap.transaction.core.ContextSourceAndDataSourceTransactionManager; import org.springframework.test.AbstractDependencyInjectionSpringContextTests; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyDao.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyDao.java similarity index 94% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyDao.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyDao.java index 83038134..c6fd53b9 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyDao.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyDao.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; public interface DummyDao { void createWithException(String country, String company, String fullname, diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyException.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyException.java similarity index 90% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyException.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyException.java index 1346994e..4637e5d8 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyException.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; public class DummyException extends RuntimeException { public DummyException(String message) { diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyServiceImpl.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyServiceImpl.java similarity index 91% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyServiceImpl.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyServiceImpl.java index fe2ea681..272d630e 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/DummyServiceImpl.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/DummyServiceImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; public class DummyServiceImpl { private DummyDao dummyDaoImpl; diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapAndJdbcDummyDaoImpl.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapAndJdbcDummyDaoImpl.java similarity index 96% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapAndJdbcDummyDaoImpl.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapAndJdbcDummyDaoImpl.java index 2565d1cf..036c1f6c 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapAndJdbcDummyDaoImpl.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapAndJdbcDummyDaoImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.ldap.core.DirContextAdapter; diff --git a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapDummyDaoImpl.java b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapDummyDaoImpl.java similarity index 96% rename from spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapDummyDaoImpl.java rename to spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapDummyDaoImpl.java index f3abca80..58c205b2 100644 --- a/spring-ldap/src/itest/java/org/springframework/ldap/transaction/support/LdapDummyDaoImpl.java +++ b/spring-ldap/src/itest/java/org/springframework/ldap/transaction/core/LdapDummyDaoImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import org.springframework.ldap.core.DirContextAdapter; import org.springframework.ldap.core.DistinguishedName; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextProxy.java b/spring-ldap/src/main/java/org/springframework/ldap/core/DirContextProxy.java similarity index 80% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextProxy.java rename to spring-ldap/src/main/java/org/springframework/ldap/core/DirContextProxy.java index 156bce4c..7b6ae72c 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextProxy.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/core/DirContextProxy.java @@ -13,15 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.core; import javax.naming.directory.DirContext; -import org.springframework.ldap.transaction.support.TransactionAwareContextSourceProxy; - /** * Helper interface to be able to get hold of the target DirContext from proxies - * created by {@link TransactionAwareContextSourceProxy}. + * created by ContextSource proxies. * * @author Mattias Arthursson */ diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationExecutor.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationExecutor.java index cefa16aa..002ca609 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.Attributes; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationRecorder.java similarity index 92% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationRecorder.java index d43af9c0..64389455 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/BindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/BindOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.Attributes; @@ -57,7 +57,7 @@ public class BindOperationRecorder implements throw new IllegalArgumentException( "Invalid arguments for bind operation"); } - Name dn = TransactionUtils.getFirstArgumentAsName(args); + Name dn = LdapTransactionUtils.getFirstArgumentAsName(args); Object object = args[1]; Attributes attributes = null; if (args[2] != null && !(args[2] instanceof Attributes)) { diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextHolder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/DirContextHolder.java similarity index 50% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextHolder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/DirContextHolder.java index 36e57bef..f47369f3 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/DirContextHolder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/DirContextHolder.java @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.directory.DirContext; import org.springframework.transaction.compensating.CompensatingTransactionOperationFactory; import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; -import org.springframework.transaction.compensating.DefaultCompensatingTransactionOperationManager; -import org.springframework.transaction.support.ResourceHolderSupport; +import org.springframework.transaction.compensating.support.CompensatingTransactionHolderSupport; /** * Keeps track of the transaction DirContext. The same DirContext instance will @@ -32,13 +31,9 @@ import org.springframework.transaction.support.ResourceHolderSupport; * @author Mattias Arthursson * */ -public class DirContextHolder extends ResourceHolderSupport { +public class DirContextHolder extends CompensatingTransactionHolderSupport { private DirContext ctx; - private CompensatingTransactionOperationManager transactionOperationManager; - - private CompensatingTransactionOperationFactory operationFactory; - private TempEntryRenamingStrategy renamingStrategy; /** @@ -51,8 +46,7 @@ public class DirContextHolder extends ResourceHolderSupport { TempEntryRenamingStrategy renamingStrategy) { this.ctx = ctx; this.renamingStrategy = renamingStrategy; - this.transactionOperationManager = new DefaultCompensatingTransactionOperationManager( - createOperationFactory()); + refreshTransactionOperationManager(); } /** @@ -63,19 +57,10 @@ public class DirContextHolder extends ResourceHolderSupport { */ public void setCtx(DirContext ctx) { this.ctx = ctx; - this.transactionOperationManager = new DefaultCompensatingTransactionOperationManager( - createOperationFactory()); + refreshTransactionOperationManager(); } - /** - * Factory method to create a - * {@link CompensatingTransactionOperationFactory} using the settings and - * current state of this object. - * - * @return a new {@link LdapCompensatingTransactionOperationFactory} - * referncing the current transaction context. - */ - private CompensatingTransactionOperationFactory createOperationFactory() { + protected CompensatingTransactionOperationFactory createOperationFactory() { return new LdapCompensatingTransactionOperationFactory(ctx, renamingStrategy); } @@ -87,38 +72,6 @@ public class DirContextHolder extends ResourceHolderSupport { return ctx; } - public void clear() { - super.clear(); - transactionOperationManager = null; - operationFactory = null; - } - - /** - * Get the CompensatingTransactionOperationManager to handle the data for - * the current transaction. - * - * @return the CompensatingTransactionOperationManager. - */ - public CompensatingTransactionOperationManager getTransactionOperationManager() { - return transactionOperationManager; - } - - /** - * Set the CompensatingTransactionOperationManager. For testing purposes - * only. - * - * @param transactionOperationManager - * the CompensatingTransactionOperationManager to use. - */ - public void setTransactionOperationManager( - CompensatingTransactionOperationManager transactionOperationManager) { - this.transactionOperationManager = transactionOperationManager; - } - - public CompensatingTransactionOperationFactory getOperationFactory() { - return operationFactory; - } - public TempEntryRenamingStrategy getRenamingStrategy() { return renamingStrategy; } diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactory.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactory.java similarity index 88% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactory.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactory.java index a41f7f88..a2f706a5 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactory.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -27,6 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.ldap.NamingException; import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.core.DirContextProxy; import org.springframework.ldap.core.LdapOperations; import org.springframework.ldap.core.LdapTemplate; import org.springframework.transaction.compensating.CompensatingTransactionOperationFactory; @@ -61,19 +62,19 @@ public class LdapCompensatingTransactionOperationFactory implements public CompensatingTransactionOperationRecorder createRecordingOperation( String operation) { - if (StringUtils.equals(operation, TransactionUtils.BIND_METHOD_NAME)) { + if (StringUtils.equals(operation, LdapTransactionUtils.BIND_METHOD_NAME)) { log.debug("Bind operation recorded"); return new BindOperationRecorder(ldapOperations); - } else if (StringUtils.equals(operation, TransactionUtils.REBIND_METHOD_NAME)) { + } else if (StringUtils.equals(operation, LdapTransactionUtils.REBIND_METHOD_NAME)) { log.debug("Rebind operation recorded"); return new RebindOperationRecorder(ldapOperations, renamingStrategy); - } else if (StringUtils.equals(operation, TransactionUtils.RENAME_METHOD_NAME)) { + } else if (StringUtils.equals(operation, LdapTransactionUtils.RENAME_METHOD_NAME)) { log.debug("Rename operation recorded"); return new RenameOperationRecorder(ldapOperations); } else if (StringUtils.equals(operation, - TransactionUtils.MODIFY_ATTRIBUTES_METHOD_NAME)) { + LdapTransactionUtils.MODIFY_ATTRIBUTES_METHOD_NAME)) { return new ModifyAttributesOperationRecorder(ldapOperations); - } else if (StringUtils.equals(operation, TransactionUtils.UNBIND_METHOD_NAME)) { + } else if (StringUtils.equals(operation, LdapTransactionUtils.UNBIND_METHOD_NAME)) { return new UnbindOperationRecorder(ldapOperations, renamingStrategy); } @@ -124,7 +125,7 @@ public class LdapCompensatingTransactionOperationFactory implements private DirContext getNonClosingDirContextProxy(DirContext context) { return (DirContext) Proxy.newProxyInstance(DirContextProxy.class .getClassLoader(), new Class[] { - TransactionUtils.getActualTargetClass(context), + LdapTransactionUtils.getActualTargetClass(context), DirContextProxy.class }, new NonClosingDirContextInvocationHandler(context)); diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/TransactionUtils.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtils.java similarity index 76% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/TransactionUtils.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtils.java index cfc33812..8bcae251 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/TransactionUtils.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtils.java @@ -14,10 +14,7 @@ * limitations under the License. */ -package org.springframework.ldap.transaction; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.DirContext; @@ -29,7 +26,6 @@ import org.apache.commons.logging.LogFactory; import org.springframework.ldap.NamingException; import org.springframework.ldap.core.ContextSource; import org.springframework.ldap.core.DistinguishedName; -import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -39,9 +35,10 @@ import org.springframework.util.Assert; * @author Mattias Arthursson * @since 1.2 */ -public final class TransactionUtils { +public final class LdapTransactionUtils { - private static final Log logger = LogFactory.getLog(TransactionUtils.class); + private static final Log logger = LogFactory + .getLog(LdapTransactionUtils.class); public static final String REBIND_METHOD_NAME = "rebind"; @@ -56,7 +53,7 @@ public final class TransactionUtils { /** * Not to be instantiated. */ - private TransactionUtils() { + private LdapTransactionUtils() { } @@ -160,37 +157,6 @@ public final class TransactionUtils { } - /** - * Perform the specified operation, storing the state prior to the - * operation, to enable commit/rollback later. - * - * @param contextSource - * the ContextSource we are operating on. - * @param targetContext TODO - * @param method - * name of the method to be invoked. - * @param args - * arguments with which the operation is invoked. - */ - public static void performOperation(ContextSource contextSource, - DirContext targetContext, Method method, Object[] args) throws Throwable { - DirContextHolder transactionContextHolder = (DirContextHolder) TransactionSynchronizationManager - .getResource(contextSource); - if (transactionContextHolder != null) { - - CompensatingTransactionOperationManager transactionDataManager = transactionContextHolder - .getTransactionOperationManager(); - transactionDataManager.performOperation(method.getName(), args); - } else { - // Perform the target operation - try { - method.invoke(targetContext, args); - } catch (InvocationTargetException e) { - throw e.getTargetException(); - } - } - } - /** * Get the actual class of the supplied DirContext instance; LdapContext or * DirContext. diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutor.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutor.java index 7c0d9d4a..a24bb9bb 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.ModificationItem; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorder.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorder.java index d1cc0ffb..6a627b71 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import java.util.HashSet; import java.util.Set; @@ -56,7 +56,7 @@ public class ModifyAttributesOperationRecorder implements public CompensatingTransactionOperationExecutor recordOperation( Object[] args) { Assert.notNull(args); - Name dn = TransactionUtils.getFirstArgumentAsName(args); + Name dn = LdapTransactionUtils.getFirstArgumentAsName(args); if (args.length != 2 || !(args[1] instanceof ModificationItem[])) { throw new IllegalArgumentException( "Unexpected arguments to ModifyAttributes operation"); diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationExecutor.java similarity index 93% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationExecutor.java index 8f6b8dfd..05252482 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationRecorder.java similarity index 94% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationRecorder.java index d2271b6c..dd073907 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/NullOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/NullOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutor.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutor.java index a8a8dab7..73413482 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.Attributes; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorder.java similarity index 93% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorder.java index 3ec81949..bb537a6d 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RebindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.Attributes; @@ -63,7 +63,7 @@ public class RebindOperationRecorder implements throw new IllegalArgumentException( "Invalid arguments for bind operation"); } - Name dn = TransactionUtils.getFirstArgumentAsName(args); + Name dn = LdapTransactionUtils.getFirstArgumentAsName(args); Object object = args[1]; Attributes attributes = null; if (args[2] != null && !(args[2] instanceof Attributes)) { diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutor.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutor.java index 848db7d9..bbefde7e 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorder.java similarity index 90% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorder.java index 8054489a..74d26a93 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/RenameOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; @@ -63,8 +63,8 @@ public class RenameOperationRecorder implements // This really shouldn't happen. throw new IllegalArgumentException("Illegal argument length"); } - Name oldDn = TransactionUtils.getArgumentAsName(args[0]); - Name newDn = TransactionUtils.getArgumentAsName(args[1]); + Name oldDn = LdapTransactionUtils.getArgumentAsName(args[0]); + Name newDn = LdapTransactionUtils.getArgumentAsName(args[1]); return new RenameOperationExecutor(ldapOperations, oldDn, newDn); } diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/TempEntryRenamingStrategy.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/TempEntryRenamingStrategy.java similarity index 92% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/TempEntryRenamingStrategy.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/TempEntryRenamingStrategy.java index 54e2c964..c96e967a 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/TempEntryRenamingStrategy.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/TempEntryRenamingStrategy.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationExecutor.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutor.java similarity index 95% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationExecutor.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutor.java index 7dbda9cd..3cae90c7 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationExecutor.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationRecorder.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorder.java similarity index 92% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationRecorder.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorder.java index f668404d..ae9ac794 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/UnbindOperationRecorder.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; @@ -59,7 +59,7 @@ public class UnbindOperationRecorder implements */ public CompensatingTransactionOperationExecutor recordOperation( Object[] args) { - Name dn = TransactionUtils.getFirstArgumentAsName(args); + Name dn = LdapTransactionUtils.getFirstArgumentAsName(args); Name temporaryDn = renamingStrategy.getTemporaryName(dn); return new UnbindOperationExecutor(ldapOperations, dn, temporaryDn); diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/package.html b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/package.html new file mode 100644 index 00000000..a5d44d78 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/package.html @@ -0,0 +1,7 @@ + + + +LDAP specific implementations of the Compensating Transaction interfaces. + + + diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategy.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategy.java similarity index 92% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategy.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategy.java index 254e79ac..646b744a 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategy.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategy.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.compensating.support; import java.util.List; @@ -22,7 +22,7 @@ import javax.naming.Name; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapRdn; import org.springframework.ldap.core.LdapRdnComponent; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; /** * Default implementation of {@link TempEntryRenamingStrategy}. This diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategy.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategy.java similarity index 92% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategy.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategy.java index 43786eac..35da0ae2 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategy.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategy.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.compensating.support; import java.util.List; @@ -22,7 +22,7 @@ import javax.naming.Name; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapRdn; import org.springframework.ldap.core.LdapRdnComponent; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; /** * A {@link TempEntryRenamingStrategy} that moves the entry to a different diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/package.html b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/package.html new file mode 100644 index 00000000..b62d994f --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/compensating/support/package.html @@ -0,0 +1,7 @@ + + + +Useful helper implementations for client side Compensating LDAP Transactions. + + + diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManager.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManager.java similarity index 96% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManager.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManager.java index 62f607a7..49b112fa 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceAndDataSourceTransactionManager.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceAndDataSourceTransactionManager.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionSuspensionNotSupportedException; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManager.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManager.java similarity index 93% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManager.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManager.java index 64a1f3f6..0f83e76b 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManager.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManager.java @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; -import org.springframework.ldap.transaction.UnbindOperationExecutor; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.UnbindOperationExecutor; +import org.springframework.ldap.transaction.compensating.support.DefaultTempEntryRenamingStrategy; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; import org.springframework.transaction.compensating.CompensatingTransactionOperationRecorder; -import org.springframework.transaction.compensating.DefaultCompensatingTransactionOperationManager; +import org.springframework.transaction.compensating.support.DefaultCompensatingTransactionOperationManager; import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.transaction.support.DefaultTransactionStatus; diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerDelegate.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerDelegate.java new file mode 100644 index 00000000..17839a3a --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerDelegate.java @@ -0,0 +1,109 @@ +/* + * Copyright 2002-2007 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.ldap.transaction.core; + +import javax.naming.NamingException; +import javax.naming.directory.DirContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.support.DefaultTempEntryRenamingStrategy; +import org.springframework.transaction.compensating.support.AbstractCompensatingTransactionManagerDelegate; +import org.springframework.transaction.compensating.support.CompensatingTransactionHolderSupport; + +/** + * This delegate performs all the work for the + * {@link ContextSourceTransactionManager}. The work is delegated in order to + * be able to perform the exact same work for the LDAP part in + * {@link ContextSourceAndDataSourceTransactionManager}. + * + * @author Mattias Arthursson + * @see ContextSourceTransactionManager + * @see ContextSourceAndDataSourceTransactionManager + */ +public class ContextSourceTransactionManagerDelegate extends + AbstractCompensatingTransactionManagerDelegate { + + private static final Log log = LogFactory + .getLog(ContextSourceTransactionManagerDelegate.class); + + private ContextSource contextSource; + + private TempEntryRenamingStrategy renamingStrategy = new DefaultTempEntryRenamingStrategy(); + + /** + * Set the ContextSource to work on. Even though the actual ContextSource + * sent to the LdapTemplate instance should be a + * {@link TransactionAwareContextSourceProxy}, the one sent to this method + * should be the target of that proxy. If it is not, the target will be + * extracted and used instead. + * + * @param contextSource + * the ContextSource to work on. + */ + public void setContextSource(ContextSource contextSource) { + if (contextSource instanceof TransactionAwareContextSourceProxy) { + TransactionAwareContextSourceProxy proxy = (TransactionAwareContextSourceProxy) contextSource; + this.contextSource = proxy.getTarget(); + } else { + this.contextSource = contextSource; + } + } + + public ContextSource getContextSource() { + return contextSource; + } + + protected Object getTransactionSynchronizationKey() { + return getContextSource(); + } + + protected CompensatingTransactionHolderSupport getNewHolder() { + DirContext newCtx = getContextSource().getReadOnlyContext(); + DirContextHolder contextHolder = new DirContextHolder(newCtx, + renamingStrategy); + return contextHolder; + } + + protected void closeTargetResource( + CompensatingTransactionHolderSupport transactionHolderSupport) { + DirContextHolder contextHolder = (DirContextHolder) transactionHolderSupport; + DirContext ctx = contextHolder.getCtx(); + + try { + log.debug("Closing target context"); + ctx.close(); + } catch (NamingException e) { + log.warn("Failed to close target context", e); + } + } + + /** + * Set the {@link TempEntryRenamingStrategy} to be used when renaming + * temporary entries in unbind and rebind operations. Default value is a + * {@link DefaultTempEntryRenamingStrategy}. + * + * @param renamingStrategy + * the {@link TempEntryRenamingStrategy} to use. + */ + public void setRenamingStrategy(TempEntryRenamingStrategy renamingStrategy) { + this.renamingStrategy = renamingStrategy; + } + +} diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxy.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxy.java similarity index 87% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxy.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxy.java index adad5d55..1229bde0 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxy.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxy.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import java.lang.reflect.Proxy; @@ -21,9 +21,9 @@ import javax.naming.directory.DirContext; import org.springframework.ldap.NamingException; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextHolder; -import org.springframework.ldap.transaction.DirContextProxy; -import org.springframework.ldap.transaction.TransactionUtils; +import org.springframework.ldap.core.DirContextProxy; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.ldap.transaction.compensating.LdapTransactionUtils; import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -71,7 +71,7 @@ public class TransactionAwareContextSourceProxy implements ContextSource { ContextSource target) { return (DirContext) Proxy .newProxyInstance(DirContextProxy.class.getClassLoader(), - new Class[] { TransactionUtils.getActualTargetClass(context), + new Class[] { LdapTransactionUtils.getActualTargetClass(context), DirContextProxy.class }, new TransactionAwareDirContextInvocationHandler( context, target)); diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareDirContextInvocationHandler.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java similarity index 80% rename from spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareDirContextInvocationHandler.java rename to spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java index 50b9edcd..3ce88c5c 100644 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/TransactionAwareDirContextInvocationHandler.java +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/TransactionAwareDirContextInvocationHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -22,8 +22,9 @@ import java.lang.reflect.Method; import javax.naming.directory.DirContext; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextHolder; -import org.springframework.ldap.transaction.TransactionUtils; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.ldap.transaction.compensating.LdapTransactionUtils; +import org.springframework.transaction.compensating.support.CompensatingTransactionUtils; /** * Proxy implementation for DirContext, making sure that the instance is not @@ -73,11 +74,13 @@ public class TransactionAwareDirContextInvocationHandler implements // Use hashCode of Connection proxy. return new Integer(proxy.hashCode()); } else if (methodName.equals("close")) { - TransactionUtils.doCloseConnection(target, contextSource); + LdapTransactionUtils.doCloseConnection(target, contextSource); return null; - } else if (TransactionUtils.isSupportedWriteTransactionOperation(methodName)) { + } else if (LdapTransactionUtils + .isSupportedWriteTransactionOperation(methodName)) { // Store transaction data and allow operation to proceed. - TransactionUtils.performOperation(contextSource, target, method, args); + CompensatingTransactionUtils.performOperation(contextSource, + target, method, args); return null; } else { try { diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/package.html b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/package.html new file mode 100644 index 00000000..2cac0e87 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/ldap/transaction/core/package.html @@ -0,0 +1,7 @@ + + + +The core implementation classes for client-side LDAP transactions. + + + diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerDelegate.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerDelegate.java deleted file mode 100644 index dd4ea0fe..00000000 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerDelegate.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2002-2007 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.ldap.transaction.support; - -import javax.naming.NamingException; -import javax.naming.directory.DirContext; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextHolder; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionException; -import org.springframework.transaction.support.DefaultTransactionStatus; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -/** - * This delegate performs all the work for the - * {@link ContextSourceTransactionManager}. The work is delegated in order to - * be able to perform the exact same work for the LDAP part in - * {@link ContextSourceAndDataSourceTransactionManager}. - * - * @author Mattias Arthursson - * @see ContextSourceTransactionManager - * @see ContextSourceAndDataSourceTransactionManager - */ -public class ContextSourceTransactionManagerDelegate { - private static Log log = LogFactory - .getLog(ContextSourceTransactionManager.class); - - private ContextSource contextSource; - - private TempEntryRenamingStrategy renamingStrategy = new DefaultTempEntryRenamingStrategy(); - - /** - * Set the ContextSource to work on. Even though the actual ContextSource - * sent to the LdapTemplate instance should be a - * {@link TransactionAwareContextSourceProxy}, the one sent to this method - * should be the target of that proxy. If it is not, the target will be - * extracted and used instead. - * - * @param contextSource - * the ContextSource to work on. - */ - public void setContextSource(ContextSource contextSource) { - if (contextSource instanceof TransactionAwareContextSourceProxy) { - TransactionAwareContextSourceProxy proxy = (TransactionAwareContextSourceProxy) contextSource; - this.contextSource = proxy.getTarget(); - } else { - this.contextSource = contextSource; - } - } - - public ContextSource getContextSource() { - return contextSource; - } - - /* - * (non-Javadoc) - * - * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#doGetTransaction() - */ - public Object doGetTransaction() throws TransactionException { - DirContextHolder contextHolder = (DirContextHolder) TransactionSynchronizationManager - .getResource(this.contextSource); - ContextSourceTransactionObject txObject = new ContextSourceTransactionObject( - contextHolder); - return txObject; - } - - /* - * (non-Javadoc) - * - * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#doBegin(java.lang.Object, - * org.springframework.transaction.TransactionDefinition) - */ - public void doBegin(Object transaction, TransactionDefinition definition) - throws TransactionException { - ContextSourceTransactionObject txObject = (ContextSourceTransactionObject) transaction; - - if (txObject.getContextHolder() == null) { - DirContext newCtx = getContextSource().getReadOnlyContext(); - DirContextHolder contextHolder = new DirContextHolder(newCtx, - renamingStrategy); - - txObject.setContextHolder(contextHolder); - TransactionSynchronizationManager.bindResource(getContextSource(), - contextHolder); - } - } - - /* - * (non-Javadoc) - * - * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#doCommit(org.springframework.transaction.support.DefaultTransactionStatus) - */ - public void doCommit(DefaultTransactionStatus status) - throws TransactionException { - ContextSourceTransactionObject txObject = (ContextSourceTransactionObject) status - .getTransaction(); - txObject.getContextHolder().getTransactionOperationManager().commit(); - - } - - /* - * (non-Javadoc) - * - * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#doRollback(org.springframework.transaction.support.DefaultTransactionStatus) - */ - public void doRollback(DefaultTransactionStatus status) - throws TransactionException { - ContextSourceTransactionObject txObject = (ContextSourceTransactionObject) status - .getTransaction(); - txObject.getContextHolder().getTransactionOperationManager().rollback(); - } - - /* - * (non-Javadoc) - * - * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#doCleanupAfterCompletion(java.lang.Object) - */ - public void doCleanupAfterCompletion(Object transaction) { - log.debug("Cleaning stored ContextHolder"); - TransactionSynchronizationManager.unbindResource(contextSource); - - ContextSourceTransactionObject txObject = (ContextSourceTransactionObject) transaction; - DirContext ctx = txObject.getContextHolder().getCtx(); - - try { - log.debug("Closing target context"); - ctx.close(); - } catch (NamingException e) { - e.printStackTrace(); - } - - txObject.getContextHolder().clear(); - } - - /** - * Set the {@link TempEntryRenamingStrategy} to be used when renaming - * temporary entries in unbind and rebind operations. Default value is a - * {@link DefaultTempEntryRenamingStrategy}. - * - * @param renamingStrategy - * the {@link TempEntryRenamingStrategy} to use. - */ - public void setRenamingStrategy(TempEntryRenamingStrategy renamingStrategy) { - this.renamingStrategy = renamingStrategy; - } - -} diff --git a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionObject.java b/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionObject.java deleted file mode 100644 index 46b99c53..00000000 --- a/spring-ldap/src/main/java/org/springframework/ldap/transaction/support/ContextSourceTransactionObject.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2002-2007 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.ldap.transaction.support; - -import org.springframework.ldap.transaction.DirContextHolder; - -/** - * Transaction object for ContextSourceTransactionManager. Keeps a reference to - * the {@link DirContextHolder} associated with the current transaction. - * - * @author Mattias Arthursson - */ -public class ContextSourceTransactionObject { - private DirContextHolder contextHolder; - - /** - * Constructor. - * - * @param contextHolder - * the DirContextHolder associated with the current transaction. - */ - public ContextSourceTransactionObject(DirContextHolder contextHolder) { - this.contextHolder = contextHolder; - } - - /** - * Get the DirContextHolder. - * - * @return the DirContextHolder. - */ - public DirContextHolder getContextHolder() { - return contextHolder; - } - - /** - * Set the DirContextHolder associated with the current transaction.s - * - * @param contextHolder - * the DirContextHolder associated with the current transaction. - */ - public void setContextHolder(DirContextHolder contextHolder) { - this.contextHolder = contextHolder; - } -} \ No newline at end of file diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/CompensatingTransactionOperationFactory.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/CompensatingTransactionOperationFactory.java index 50d08073..947190b2 100644 --- a/spring-ldap/src/main/java/org/springframework/transaction/compensating/CompensatingTransactionOperationFactory.java +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/CompensatingTransactionOperationFactory.java @@ -15,6 +15,8 @@ */ package org.springframework.transaction.compensating; +import org.springframework.transaction.compensating.support.DefaultCompensatingTransactionOperationManager; + /** * Factory interface for creating * {@link CompensatingTransactionOperationRecorder} objects based on operation diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/package.html b/spring-ldap/src/main/java/org/springframework/transaction/compensating/package.html new file mode 100644 index 00000000..6d166abe --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/package.html @@ -0,0 +1,8 @@ + + + +Interface definitions for a general Compensating Transaction framework +based on PlatformTransactionManager. + + + diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/AbstractCompensatingTransactionManagerDelegate.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/AbstractCompensatingTransactionManagerDelegate.java new file mode 100644 index 00000000..13aadb48 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/AbstractCompensatingTransactionManagerDelegate.java @@ -0,0 +1,142 @@ +/* + * Copyright 2002-2007 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.compensating.support; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.ldap.transaction.core.ContextSourceTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionException; +import org.springframework.transaction.support.DefaultTransactionStatus; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +/** + * Abstract superclass for Compensating TransactionManager delegates. The actual + * transaction work is extracted to a delegate to enable composite Transaction + * Managers. + * + * @author Mattias Arthursson + * + */ +public abstract class AbstractCompensatingTransactionManagerDelegate { + + private static Log log = LogFactory + .getLog(ContextSourceTransactionManager.class); + + /** + * Close the target resource - the implementation specific resource held in + * the specified {@link CompensatingTransactionHolderSupport}. + * + * @param transactionHolderSupport + * the {@link CompensatingTransactionHolderSupport} that holds + * the transaction specific target resource. + */ + protected abstract void closeTargetResource( + CompensatingTransactionHolderSupport transactionHolderSupport); + + /** + * Get a new implementation specific + * {@link CompensatingTransactionHolderSupport} instance. + * + * @return a new {@link CompensatingTransactionHolderSupport} instance. + */ + protected abstract CompensatingTransactionHolderSupport getNewHolder(); + + /** + * Get the key (normally, a DataSource or similar) that should be used for + * transaction synchronization. + * + * @return the transaction synchronization key + */ + protected abstract Object getTransactionSynchronizationKey(); + + /* + * (non-Javadoc) + * + * @see org.springframework.jdbc.datasource.DataSourceTransactionManager#doGetTransaction() + */ + public Object doGetTransaction() throws TransactionException { + CompensatingTransactionHolderSupport holder = (CompensatingTransactionHolderSupport) TransactionSynchronizationManager + .getResource(getTransactionSynchronizationKey()); + CompensatingTransactionObject txObject = new CompensatingTransactionObject( + holder); + return txObject; + } + + /* + * (non-Javadoc) + * + * @see org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin(java.lang.Object, + * org.springframework.transaction.TransactionDefinition) + */ + public void doBegin(Object transaction, TransactionDefinition definition) + throws TransactionException { + CompensatingTransactionObject txObject = (CompensatingTransactionObject) transaction; + + if (txObject.getHolder() == null) { + CompensatingTransactionHolderSupport contextHolder = getNewHolder(); + txObject.setHolder(contextHolder); + + TransactionSynchronizationManager.bindResource( + getTransactionSynchronizationKey(), contextHolder); + } + } + + /* + * (non-Javadoc) + * + * @see org.springframework.jdbc.datasource.DataSourceTransactionManager#doCommit(org.springframework.transaction.support.DefaultTransactionStatus) + */ + public void doCommit(DefaultTransactionStatus status) + throws TransactionException { + CompensatingTransactionObject txObject = (CompensatingTransactionObject) status + .getTransaction(); + txObject.getHolder().getTransactionOperationManager().commit(); + + } + + /* + * (non-Javadoc) + * + * @see org.springframework.jdbc.datasource.DataSourceTransactionManager#doRollback(org.springframework.transaction.support.DefaultTransactionStatus) + */ + public void doRollback(DefaultTransactionStatus status) + throws TransactionException { + CompensatingTransactionObject txObject = (CompensatingTransactionObject) status + .getTransaction(); + txObject.getHolder().getTransactionOperationManager().rollback(); + } + + /* + * (non-Javadoc) + * + * @see org.springframework.jdbc.datasource.DataSourceTransactionManager#doCleanupAfterCompletion(java.lang.Object) + */ + public void doCleanupAfterCompletion(Object transaction) { + log.debug("Cleaning stored transaction synchronization"); + TransactionSynchronizationManager + .unbindResource(getTransactionSynchronizationKey()); + + CompensatingTransactionObject txObject = (CompensatingTransactionObject) transaction; + CompensatingTransactionHolderSupport transactionHolderSupport = (CompensatingTransactionHolderSupport) txObject + .getHolder(); + + closeTargetResource(transactionHolderSupport); + + txObject.getHolder().clear(); + } + +} \ No newline at end of file diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionHolderSupport.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionHolderSupport.java new file mode 100644 index 00000000..d528e53c --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionHolderSupport.java @@ -0,0 +1,78 @@ +/* + * Copyright 2002-2007 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.compensating.support; + +import org.springframework.ldap.transaction.compensating.LdapCompensatingTransactionOperationFactory; +import org.springframework.transaction.compensating.CompensatingTransactionOperationFactory; +import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; +import org.springframework.transaction.support.ResourceHolderSupport; + +/** + * Base class for compensating transaction resource holders. + * + * @author Mattias Arthursson + */ +public abstract class CompensatingTransactionHolderSupport extends + ResourceHolderSupport { + + private CompensatingTransactionOperationManager transactionOperationManager; + + /** + * This method creates a new TransactionOperationManager instance. To be + * called by subclass in case the target object has changed. + */ + protected void refreshTransactionOperationManager() { + setTransactionOperationManager(new DefaultCompensatingTransactionOperationManager( + createOperationFactory())); + } + + /** + * Factory method to create a + * {@link CompensatingTransactionOperationFactory} using the settings and + * current state of this object. + * + * @return a new {@link LdapCompensatingTransactionOperationFactory} + * referncing the current transaction context. + */ + protected abstract CompensatingTransactionOperationFactory createOperationFactory(); + + public void clear() { + super.clear(); + transactionOperationManager = null; + } + + /** + * Get the CompensatingTransactionOperationManager to handle the data for + * the current transaction. + * + * @return the CompensatingTransactionOperationManager. + */ + public CompensatingTransactionOperationManager getTransactionOperationManager() { + return transactionOperationManager; + } + + /** + * Set the CompensatingTransactionOperationManager. For testing purposes + * only. + * + * @param transactionOperationManager + * the CompensatingTransactionOperationManager to use. + */ + public void setTransactionOperationManager( + CompensatingTransactionOperationManager transactionOperationManager) { + this.transactionOperationManager = transactionOperationManager; + } +} \ No newline at end of file diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionObject.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionObject.java new file mode 100644 index 00000000..5b255366 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionObject.java @@ -0,0 +1,61 @@ +/* + * Copyright 2002-2007 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.compensating.support; + +import org.springframework.ldap.transaction.compensating.DirContextHolder; + +/** + * Transaction object for ContextSourceTransactionManager. Keeps a reference to + * the {@link DirContextHolder} associated with the current transaction. + * + * @author Mattias Arthursson + */ +public class CompensatingTransactionObject { + private CompensatingTransactionHolderSupport holder; + + /** + * Constructor. + * + * @param holder + * the {@link CompensatingTransactionHolderSupport} associated + * with the current transaction. + */ + public CompensatingTransactionObject( + CompensatingTransactionHolderSupport holder) { + this.holder = holder; + } + + /** + * Get the DirContextHolder. + * + * @return the DirContextHolder. + */ + public CompensatingTransactionHolderSupport getHolder() { + return holder; + } + + /** + * Set the {@link CompensatingTransactionHolderSupport} associated with the + * current transaction. + * + * @param holder + * the {@link CompensatingTransactionHolderSupport} associated + * with the current transaction. + */ + public void setHolder(CompensatingTransactionHolderSupport holder) { + this.holder = holder; + } +} \ No newline at end of file diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtils.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtils.java new file mode 100644 index 00000000..afd8c474 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtils.java @@ -0,0 +1,57 @@ +package org.springframework.transaction.compensating.support; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +/** + * Common methods for use with compensating transactions. + * + * @author Mattias Arthursson + */ +public class CompensatingTransactionUtils { + + /** + * Not to be instantiated. + */ + private CompensatingTransactionUtils() { + } + + /** + * Perform the specified operation, storing the state prior to the + * operation, to enable commit/rollback later. If no transaction is + * currently active, proceed with the original call on the target. + * + * @param synchronizationKey + * the transaction synchronization key we are operating on + * (typically something similar to a DataSource). + * @param target + * the actual target resource that should be used for invoking + * the operation on should no transaction be active. + * @param method + * name of the method to be invoked. + * @param args + * arguments with which the operation is invoked. + */ + public static void performOperation(Object synchronizationKey, + Object target, Method method, Object[] args) throws Throwable { + CompensatingTransactionHolderSupport transactionContextHolder = (CompensatingTransactionHolderSupport) TransactionSynchronizationManager + .getResource(synchronizationKey); + if (transactionContextHolder != null) { + + CompensatingTransactionOperationManager transactionDataManager = transactionContextHolder + .getTransactionOperationManager(); + transactionDataManager.performOperation(method.getName(), args); + } else { + // Perform the target operation + try { + method.invoke(target, args); + } catch (InvocationTargetException e) { + throw e.getTargetException(); + } + } + } + +} diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManager.java b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManager.java similarity index 88% rename from spring-ldap/src/main/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManager.java rename to spring-ldap/src/main/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManager.java index 9e89caad..d0db7e82 100644 --- a/spring-ldap/src/main/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManager.java +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManager.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.transaction.compensating; +package org.springframework.transaction.compensating.support; import java.util.Iterator; import java.util.Stack; @@ -21,6 +21,10 @@ import java.util.Stack; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.transaction.TransactionSystemException; +import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; +import org.springframework.transaction.compensating.CompensatingTransactionOperationFactory; +import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; +import org.springframework.transaction.compensating.CompensatingTransactionOperationRecorder; /** * Default implementation of {@link CompensatingTransactionOperationManager}. diff --git a/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/package.html b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/package.html new file mode 100644 index 00000000..383254c7 --- /dev/null +++ b/spring-ldap/src/main/java/org/springframework/transaction/compensating/support/package.html @@ -0,0 +1,9 @@ + + + +Support package for general Compensating Transaction Framework. +Contains default implementations of core interfaces as well as useful +helper classes. + + + diff --git a/spring-ldap/src/test/java/org/springframework/ldap/support/TransactionUtilsTest.java b/spring-ldap/src/test/java/org/springframework/ldap/support/TransactionUtilsTest.java deleted file mode 100644 index ee074722..00000000 --- a/spring-ldap/src/test/java/org/springframework/ldap/support/TransactionUtilsTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package org.springframework.ldap.support; - -import java.lang.reflect.Method; - -import javax.naming.NamingException; -import javax.naming.directory.DirContext; - -import junit.framework.TestCase; - -import org.easymock.MockControl; -import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextHolder; -import org.springframework.ldap.transaction.TransactionUtils; -import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -public class TransactionUtilsTest extends TestCase { - - private MockControl dirContextControl; - - private DirContext dirContextMock; - - private MockControl contextSourceControl; - - private ContextSource contextSourceMock; - - private MockControl operationManagerControl; - - private CompensatingTransactionOperationManager operationManagerMock; - - protected void setUp() throws Exception { - dirContextControl = MockControl.createControl(DirContext.class); - dirContextMock = (DirContext) dirContextControl.getMock(); - - contextSourceControl = MockControl.createControl(ContextSource.class); - contextSourceMock = (ContextSource) contextSourceControl.getMock(); - - operationManagerControl = MockControl - .createControl(CompensatingTransactionOperationManager.class); - operationManagerMock = (CompensatingTransactionOperationManager) operationManagerControl - .getMock(); - - if (TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.clearSynchronization(); - } - } - - protected void tearDown() throws Exception { - dirContextControl = null; - dirContextMock = null; - - contextSourceControl = null; - contextSourceMock = null; - - operationManagerControl = null; - operationManagerMock = null; - } - - protected void replay() { - dirContextControl.replay(); - contextSourceControl.replay(); - operationManagerControl.replay(); - } - - protected void verify() { - dirContextControl.verify(); - contextSourceControl.verify(); - operationManagerControl.verify(); - } - - public void testCloseContext() throws NamingException { - dirContextMock.close(); - - replay(); - LdapUtils.closeContext(dirContextMock); - verify(); - } - - public void testCloseContext_NullContext() throws NamingException { - replay(); - LdapUtils.closeContext(null); - verify(); - } - - public void testDoCloseConnection_NoTransaction() throws NamingException { - dirContextMock.close(); - - replay(); - TransactionUtils.doCloseConnection(dirContextMock, contextSourceMock); - verify(); - } - - public void testDoCloseConnection_ActiveTransaction() - throws NamingException { - DirContextHolder holder = new DirContextHolder(dirContextMock, null); - TransactionSynchronizationManager.bindResource(contextSourceMock, - holder); - - // Context should not be closed. - - replay(); - TransactionUtils.doCloseConnection(dirContextMock, contextSourceMock); - verify(); - } - - public void testDoCloseConnection_NotTransactionalContext() - throws NamingException { - DirContextHolder holder = new DirContextHolder(dirContextMock, null); - TransactionSynchronizationManager.bindResource(contextSourceMock, - holder); - - MockControl dirContextControl2 = MockControl - .createControl(DirContext.class); - DirContext dirContextMock2 = (DirContext) dirContextControl2.getMock(); - - dirContextMock2.close(); - - dirContextControl2.replay(); - replay(); - TransactionUtils.doCloseConnection(dirContextMock2, contextSourceMock); - verify(); - dirContextControl2.verify(); - } - - public void testIsSupportedWriteTransactionOperation() { - assertTrue(TransactionUtils.isSupportedWriteTransactionOperation("bind")); - assertTrue(TransactionUtils.isSupportedWriteTransactionOperation("rebind")); - assertTrue(TransactionUtils.isSupportedWriteTransactionOperation("unbind")); - assertTrue(TransactionUtils - .isSupportedWriteTransactionOperation("modifyAttributes")); - assertTrue(TransactionUtils.isSupportedWriteTransactionOperation("rename")); - assertFalse(TransactionUtils.isSupportedWriteTransactionOperation("lookup")); - assertFalse(TransactionUtils.isSupportedWriteTransactionOperation("search")); - } - - public void testPerformOperation() throws Throwable { - DirContextHolder holder = new DirContextHolder(dirContextMock, null); - holder.setTransactionOperationManager(operationManagerMock); - - TransactionSynchronizationManager.bindResource(contextSourceMock, - holder); - - Object[] expectedArgs = new Object[] { "someDn" }; - operationManagerMock.performOperation("unbind", expectedArgs); - - replay(); - TransactionUtils.performOperation(contextSourceMock, dirContextMock, - getUnbindMethod(), expectedArgs); - verify(); - } - - public void testPerformOperation_NoTransaction() throws Throwable { - Object[] expectedArgs = new Object[] { "someDn" }; - dirContextMock.unbind("someDn"); - - replay(); - TransactionUtils.performOperation(contextSourceMock, dirContextMock, - getUnbindMethod(), expectedArgs); - verify(); - } - - private Method getUnbindMethod() throws NoSuchMethodException { - return DirContext.class.getMethod("unbind", - new Class[] { String.class }); - } - - public void dummyMethod() { - - } - -} diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationExecutorTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationExecutorTest.java similarity index 91% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationExecutorTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationExecutorTest.java index a80835f1..a821ae27 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationExecutorTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationExecutorTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.directory.BasicAttributes; @@ -7,7 +7,7 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.BindOperationExecutor; +import org.springframework.ldap.transaction.compensating.BindOperationExecutor; public class BindOperationExecutorTest extends TestCase { private MockControl ldapOperationsControl; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationRecorderTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationRecorderTest.java similarity index 91% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationRecorderTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationRecorderTest.java index 021e9d52..7a5cf248 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/BindOperationRecorderTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/BindOperationRecorderTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.directory.BasicAttributes; @@ -7,8 +7,8 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.BindOperationExecutor; -import org.springframework.ldap.transaction.BindOperationRecorder; +import org.springframework.ldap.transaction.compensating.BindOperationExecutor; +import org.springframework.ldap.transaction.compensating.BindOperationRecorder; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; public class BindOperationRecorderTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactoryTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactoryTest.java similarity index 86% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactoryTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactoryTest.java index d8b02174..e03112de 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/LdapCompensatingTransactionOperationFactoryTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapCompensatingTransactionOperationFactoryTest.java @@ -1,16 +1,16 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.BindOperationRecorder; -import org.springframework.ldap.transaction.LdapCompensatingTransactionOperationFactory; -import org.springframework.ldap.transaction.ModifyAttributesOperationRecorder; -import org.springframework.ldap.transaction.RebindOperationRecorder; -import org.springframework.ldap.transaction.RenameOperationRecorder; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; -import org.springframework.ldap.transaction.UnbindOperationRecorder; +import org.springframework.ldap.transaction.compensating.BindOperationRecorder; +import org.springframework.ldap.transaction.compensating.LdapCompensatingTransactionOperationFactory; +import org.springframework.ldap.transaction.compensating.ModifyAttributesOperationRecorder; +import org.springframework.ldap.transaction.compensating.RebindOperationRecorder; +import org.springframework.ldap.transaction.compensating.RenameOperationRecorder; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.UnbindOperationRecorder; import org.springframework.transaction.compensating.CompensatingTransactionOperationRecorder; public class LdapCompensatingTransactionOperationFactoryTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtilsTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtilsTest.java new file mode 100644 index 00000000..9396d0b5 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/LdapTransactionUtilsTest.java @@ -0,0 +1,136 @@ +package org.springframework.ldap.transaction.compensating; + +import javax.naming.NamingException; +import javax.naming.directory.DirContext; + +import junit.framework.TestCase; + +import org.easymock.MockControl; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.support.LdapUtils; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.ldap.transaction.compensating.LdapTransactionUtils; +import org.springframework.transaction.compensating.support.CompensatingTransactionHolderSupport; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +public class LdapTransactionUtilsTest extends TestCase { + + private MockControl dirContextControl; + + private DirContext dirContextMock; + + private MockControl contextSourceControl; + + private ContextSource contextSourceMock; + + protected void setUp() throws Exception { + dirContextControl = MockControl.createControl(DirContext.class); + dirContextMock = (DirContext) dirContextControl.getMock(); + + contextSourceControl = MockControl.createControl(ContextSource.class); + contextSourceMock = (ContextSource) contextSourceControl.getMock(); + + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.clearSynchronization(); + } + } + + protected void tearDown() throws Exception { + dirContextControl = null; + dirContextMock = null; + + contextSourceControl = null; + contextSourceMock = null; + } + + protected void replay() { + dirContextControl.replay(); + contextSourceControl.replay(); + } + + protected void verify() { + dirContextControl.verify(); + contextSourceControl.verify(); + } + + public void testCloseContext() throws NamingException { + dirContextMock.close(); + + replay(); + LdapUtils.closeContext(dirContextMock); + verify(); + } + + public void testCloseContext_NullContext() throws NamingException { + replay(); + LdapUtils.closeContext(null); + verify(); + } + + public void testDoCloseConnection_NoTransaction() throws NamingException { + dirContextMock.close(); + + replay(); + LdapTransactionUtils.doCloseConnection(dirContextMock, + contextSourceMock); + verify(); + } + + public void testDoCloseConnection_ActiveTransaction() + throws NamingException { + CompensatingTransactionHolderSupport holder = new DirContextHolder( + dirContextMock, null); + TransactionSynchronizationManager.bindResource(contextSourceMock, + holder); + + // Context should not be closed. + + replay(); + LdapTransactionUtils.doCloseConnection(dirContextMock, + contextSourceMock); + verify(); + } + + public void testDoCloseConnection_NotTransactionalContext() + throws NamingException { + CompensatingTransactionHolderSupport holder = new DirContextHolder( + dirContextMock, null); + TransactionSynchronizationManager.bindResource(contextSourceMock, + holder); + + MockControl dirContextControl2 = MockControl + .createControl(DirContext.class); + DirContext dirContextMock2 = (DirContext) dirContextControl2.getMock(); + + dirContextMock2.close(); + + dirContextControl2.replay(); + replay(); + LdapTransactionUtils.doCloseConnection(dirContextMock2, + contextSourceMock); + verify(); + dirContextControl2.verify(); + } + + public void testIsSupportedWriteTransactionOperation() { + assertTrue(LdapTransactionUtils + .isSupportedWriteTransactionOperation("bind")); + assertTrue(LdapTransactionUtils + .isSupportedWriteTransactionOperation("rebind")); + assertTrue(LdapTransactionUtils + .isSupportedWriteTransactionOperation("unbind")); + assertTrue(LdapTransactionUtils + .isSupportedWriteTransactionOperation("modifyAttributes")); + assertTrue(LdapTransactionUtils + .isSupportedWriteTransactionOperation("rename")); + assertFalse(LdapTransactionUtils + .isSupportedWriteTransactionOperation("lookup")); + assertFalse(LdapTransactionUtils + .isSupportedWriteTransactionOperation("search")); + } + + public void dummyMethod() { + + } + +} diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutorTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutorTest.java similarity index 91% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutorTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutorTest.java index 9efb1f71..1a93bb75 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationExecutorTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationExecutorTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.Name; import javax.naming.directory.ModificationItem; @@ -6,7 +6,7 @@ import javax.naming.directory.ModificationItem; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.ModifyAttributesOperationExecutor; +import org.springframework.ldap.transaction.compensating.ModifyAttributesOperationExecutor; import junit.framework.TestCase; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorderTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorderTest.java similarity index 95% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorderTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorderTest.java index cf4a224d..d9380995 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/ModifyAttributesOperationRecorderTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/ModifyAttributesOperationRecorderTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.NamingException; import javax.naming.directory.Attribute; @@ -14,8 +14,8 @@ import org.easymock.MockControl; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.ModifyAttributesOperationExecutor; -import org.springframework.ldap.transaction.ModifyAttributesOperationRecorder; +import org.springframework.ldap.transaction.compensating.ModifyAttributesOperationExecutor; +import org.springframework.ldap.transaction.compensating.ModifyAttributesOperationRecorder; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; public class ModifyAttributesOperationRecorderTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationExecutorTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutorTest.java similarity index 93% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationExecutorTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutorTest.java index 64ad2ecb..0cc5ea22 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationExecutorTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationExecutorTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.directory.BasicAttributes; @@ -7,7 +7,7 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.RebindOperationExecutor; +import org.springframework.ldap.transaction.compensating.RebindOperationExecutor; public class RebindOperationExecutorTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationRecorderTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorderTest.java similarity index 88% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationRecorderTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorderTest.java index 9b7624a2..4e790f15 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RebindOperationRecorderTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RebindOperationRecorderTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import javax.naming.directory.BasicAttributes; @@ -7,9 +7,9 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.RebindOperationExecutor; -import org.springframework.ldap.transaction.RebindOperationRecorder; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.RebindOperationExecutor; +import org.springframework.ldap.transaction.compensating.RebindOperationRecorder; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; public class RebindOperationRecorderTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationExecutorTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutorTest.java similarity index 91% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationExecutorTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutorTest.java index 91b44d4d..a2cdbbc9 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationExecutorTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationExecutorTest.java @@ -1,9 +1,9 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.RenameOperationExecutor; +import org.springframework.ldap.transaction.compensating.RenameOperationExecutor; import junit.framework.TestCase; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationRecorderTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorderTest.java similarity index 85% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationRecorderTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorderTest.java index 8bfd578a..e334a316 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/RenameOperationRecorderTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/RenameOperationRecorderTest.java @@ -1,11 +1,11 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.RenameOperationExecutor; -import org.springframework.ldap.transaction.RenameOperationRecorder; +import org.springframework.ldap.transaction.compensating.RenameOperationExecutor; +import org.springframework.ldap.transaction.compensating.RenameOperationRecorder; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; public class RenameOperationRecorderTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationExecutorTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutorTest.java similarity index 91% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationExecutorTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutorTest.java index 75f3c960..cd221dd1 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationExecutorTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationExecutorTest.java @@ -1,11 +1,11 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.UnbindOperationExecutor; +import org.springframework.ldap.transaction.compensating.UnbindOperationExecutor; public class UnbindOperationExecutorTest extends TestCase { private MockControl ldapOperationsControl; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationRecorderTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorderTest.java similarity index 86% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationRecorderTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorderTest.java index aa2333dd..61028d81 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/UnbindOperationRecorderTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/UnbindOperationRecorderTest.java @@ -1,13 +1,13 @@ -package org.springframework.ldap.transaction; +package org.springframework.ldap.transaction.compensating; import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; -import org.springframework.ldap.transaction.UnbindOperationExecutor; -import org.springframework.ldap.transaction.UnbindOperationRecorder; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.UnbindOperationExecutor; +import org.springframework.ldap.transaction.compensating.UnbindOperationRecorder; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; public class UnbindOperationRecorderTest extends TestCase { diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategyTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategyTest.java similarity index 85% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategyTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategyTest.java index 0b0ac321..ad051dbb 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DefaultTempEntryRenamingStrategyTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DefaultTempEntryRenamingStrategyTest.java @@ -1,9 +1,9 @@ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.compensating.support; import javax.naming.Name; import org.springframework.ldap.core.DistinguishedName; -import org.springframework.ldap.transaction.support.DefaultTempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.support.DefaultTempEntryRenamingStrategy; import junit.framework.TestCase; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategyTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategyTest.java similarity index 79% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategyTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategyTest.java index ccca78c7..a9ae87b5 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/DifferentSubtreeTempEntryRenamingStrategyTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/compensating/support/DifferentSubtreeTempEntryRenamingStrategyTest.java @@ -1,9 +1,9 @@ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.compensating.support; import javax.naming.Name; import org.springframework.ldap.core.DistinguishedName; -import org.springframework.ldap.transaction.support.DifferentSubtreeTempEntryRenamingStrategy; +import org.springframework.ldap.transaction.compensating.support.DifferentSubtreeTempEntryRenamingStrategy; import junit.framework.TestCase; diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerTest.java similarity index 80% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerTest.java index 5a22e5ae..125e717f 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/ContextSourceTransactionManagerTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/core/ContextSourceTransactionManagerTest.java @@ -1,4 +1,4 @@ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import javax.naming.directory.DirContext; @@ -6,13 +6,14 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextHolder; -import org.springframework.ldap.transaction.TempEntryRenamingStrategy; -import org.springframework.ldap.transaction.support.ContextSourceTransactionManager; -import org.springframework.ldap.transaction.support.ContextSourceTransactionObject; -import org.springframework.ldap.transaction.support.TransactionAwareContextSourceProxy; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.ldap.transaction.compensating.TempEntryRenamingStrategy; +import org.springframework.ldap.transaction.core.ContextSourceTransactionManager; +import org.springframework.ldap.transaction.core.TransactionAwareContextSourceProxy; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; +import org.springframework.transaction.compensating.support.CompensatingTransactionHolderSupport; +import org.springframework.transaction.compensating.support.CompensatingTransactionObject; import org.springframework.transaction.support.DefaultTransactionStatus; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -99,19 +100,19 @@ public class ContextSourceTransactionManagerTest extends TestCase { Object result = tested.doGetTransaction(); assertNotNull(result); - assertTrue(result instanceof ContextSourceTransactionObject); - ContextSourceTransactionObject transactionObject = (ContextSourceTransactionObject) result; - assertNull(transactionObject.getContextHolder()); + assertTrue(result instanceof CompensatingTransactionObject); + CompensatingTransactionObject transactionObject = (CompensatingTransactionObject) result; + assertNull(transactionObject.getHolder()); } public void testDoGetTransactionTransactionActive() { - DirContextHolder expectedContextHolder = new DirContextHolder(null, + CompensatingTransactionHolderSupport expectedContextHolder = new DirContextHolder(null, null); TransactionSynchronizationManager.bindResource(contextSourceMock, expectedContextHolder); Object result = tested.doGetTransaction(); assertSame(expectedContextHolder, - ((ContextSourceTransactionObject) result).getContextHolder()); + ((CompensatingTransactionObject) result).getHolder()); } public void testDoBegin() { @@ -120,7 +121,7 @@ public class ContextSourceTransactionManagerTest extends TestCase { contextSourceControl.replay(); - ContextSourceTransactionObject expectedTransactionObject = new ContextSourceTransactionObject( + CompensatingTransactionObject expectedTransactionObject = new CompensatingTransactionObject( null); tested.doBegin(expectedTransactionObject, transactionDefinitionMock); @@ -147,9 +148,9 @@ public class ContextSourceTransactionManagerTest extends TestCase { transactionDataManagerMock.rollback(); transactionDataManagerControl.replay(); - ContextSourceTransactionObject transactionObject = new ContextSourceTransactionObject( + CompensatingTransactionObject transactionObject = new CompensatingTransactionObject( null); - transactionObject.setContextHolder(expectedContextHolder); + transactionObject.setHolder(expectedContextHolder); tested.doRollback(new DefaultTransactionStatus(transactionObject, false, false, false, false, null)); transactionDataManagerControl.verify(); @@ -164,7 +165,7 @@ public class ContextSourceTransactionManagerTest extends TestCase { contextMock.close(); contextControl.replay(); - tested.doCleanupAfterCompletion(new ContextSourceTransactionObject( + tested.doCleanupAfterCompletion(new CompensatingTransactionObject( expectedContextHolder)); contextControl.verify(); diff --git a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxyTest.java b/spring-ldap/src/test/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxyTest.java similarity index 92% rename from spring-ldap/src/test/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxyTest.java rename to spring-ldap/src/test/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxyTest.java index ea9d2933..ad4595a6 100644 --- a/spring-ldap/src/test/java/org/springframework/ldap/transaction/support/TransactionAwareContextSourceProxyTest.java +++ b/spring-ldap/src/test/java/org/springframework/ldap/transaction/core/TransactionAwareContextSourceProxyTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.ldap.transaction.support; +package org.springframework.ldap.transaction.core; import javax.naming.directory.DirContext; import javax.naming.ldap.LdapContext; @@ -22,8 +22,8 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ldap.core.ContextSource; -import org.springframework.ldap.transaction.DirContextProxy; -import org.springframework.ldap.transaction.support.TransactionAwareContextSourceProxy; +import org.springframework.ldap.core.DirContextProxy; +import org.springframework.ldap.transaction.core.TransactionAwareContextSourceProxy; /** * Tests for {@link TransactionAwareContextSourceProxy}. diff --git a/spring-ldap/src/test/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtilsTest.java b/spring-ldap/src/test/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtilsTest.java new file mode 100644 index 00000000..e34f5fb3 --- /dev/null +++ b/spring-ldap/src/test/java/org/springframework/transaction/compensating/support/CompensatingTransactionUtilsTest.java @@ -0,0 +1,107 @@ +package org.springframework.transaction.compensating.support; + +import java.lang.reflect.Method; + +import javax.naming.directory.DirContext; + +import junit.framework.TestCase; + +import org.easymock.MockControl; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.transaction.compensating.DirContextHolder; +import org.springframework.transaction.compensating.CompensatingTransactionOperationManager; +import org.springframework.transaction.compensating.support.CompensatingTransactionHolderSupport; +import org.springframework.transaction.compensating.support.CompensatingTransactionUtils; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +public class CompensatingTransactionUtilsTest extends TestCase { + + private MockControl dirContextControl; + + private DirContext dirContextMock; + + private MockControl contextSourceControl; + + private ContextSource contextSourceMock; + + private MockControl operationManagerControl; + + private CompensatingTransactionOperationManager operationManagerMock; + + protected void setUp() throws Exception { + dirContextControl = MockControl.createControl(DirContext.class); + dirContextMock = (DirContext) dirContextControl.getMock(); + + contextSourceControl = MockControl.createControl(ContextSource.class); + contextSourceMock = (ContextSource) contextSourceControl.getMock(); + + operationManagerControl = MockControl + .createControl(CompensatingTransactionOperationManager.class); + operationManagerMock = (CompensatingTransactionOperationManager) operationManagerControl + .getMock(); + + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.clearSynchronization(); + } + } + + protected void tearDown() throws Exception { + dirContextControl = null; + dirContextMock = null; + + contextSourceControl = null; + contextSourceMock = null; + + operationManagerControl = null; + operationManagerMock = null; + } + + protected void replay() { + dirContextControl.replay(); + contextSourceControl.replay(); + operationManagerControl.replay(); + } + + protected void verify() { + dirContextControl.verify(); + contextSourceControl.verify(); + operationManagerControl.verify(); + } + + + public void testPerformOperation() throws Throwable { + CompensatingTransactionHolderSupport holder = new DirContextHolder(dirContextMock, null); + holder.setTransactionOperationManager(operationManagerMock); + + TransactionSynchronizationManager.bindResource(contextSourceMock, + holder); + + Object[] expectedArgs = new Object[] { "someDn" }; + operationManagerMock.performOperation("unbind", expectedArgs); + + replay(); + CompensatingTransactionUtils.performOperation(contextSourceMock, dirContextMock, + getUnbindMethod(), expectedArgs); + verify(); + } + + public void testPerformOperation_NoTransaction() throws Throwable { + Object[] expectedArgs = new Object[] { "someDn" }; + dirContextMock.unbind("someDn"); + + replay(); + CompensatingTransactionUtils.performOperation(contextSourceMock, dirContextMock, + getUnbindMethod(), expectedArgs); + verify(); + } + + private Method getUnbindMethod() throws NoSuchMethodException { + return DirContext.class.getMethod("unbind", + new Class[] { String.class }); + } + + public void dummyMethod() { + + } + +} diff --git a/spring-ldap/src/test/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManagerTest.java b/spring-ldap/src/test/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManagerTest.java similarity index 94% rename from spring-ldap/src/test/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManagerTest.java rename to spring-ldap/src/test/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManagerTest.java index 6d025960..94ca480a 100644 --- a/spring-ldap/src/test/java/org/springframework/transaction/compensating/DefaultCompensatingTransactionOperationManagerTest.java +++ b/spring-ldap/src/test/java/org/springframework/transaction/compensating/support/DefaultCompensatingTransactionOperationManagerTest.java @@ -1,4 +1,4 @@ -package org.springframework.transaction.compensating; +package org.springframework.transaction.compensating.support; import java.util.Stack; @@ -9,7 +9,7 @@ import org.springframework.transaction.TransactionSystemException; import org.springframework.transaction.compensating.CompensatingTransactionOperationExecutor; import org.springframework.transaction.compensating.CompensatingTransactionOperationFactory; import org.springframework.transaction.compensating.CompensatingTransactionOperationRecorder; -import org.springframework.transaction.compensating.DefaultCompensatingTransactionOperationManager; +import org.springframework.transaction.compensating.support.DefaultCompensatingTransactionOperationManager; public class DefaultCompensatingTransactionOperationManagerTest extends TestCase {