diff --git a/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDao.java b/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDao.java index d2226234..2fc44c4a 100644 --- a/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDao.java +++ b/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDao.java @@ -1,4 +1,28 @@ package org.springframework.ldap.support.transaction; public interface DummyDao { + void createWithException(String country, String company, String fullname, + String lastname, String description); + + void create(String country, String company, String fullname, + String lastname, String description); + + void update(String dn, String lastname, String description); + + void updateWithException(String dn, String lastname, String description); + + void updateAndRename(String dn, String newDn, String description); + + void updateAndRenameWithException(String dn, String newDn, + String description); + + void modifyAttributes(String dn, String lastName, String description); + + void modifyAttributesWithException(String dn, String lastName, + String description); + + void unbind(String dn); + + void unbindWithException(String dn); + } diff --git a/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDaoImpl.java b/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDaoImpl.java index 9d1d1396..827f419c 100644 --- a/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDaoImpl.java +++ b/sandbox/src/itest/java/org/springframework/ldap/support/transaction/DummyDaoImpl.java @@ -5,7 +5,7 @@ import org.springframework.ldap.core.DirContextAdapter; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapTemplate; -public class DummyDaoImpl implements DummyDao { +public class DummyDaoImpl implements DummyDao{ private LdapTemplate ldapTemplate; private JdbcTemplate jdbcTemplate; @@ -25,6 +25,9 @@ public class DummyDaoImpl implements DummyDao { * java.lang.String, java.lang.String, java.lang.String, * java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#createWithException(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ public void createWithException(String country, String company, String fullname, String lastname, String description) { create(country, company, fullname, lastname, description); @@ -38,6 +41,9 @@ public class DummyDaoImpl implements DummyDao { * java.lang.String, java.lang.String, java.lang.String, * java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#create(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ public void create(String country, String company, String fullname, String lastname, String description) { DistinguishedName dn = new DistinguishedName(); @@ -60,6 +66,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#update(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#update(java.lang.String, java.lang.String, java.lang.String) + */ public void update(String dn, String lastname, String description) { DirContextAdapter ctx = (DirContextAdapter) ldapTemplate.lookup(dn); ctx.setAttributeValue("sn", lastname); @@ -75,6 +84,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#updateWithException(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#updateWithException(java.lang.String, java.lang.String, java.lang.String) + */ public void updateWithException(String dn, String lastname, String description) { update(dn, lastname, description); @@ -87,6 +99,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#updateAndRename(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#updateAndRename(java.lang.String, java.lang.String, java.lang.String) + */ public void updateAndRename(String dn, String newDn, String description) { DirContextAdapter ctx = (DirContextAdapter) ldapTemplate.lookup(dn); ctx.setAttributeValue("description", description); @@ -103,6 +118,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#updateAndRenameWithException(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#updateAndRenameWithException(java.lang.String, java.lang.String, java.lang.String) + */ public void updateAndRenameWithException(String dn, String newDn, String description) { updateAndRename(dn, newDn, description); @@ -115,6 +133,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#modifyAttributes(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#modifyAttributes(java.lang.String, java.lang.String, java.lang.String) + */ public void modifyAttributes(String dn, String lastName, String description) { DirContextAdapter ctx = (DirContextAdapter) ldapTemplate.lookup(dn); ctx.setAttributeValue("sn", lastName); @@ -129,6 +150,9 @@ public class DummyDaoImpl implements DummyDao { * @see org.springframework.ldap.support.transaction.DummyDao#modifyAttributesWithException(java.lang.String, * java.lang.String, java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#modifyAttributesWithException(java.lang.String, java.lang.String, java.lang.String) + */ public void modifyAttributesWithException(String dn, String lastName, String description) { modifyAttributes(dn, lastName, description); @@ -140,6 +164,9 @@ public class DummyDaoImpl implements DummyDao { * * @see org.springframework.ldap.support.transaction.DummyDao#unbind(java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#unbind(java.lang.String) + */ public void unbind(String dn) { ldapTemplate.unbind(dn); } @@ -149,6 +176,9 @@ public class DummyDaoImpl implements DummyDao { * * @see org.springframework.ldap.support.transaction.DummyDao#unbindWithException(java.lang.String) */ + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.TempDummyDao#unbindWithException(java.lang.String) + */ public void unbindWithException(String dn) { unbind(dn); throw new DummyException("This operation failed."); diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultCompensatingTransactionDataManager.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultCompensatingTransactionDataManager.java index 0064cd84..c480bfb6 100644 --- a/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultCompensatingTransactionDataManager.java +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultCompensatingTransactionDataManager.java @@ -79,8 +79,12 @@ public class DefaultCompensatingTransactionDataManager implements this.rollbackOperations = rollbackOperations; } + /* (non-Javadoc) + * @see org.springframework.ldap.support.transaction.CompensatingTransactionDataManager#commit() + */ public void commit() { log.debug("Performing rollback"); + // TODO: Should this really be done in reverse order? while (!rollbackOperations.isEmpty()) { CompensatingTransactionRollbackOperation rollbackOperation = (CompensatingTransactionRollbackOperation) rollbackOperations .pop(); diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategy.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategy.java new file mode 100644 index 00000000..e6aae2ae --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategy.java @@ -0,0 +1,94 @@ +/* + * 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.support.transaction; + +import java.util.List; + +import javax.naming.Name; + +import org.springframework.ldap.core.DistinguishedName; +import org.springframework.ldap.core.LdapRdn; +import org.springframework.ldap.core.LdapRdnComponent; + +/** + * Default implementation of {@link TempEntryRenamingStrategy}. This + * implementation simply adds "_temp" to the leftmost (least siginificant part) + * of the name, e.g.:
+ * + * + * cn=john doe, ou=company1, c=SE + * + * + * becomes + * + * + * cn=john doe_temp, ou=company1, c=SE + * . + *

+ * Note that using this strategy means that the entry remains in virtually the + * same location as where it originally resided. This means that searches later + * in the same transaction might return references to the temporary entry even + * though it should have been removed or rebound. + * + * @author Mattias Arthursson + */ +public class DefaultTempEntryRenamingStrategy implements + TempEntryRenamingStrategy { + + /** + * The default temp entry suffix, "_temp". + */ + public static final String DEFAULT_TEMP_SUFFIX = "_temp"; + + private String tempSuffix = DEFAULT_TEMP_SUFFIX; + + /* + * (non-Javadoc) + * + * @see org.springframework.ldap.support.transaction.TempEntryRenamingStrategy#getTemporaryName(javax.naming.Name) + */ + public Name getTemporaryName(Name originalName) { + DistinguishedName temporaryName = new DistinguishedName(originalName); + List names = temporaryName.getNames(); + LdapRdn rdn = (LdapRdn) names.get(names.size() - 1); + LdapRdnComponent rdnComponent = rdn.getComponent(); + String value = rdnComponent.getValue(); + rdnComponent.setValue(value + DEFAULT_TEMP_SUFFIX); + + return temporaryName; + } + + /** + * Get the suffix that will be used for renaming temporary entries. + * + * @return the suffix. + */ + public String getTempSuffix() { + return tempSuffix; + } + + /** + * Set the suffix to use for renaming temporary entries. Default value is + * {@link #DEFAULT_TEMP_SUFFIX}. + * + * @param tempSuffix + * the suffix. + */ + public void setTempSuffix(String tempSuffix) { + this.tempSuffix = tempSuffix; + } + +} diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategy.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategy.java new file mode 100644 index 00000000..27dcaa65 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategy.java @@ -0,0 +1,75 @@ +package org.springframework.ldap.support.transaction; + +import java.util.List; + +import javax.naming.Name; + +import org.springframework.ldap.core.DistinguishedName; +import org.springframework.ldap.core.LdapRdn; +import org.springframework.ldap.core.LdapRdnComponent; + +/** + * A {@link TempEntryRenamingStrategy} that moves the entry to a different + * subtree than the original entry. The specified subtree needs to be present in + * the LDAP tree; it will not be created and operations using this strategy will + * fail if it is not in place. However, this strategy is preferrable to + * {@link DefaultTempEntryRenamingStrategy}, as it makes it possible to have + * searches have the expected result even though the temporary entry still exits + * until the end of the transaction. + *

+ * Example: If the specified subtreeNode is + * ou=tempEntries and the originalName is + * cn=john doe, ou=company1, c=SE, the result of + * {@link #getTemporaryName(Name)} will be + * cn=john doe1, ou=tempEntries. The "1" suffix is a + * sequence number needed to prevent potential collisions in the temporary + * storage. + * + * @author Mattias Arthursson + * + */ +public class DifferentSubtreeTempEntryRenamingStrategy implements + TempEntryRenamingStrategy { + + private Name subtreeNode; + + private static int nextSequenceNo = 1; + + public DifferentSubtreeTempEntryRenamingStrategy(Name subtreeNode) { + this.subtreeNode = subtreeNode; + } + + public Name getSubtreeNode() { + return subtreeNode; + } + + public void setSubtreeNode(Name subtreeNode) { + this.subtreeNode = subtreeNode; + } + + int getNextSequenceNo() { + return nextSequenceNo; + } + + /* + * (non-Javadoc) + * + * @see org.springframework.ldap.support.transaction.TempEntryRenamingStrategy#getTemporaryName(javax.naming.Name) + */ + public Name getTemporaryName(Name originalName) { + DistinguishedName tempName = new DistinguishedName(originalName); + List names = tempName.getNames(); + LdapRdn rdn = (LdapRdn) names.get(names.size() - 1); + LdapRdnComponent component = rdn.getComponent(); + + LdapRdn newRdn; + synchronized (this) { + newRdn = new LdapRdn(component.getKey(), component.getValue() + + nextSequenceNo++); + } + + DistinguishedName newName = new DistinguishedName(subtreeNode); + newName.add(newRdn); + return newName; + } +} diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/RebindRecordingOperation.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/RebindRecordingOperation.java index 7c782082..675f670f 100644 --- a/sandbox/src/main/java/org/springframework/ldap/support/transaction/RebindRecordingOperation.java +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/RebindRecordingOperation.java @@ -15,17 +15,10 @@ */ package org.springframework.ldap.support.transaction; -import java.util.List; - import javax.naming.Name; import javax.naming.directory.Attributes; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.core.LdapRdn; -import org.springframework.ldap.core.LdapRdnComponent; /** * A {@link CompensatingTransactionRecordingOperation} keeping track of a rebind @@ -37,10 +30,10 @@ import org.springframework.ldap.core.LdapRdnComponent; public class RebindRecordingOperation implements CompensatingTransactionRecordingOperation { - private static Log log = LogFactory.getLog(RebindRecordingOperation.class); - private LdapOperations ldapOperations; + private TempEntryRenamingStrategy renamingStrategy; + /** * Constructor. * @@ -73,24 +66,13 @@ public class RebindRecordingOperation implements attributes = (Attributes) args[2]; } - Name temporaryName = getTemporaryName(dn); + Name temporaryName = renamingStrategy.getTemporaryName(dn); ldapOperations.rename(dn, temporaryName); return new RebindRollbackOperation(ldapOperations, dn, temporaryName, object, attributes); } - Name getTemporaryName(Name originalName) { - DistinguishedName temporaryName = new DistinguishedName(originalName); - List names = temporaryName.getNames(); - LdapRdn rdn = (LdapRdn) names.get(names.size() - 1); - LdapRdnComponent rdnComponent = rdn.getComponent(); - String value = rdnComponent.getValue(); - rdnComponent.setValue(value + "_temp"); - - return temporaryName; - } - /** * Get the LdapOperations. For testing purposes. * @@ -99,4 +81,12 @@ public class RebindRecordingOperation implements LdapOperations getLdapOperations() { return ldapOperations; } + + public TempEntryRenamingStrategy getRenamingStrategy() { + return renamingStrategy; + } + + public void setRenamingStrategy(TempEntryRenamingStrategy renamingStrategy) { + this.renamingStrategy = renamingStrategy; + } } diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/TempEntryRenamingStrategy.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/TempEntryRenamingStrategy.java new file mode 100644 index 00000000..4033fe6a --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/TempEntryRenamingStrategy.java @@ -0,0 +1,37 @@ +/* + * 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.support.transaction; + +import javax.naming.Name; + +/** + * Interface for different strategies to rename temporary entries for unbind and + * rebind operations. + * + * @author Mattias Arthursson + */ +public interface TempEntryRenamingStrategy { + + /** + * Get a temporary name for the current entry to be renamed to. + * + * @param originalName + * The original name of the entry. + * @return The name to which the entry should be temporarily renamed + * according to this strategy. + */ + public Name getTemporaryName(Name originalName); +} diff --git a/sandbox/src/main/java/org/springframework/ldap/support/transaction/UnbindRecordingOperation.java b/sandbox/src/main/java/org/springframework/ldap/support/transaction/UnbindRecordingOperation.java index 3d53a805..2c1eb1a2 100644 --- a/sandbox/src/main/java/org/springframework/ldap/support/transaction/UnbindRecordingOperation.java +++ b/sandbox/src/main/java/org/springframework/ldap/support/transaction/UnbindRecordingOperation.java @@ -15,14 +15,9 @@ */ package org.springframework.ldap.support.transaction; -import java.util.List; - import javax.naming.Name; -import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import org.springframework.ldap.core.LdapRdn; -import org.springframework.ldap.core.LdapRdnComponent; /** * {@link CompensatingTransactionRecordingOperation} to keep track of unbind @@ -36,6 +31,8 @@ public class UnbindRecordingOperation implements private LdapOperations ldapOperations; + private TempEntryRenamingStrategy renamingStrategy = new DefaultTempEntryRenamingStrategy(); + /** * Constructor. * @@ -56,25 +53,23 @@ public class UnbindRecordingOperation implements public CompensatingTransactionRollbackOperation recordOperation( Object[] args) { Name dn = LdapUtils.getFirstArgumentAsName(args); - Name temporaryDn = getTemporaryName(dn); + Name temporaryDn = renamingStrategy.getTemporaryName(dn); ldapOperations.rename(dn, temporaryDn); return new BindRollbackOperation(ldapOperations, dn, temporaryDn); } - Name getTemporaryName(Name originalName) { - DistinguishedName temporaryName = new DistinguishedName(originalName); - List names = temporaryName.getNames(); - LdapRdn rdn = (LdapRdn) names.get(names.size() - 1); - LdapRdnComponent rdnComponent = rdn.getComponent(); - String value = rdnComponent.getValue(); - rdnComponent.setValue(value + "_temp"); - - return temporaryName; - } - LdapOperations getLdapOperations() { return ldapOperations; } + + public TempEntryRenamingStrategy getRenamingStrategy() { + return renamingStrategy; + } + + public void setRenamingStrategy(TempEntryRenamingStrategy renamingStrategy) { + this.renamingStrategy = renamingStrategy; + } + } diff --git a/sandbox/src/test/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategyTest.java b/sandbox/src/test/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategyTest.java new file mode 100644 index 00000000..e0fc35aa --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ldap/support/transaction/DefaultTempEntryRenamingStrategyTest.java @@ -0,0 +1,33 @@ +package org.springframework.ldap.support.transaction; + +import javax.naming.Name; + +import org.springframework.ldap.core.DistinguishedName; + +import junit.framework.TestCase; + +public class DefaultTempEntryRenamingStrategyTest extends TestCase { + + public void testGetTemporaryName() { + DistinguishedName expectedOriginalName = new DistinguishedName( + "cn=john doe, ou=somecompany, c=SE"); + DefaultTempEntryRenamingStrategy tested = new DefaultTempEntryRenamingStrategy(); + + Name result = tested.getTemporaryName(expectedOriginalName); + assertEquals("cn=john doe_temp, ou=somecompany, c=SE", result + .toString()); + assertNotSame(expectedOriginalName, result); + } + + public void testGetTemporaryDN_MultivalueDN() { + DistinguishedName expectedOriginalName = new DistinguishedName( + "cn=john doe+sn=doe, ou=somecompany, c=SE"); + DefaultTempEntryRenamingStrategy tested = new DefaultTempEntryRenamingStrategy(); + + Name result = tested.getTemporaryName(expectedOriginalName); + assertEquals("cn=john doe_temp+sn=doe, ou=somecompany, c=SE", result + .toString()); + } + + +} diff --git a/sandbox/src/test/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategyTest.java b/sandbox/src/test/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategyTest.java new file mode 100644 index 00000000..56d67167 --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ldap/support/transaction/DifferentSubtreeTempEntryRenamingStrategyTest.java @@ -0,0 +1,27 @@ +package org.springframework.ldap.support.transaction; + +import javax.naming.Name; + +import org.springframework.ldap.core.DistinguishedName; + +import junit.framework.TestCase; + +public class DifferentSubtreeTempEntryRenamingStrategyTest extends TestCase { + + public void testGetTemporaryName() { + DistinguishedName originalName = new DistinguishedName( + "cn=john doe, ou=somecompany, c=SE"); + DifferentSubtreeTempEntryRenamingStrategy tested = new DifferentSubtreeTempEntryRenamingStrategy( + new DistinguishedName("ou=tempEntries")); + + int nextSequenceNo = tested.getNextSequenceNo(); + + // Perform test + Name result = tested.getTemporaryName(originalName); + + // Verify result + assertEquals("cn=john doe" + nextSequenceNo + ", ou=tempEntries", + result.toString()); + } + +} diff --git a/sandbox/src/test/java/org/springframework/ldap/support/transaction/RebindRecordingOperationTest.java b/sandbox/src/test/java/org/springframework/ldap/support/transaction/RebindRecordingOperationTest.java index a59383fb..fd3b5e53 100644 --- a/sandbox/src/test/java/org/springframework/ldap/support/transaction/RebindRecordingOperationTest.java +++ b/sandbox/src/test/java/org/springframework/ldap/support/transaction/RebindRecordingOperationTest.java @@ -1,6 +1,5 @@ package org.springframework.ldap.support.transaction; -import javax.naming.Name; import javax.naming.directory.BasicAttributes; import junit.framework.TestCase; @@ -14,22 +13,38 @@ public class RebindRecordingOperationTest extends TestCase { private LdapOperations ldapOperationsMock; + private MockControl renamingStrategyControl; + + private TempEntryRenamingStrategy renamingStrategyMock; + protected void setUp() throws Exception { ldapOperationsControl = MockControl.createControl(LdapOperations.class); ldapOperationsMock = (LdapOperations) ldapOperationsControl.getMock(); + + renamingStrategyControl = MockControl + .createControl(TempEntryRenamingStrategy.class); + renamingStrategyMock = (TempEntryRenamingStrategy) renamingStrategyControl + .getMock(); + } protected void tearDown() throws Exception { ldapOperationsControl = null; ldapOperationsMock = null; + + renamingStrategyControl = null; + renamingStrategyMock = null; + } protected void replay() { ldapOperationsControl.replay(); + renamingStrategyControl.replay(); } protected void verify() { ldapOperationsControl.verify(); + renamingStrategyControl.verify(); } public void testRecordOperation() { @@ -38,18 +53,18 @@ public class RebindRecordingOperationTest extends TestCase { final DistinguishedName expectedTempDn = new DistinguishedName( "cn=john doe"); RebindRecordingOperation tested = new RebindRecordingOperation( - ldapOperationsMock) { - Name getTemporaryName(Name originalName) { - assertSame(expectedDn, originalName); - return expectedTempDn; - } - }; + ldapOperationsMock); + tested.setRenamingStrategy(renamingStrategyMock); + + renamingStrategyControl.expectAndReturn(renamingStrategyMock + .getTemporaryName(expectedDn), expectedTempDn); ldapOperationsMock.rename(expectedDn, expectedTempDn); replay(); Object expectedObject = new Object(); BasicAttributes expectedAttributes = new BasicAttributes(); + // perform test CompensatingTransactionRollbackOperation result = tested .recordOperation(new Object[] { expectedDn, expectedObject, diff --git a/sandbox/src/test/java/org/springframework/ldap/support/transaction/UnbindRecordingOperationTest.java b/sandbox/src/test/java/org/springframework/ldap/support/transaction/UnbindRecordingOperationTest.java index 61659879..9834902d 100644 --- a/sandbox/src/test/java/org/springframework/ldap/support/transaction/UnbindRecordingOperationTest.java +++ b/sandbox/src/test/java/org/springframework/ldap/support/transaction/UnbindRecordingOperationTest.java @@ -1,58 +1,48 @@ package org.springframework.ldap.support.transaction; -import javax.naming.Name; +import junit.framework.TestCase; import org.easymock.MockControl; -import org.springframework.ldap.core.DirContextAdapter; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapOperations; -import junit.framework.TestCase; - public class UnbindRecordingOperationTest extends TestCase { private MockControl ldapOperationsControl; private LdapOperations ldapOperationsMock; + private MockControl renamingStrategyControl; + + private TempEntryRenamingStrategy renamingStrategyMock; + protected void setUp() throws Exception { ldapOperationsControl = MockControl.createControl(LdapOperations.class); ldapOperationsMock = (LdapOperations) ldapOperationsControl.getMock(); + + renamingStrategyControl = MockControl + .createControl(TempEntryRenamingStrategy.class); + renamingStrategyMock = (TempEntryRenamingStrategy) renamingStrategyControl + .getMock(); + } protected void tearDown() throws Exception { ldapOperationsControl = null; ldapOperationsMock = null; + + renamingStrategyControl = null; + renamingStrategyMock = null; + } protected void replay() { ldapOperationsControl.replay(); + renamingStrategyControl.replay(); } protected void verify() { ldapOperationsControl.verify(); - } - - public void testGetTemporaryDN() { - DistinguishedName expectedOriginalName = new DistinguishedName( - "cn=john doe, ou=somecompany, c=SE"); - UnbindRecordingOperation tested = new UnbindRecordingOperation( - ldapOperationsMock); - - Name result = tested.getTemporaryName(expectedOriginalName); - assertEquals("cn=john doe_temp, ou=somecompany, c=SE", result - .toString()); - assertNotSame(expectedOriginalName, result); - } - - public void testGetTemporaryDN_MultivalueDN() { - DistinguishedName expectedOriginalName = new DistinguishedName( - "cn=john doe+sn=doe, ou=somecompany, c=SE"); - UnbindRecordingOperation tested = new UnbindRecordingOperation( - ldapOperationsMock); - - Name result = tested.getTemporaryName(expectedOriginalName); - assertEquals("cn=john doe_temp+sn=doe, ou=somecompany, c=SE", result - .toString()); + renamingStrategyControl.verify(); } public void testRecordOperation() { @@ -61,12 +51,11 @@ public class UnbindRecordingOperationTest extends TestCase { final DistinguishedName expectedDn = new DistinguishedName( "cn=john doe"); UnbindRecordingOperation tested = new UnbindRecordingOperation( - ldapOperationsMock) { - Name getTemporaryName(Name originalName) { - assertSame(expectedDn, originalName); - return expectedTempName; - } - }; + ldapOperationsMock); + tested.setRenamingStrategy(renamingStrategyMock); + + renamingStrategyControl.expectAndReturn(renamingStrategyMock + .getTemporaryName(expectedDn), expectedTempName); ldapOperationsMock.rename(expectedDn, expectedTempName);