diff --git a/core/src/main/java/org/springframework/ldap/odm/core/impl/DefaultObjectDirectoryMapper.java b/core/src/main/java/org/springframework/ldap/odm/core/impl/DefaultObjectDirectoryMapper.java index 6ad0f1f5..dc117165 100644 --- a/core/src/main/java/org/springframework/ldap/odm/core/impl/DefaultObjectDirectoryMapper.java +++ b/core/src/main/java/org/springframework/ldap/odm/core/impl/DefaultObjectDirectoryMapper.java @@ -419,7 +419,7 @@ public class DefaultObjectDirectoryMapper implements ObjectDirectoryMapper { EntityData entityData = getEntityData(entry.getClass()); if(entityData.metaData.canCalculateDn()) { Set dnAttributes = entityData.metaData.getDnAttributes(); - LdapNameBuilder ldapNameBuilder = LdapNameBuilder.newLdapName(entityData.metaData.getBase()); + LdapNameBuilder ldapNameBuilder = LdapNameBuilder.newInstance(entityData.metaData.getBase()); for (AttributeMetaData dnAttribute : dnAttributes) { Object dnFieldValue = ReflectionUtils.getField(dnAttribute.getField(), entry); diff --git a/core/src/main/java/org/springframework/ldap/support/LdapNameBuilder.java b/core/src/main/java/org/springframework/ldap/support/LdapNameBuilder.java index 1012c107..2981300d 100644 --- a/core/src/main/java/org/springframework/ldap/support/LdapNameBuilder.java +++ b/core/src/main/java/org/springframework/ldap/support/LdapNameBuilder.java @@ -26,6 +26,13 @@ import javax.naming.ldap.Rdn; /** * Helper class for building {@link javax.naming.ldap.LdapName} instances. * + * Note that the first part of a Distinguished Name is the least significant, which means that when adding components, + * they will be added to the beginning of the resulting string, e.g. + *
+ *     LdapNameBuilder.newInstance("dc=261consulting,dc=com").add("ou=people").build().toString();
+ * 
+ * will result in ou=people,dc=261consulting,dc=com. + * * @author Mattias Hellborg Arthursson * @since 2.0 */ @@ -52,7 +59,7 @@ public final class LdapNameBuilder { * * @return a new instance. */ - public static LdapNameBuilder newLdapName(Name name) { + public static LdapNameBuilder newInstance(Name name) { return new LdapNameBuilder(LdapUtils.newLdapName(name)); } @@ -62,7 +69,7 @@ public final class LdapNameBuilder { * * @return a new instance. */ - public static LdapNameBuilder newLdapName(String name) { + public static LdapNameBuilder newInstance(String name) { return new LdapNameBuilder(LdapUtils.newLdapName(name)); } @@ -85,6 +92,35 @@ public final class LdapNameBuilder { } } + /** + * Append the specified name to the currently built LdapName. + * + * @param name the name to add. + * @return this builder. + */ + public LdapNameBuilder add(Name name) { + Assert.notNull(name, "name must not be null"); + + try { + ldapName.addAll(ldapName.size(), name); + return this; + } catch (InvalidNameException e) { + throw new org.springframework.ldap.InvalidNameException(e); + } + } + + /** + * Append the LdapName represented by the specified string to the currently built LdapName. + * + * @param name the name to add. + * @return this builder. + */ + public LdapNameBuilder add(String name) { + Assert.notNull(name, "name must not be null"); + + return add(LdapUtils.newLdapName(name)); + } + /** * Build the LdapName instance. * diff --git a/core/src/test/java/org/springframework/ldap/support/LdapNameBuilderTest.java b/core/src/test/java/org/springframework/ldap/support/LdapNameBuilderTest.java new file mode 100644 index 00000000..a03ad5b0 --- /dev/null +++ b/core/src/test/java/org/springframework/ldap/support/LdapNameBuilderTest.java @@ -0,0 +1,54 @@ +package org.springframework.ldap.support; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author Mattias Hellborg Arthursson + */ +public class LdapNameBuilderTest { + + @Test + public void testAddComponentToEmpty() { + LdapNameBuilder tested = LdapNameBuilder.newInstance().add("dc", "com").add("dc", "261consulting"); + assertEquals("dc=261consulting,dc=com", tested.build().toString()); + } + + @Test + public void testAddComponentToBaseString() { + LdapNameBuilder tested = LdapNameBuilder.newInstance("dc=com").add("dc", "261consulting"); + assertEquals("dc=261consulting,dc=com", tested.build().toString()); + } + + @Test + public void testAddComponentToBaseName() { + LdapNameBuilder tested = LdapNameBuilder.newInstance(LdapUtils.newLdapName("dc=com")).add("dc", "261consulting"); + assertEquals("dc=261consulting,dc=com", tested.build().toString()); + } + + @Test + public void testAddStringNameToBaseString() { + LdapNameBuilder tested = LdapNameBuilder.newInstance("dc=261consulting,dc=com").add("ou=people"); + assertEquals("ou=people,dc=261consulting,dc=com", tested.build().toString()); + } + + @Test + public void testAddNameToBaseString() { + LdapNameBuilder tested = LdapNameBuilder.newInstance("dc=261consulting,dc=com").add(LdapUtils.newLdapName("ou=people")); + assertEquals("ou=people,dc=261consulting,dc=com", tested.build().toString()); + } + + @Test + public void testAddNameToEmpty() { + LdapNameBuilder tested = LdapNameBuilder.newInstance().add(LdapUtils.newLdapName("ou=people")); + assertEquals("ou=people", tested.build().toString()); + } + + @Test + public void testAddEmptyToEmpty() { + LdapNameBuilder tested = LdapNameBuilder.newInstance().add(""); + assertEquals("", tested.build().toString()); + } + +} diff --git a/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/domain/impl/DepartmentRepoImpl.java b/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/domain/impl/DepartmentRepoImpl.java index 70b7716c..00bca984 100644 --- a/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/domain/impl/DepartmentRepoImpl.java +++ b/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/domain/impl/DepartmentRepoImpl.java @@ -59,7 +59,7 @@ public class DepartmentRepoImpl implements DepartmentRepo { private List getAllUnitsForDepartment(String department) { return ldapTemplate.list(LdapNameBuilder - .newLdapName(DEPARTMENTS_OU).add("ou", department).build(), new OuValueNameClassPairMapper()); + .newInstance(DEPARTMENTS_OU).add("ou", department).build(), new OuValueNameClassPairMapper()); } private static class OuValueNameClassPairMapper implements NameClassPairMapper { diff --git a/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/service/UserService.java b/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/service/UserService.java index 068ff424..58dc3529 100644 --- a/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/service/UserService.java +++ b/samples/user-admin/src/main/java/org/springframework/ldap/samples/useradmin/service/UserService.java @@ -26,6 +26,7 @@ import org.springframework.ldap.samples.useradmin.domain.Group; import org.springframework.ldap.samples.useradmin.domain.GroupRepo; import org.springframework.ldap.samples.useradmin.domain.User; import org.springframework.ldap.samples.useradmin.domain.UserRepo; +import org.springframework.ldap.support.LdapNameBuilder; import org.springframework.ldap.support.LdapUtils; import javax.naming.Name; @@ -83,7 +84,9 @@ public class UserService implements BaseLdapNameAware { } public LdapName toAbsoluteDn(Name relativeName) { - return LdapUtils.prepend(relativeName, baseLdapPath); + return LdapNameBuilder.newInstance(baseLdapPath) + .add(relativeName) + .build(); } /** diff --git a/src/asciidoc/index.adoc b/src/asciidoc/index.adoc index de44da98..8b831c48 100644 --- a/src/asciidoc/index.adoc +++ b/src/asciidoc/index.adoc @@ -374,7 +374,7 @@ public class PersonDaoImpl implements PersonDao { public static final String BASE_DN = "dc=example,dc=com"; protected Name buildDn(Person p) { - **return LdapNameBuilder.newLdapName(BASE_DN) + **return LdapNameBuilder.newInstance(BASE_DN) .add("c", p.getCountry()) .add("ou", p.getCompany()) .add("cn", p.getFullname()) @@ -728,7 +728,7 @@ distinguished name. As of version 2.0, if you supply `javax.naming.Name` instances to the attribute modification methods in `DirContextAdapter`, modification calculation will use distinguished name equality, meaning that if we modify the example above to: -`ctx.addAttributeValue("member", LdapUtils.newLdapName("CN=John Doe, OU=People"))`, this will no longer be considered +`ctx.addAttributeValue("member", LdapUtils.newInstance("CN=John Doe, OU=People"))`, this will no longer be considered a modification. .Group membership modification example @@ -774,12 +774,12 @@ public class GroupDao implements BaseLdapNameAware { } private Name buildGroupDn(String groupName) { - return LdapNameBuilder.newLdapName("ou=Groups") + return LdapNameBuilder.newInstance("ou=Groups") .add("cn", groupName).build(); } private Name buildPersonDn(String fullname, String company, String country) { - return LdapNameBuilder.newLdapName(baseLdapPath) + return LdapNameBuilder.newInstance(baseLdapPath) .add("c", country) .add("ou", company) .add("cn", fullname) @@ -863,7 +863,7 @@ public class PersonDaoImpl implements PersonDao { } protected Name buildDn(String fullname, String company, String country) { - return LdapNameBuilder.newLdapName() + return LdapNameBuilder.newInstance() .add("c", country) .add("ou", company) .add("cn", fullname) @@ -1421,8 +1421,8 @@ public class PersonService implements PersonService**, BaseLdapNameAware** { }** ... private LdapName getFullPersonDn(Person person) { - return LdapNameBuilder.newLdapName(**basePath**) - .append(person.getDn()) + return LdapNameBuilder.newInstance(**basePath**) + .add(person.getDn()) .build(); } ... diff --git a/test/integration-tests/src/test/java/org/springframework/ldap/itest/odm/LdapTemplateOdmWithNoDnAnnotationsITest.java b/test/integration-tests/src/test/java/org/springframework/ldap/itest/odm/LdapTemplateOdmWithNoDnAnnotationsITest.java index 0d5c3f45..33571817 100644 --- a/test/integration-tests/src/test/java/org/springframework/ldap/itest/odm/LdapTemplateOdmWithNoDnAnnotationsITest.java +++ b/test/integration-tests/src/test/java/org/springframework/ldap/itest/odm/LdapTemplateOdmWithNoDnAnnotationsITest.java @@ -114,7 +114,7 @@ public class LdapTemplateOdmWithNoDnAnnotationsITest extends AbstractLdapTemplat @Test public void testCreate() { Person person = new Person(); - person.setDn(LdapNameBuilder.newLdapName("ou=company1,ou=Sweden") + person.setDn(LdapNameBuilder.newInstance("ou=company1,ou=Sweden") .add("cn", "New Person").build()); person.setCommonName("New Person"); person.setSurname("Person"); diff --git a/test/integration-tests/src/test/java/org/springframework/ldap/itest/repository/RepositoryScanITest.java b/test/integration-tests/src/test/java/org/springframework/ldap/itest/repository/RepositoryScanITest.java index 5580cea2..d816bedd 100644 --- a/test/integration-tests/src/test/java/org/springframework/ldap/itest/repository/RepositoryScanITest.java +++ b/test/integration-tests/src/test/java/org/springframework/ldap/itest/repository/RepositoryScanITest.java @@ -173,7 +173,7 @@ public class RepositoryScanITest extends AbstractLdapTemplateIntegrationTest { @Test public void testCreate() { Person person = new Person(); - LdapName dn = LdapNameBuilder.newLdapName("ou=company1,ou=Sweden") + LdapName dn = LdapNameBuilder.newInstance("ou=company1,ou=Sweden") .add("cn", "New Person").build(); person.setDn(dn); person.setCommonName("New Person");