From 6a62bab77504d084497958f9ded78c6f54aec173 Mon Sep 17 00:00:00 2001 From: Mattias Arthursson Date: Fri, 13 Jul 2007 06:09:45 +0000 Subject: [PATCH] spring-ldap-odm patch, Jul 12 from Jasper --- spring-ldap-odm/build.xml | 11 +- .../src/itest/java/conf/apacheDsContext.xml | 84 +++ spring-ldap-odm/src/itest/java/conf/beans.xml | 20 +- .../src/itest/java/conf/ldap.properties | 4 + spring-ldap-odm/src/itest/java/conf/log4j.xml | 50 ++ .../src/itest/java/conf/setup_data.ldif | 19 + .../src/itest/java/conf/teardown_data.ldif | 9 + .../AbstractLdapTemplateIntegrationTest.java | 34 + .../springframework/ldap/ConfigEnvHelper.java | 58 ++ .../ldap/LdapServerManager.java | 126 ++++ .../AnnotatedClassContextMapperTest.java | 611 ++++++++++-------- .../ldap/odm/dao/LdapDaoTest.java | 110 ++-- .../ldap/odm/entity/MockEntity.java | 4 +- .../ldap/odm/entity/TestPerson.java | 8 +- .../odm/attributetypes/LdapTypeConverter.java | 10 +- .../ldap/odm/attributetypes/NameEditor.java | 7 +- .../attributetypes/ReferencedEntryEditor.java | 11 +- .../ReferencedEntryEditorFactory.java | 3 +- .../attributetypes/ValidConversionType.java | 4 +- .../AnnotatedClassContextMapper.java | 15 +- .../ldap/odm/dao/LdapDaoImpl.java | 16 +- .../attributetypes/LdapTypeConverterTest.java | 505 ++++++++------- 22 files changed, 1101 insertions(+), 618 deletions(-) create mode 100644 spring-ldap-odm/src/itest/java/conf/apacheDsContext.xml create mode 100644 spring-ldap-odm/src/itest/java/conf/ldap.properties create mode 100644 spring-ldap-odm/src/itest/java/conf/log4j.xml create mode 100644 spring-ldap-odm/src/itest/java/conf/setup_data.ldif create mode 100644 spring-ldap-odm/src/itest/java/conf/teardown_data.ldif create mode 100644 spring-ldap-odm/src/itest/java/org/springframework/ldap/AbstractLdapTemplateIntegrationTest.java create mode 100644 spring-ldap-odm/src/itest/java/org/springframework/ldap/ConfigEnvHelper.java create mode 100644 spring-ldap-odm/src/itest/java/org/springframework/ldap/LdapServerManager.java diff --git a/spring-ldap-odm/build.xml b/spring-ldap-odm/build.xml index 280ce466..43a43857 100644 --- a/spring-ldap-odm/build.xml +++ b/spring-ldap-odm/build.xml @@ -19,7 +19,7 @@ - + @@ -29,9 +29,10 @@ - + - @@ -42,7 +43,7 @@ we want to optionally run all tests and report on the whole batch, then we need to set a failure property as in the server tests. --> - + @@ -64,7 +65,7 @@ - + diff --git a/spring-ldap-odm/src/itest/java/conf/apacheDsContext.xml b/spring-ldap-odm/src/itest/java/conf/apacheDsContext.xml new file mode 100644 index 00000000..80910e7e --- /dev/null +++ b/spring-ldap-odm/src/itest/java/conf/apacheDsContext.xml @@ -0,0 +1,84 @@ + + + + + + + + + + simple + + + ${userDn} + + + ${password} + + + + + + + + + + + + + + + + + + + + + objectClass: top + objectClass: domain + objectClass: extensibleObject + dc: example + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-ldap-odm/src/itest/java/conf/beans.xml b/spring-ldap-odm/src/itest/java/conf/beans.xml index 8f84cd19..f74961c4 100644 --- a/spring-ldap-odm/src/itest/java/conf/beans.xml +++ b/spring-ldap-odm/src/itest/java/conf/beans.xml @@ -2,12 +2,20 @@ - - - - - - + + + + + + + + + + + + + diff --git a/spring-ldap-odm/src/itest/java/conf/ldap.properties b/spring-ldap-odm/src/itest/java/conf/ldap.properties new file mode 100644 index 00000000..a0bbef1a --- /dev/null +++ b/spring-ldap-odm/src/itest/java/conf/ldap.properties @@ -0,0 +1,4 @@ +urls=ldap://127.0.0.1:3900 +userDn=uid=admin,ou=system +password=secret +base=dc=example,dc=com diff --git a/spring-ldap-odm/src/itest/java/conf/log4j.xml b/spring-ldap-odm/src/itest/java/conf/log4j.xml new file mode 100644 index 00000000..23d78f02 --- /dev/null +++ b/spring-ldap-odm/src/itest/java/conf/log4j.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-ldap-odm/src/itest/java/conf/setup_data.ldif b/spring-ldap-odm/src/itest/java/conf/setup_data.ldif new file mode 100644 index 00000000..560cffb9 --- /dev/null +++ b/spring-ldap-odm/src/itest/java/conf/setup_data.ldif @@ -0,0 +1,19 @@ +dn: ou=people,dc=example,dc=com +objectclass: top +objectclass: organizationalUnit +ou: people + +dn: ou=roles,dc=example,dc=com +objectclass: top +objectclass: organizationalUnit +ou: roles + +dn: cn=webUser,ou=roles,dc=example,dc=com +objectclass: top +objectclass: organizationalRole +cn: webUser +description: Everyday site visitor + + + + diff --git a/spring-ldap-odm/src/itest/java/conf/teardown_data.ldif b/spring-ldap-odm/src/itest/java/conf/teardown_data.ldif new file mode 100644 index 00000000..16f41052 --- /dev/null +++ b/spring-ldap-odm/src/itest/java/conf/teardown_data.ldif @@ -0,0 +1,9 @@ +dn: ou=people,dc=example,dc=com +objectclass: top +objectclass: organizationalUnit +ou: people + +dn: ou=roles,dc=example,dc=com +objectclass: top +objectclass: organizationalUnit +ou: roles \ No newline at end of file diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/AbstractLdapTemplateIntegrationTest.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/AbstractLdapTemplateIntegrationTest.java new file mode 100644 index 00000000..96b309b8 --- /dev/null +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/AbstractLdapTemplateIntegrationTest.java @@ -0,0 +1,34 @@ +/* + * Copyright 2005-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; + +import org.springframework.test.AbstractDependencyInjectionSpringContextTests; + +public abstract class AbstractLdapTemplateIntegrationTest extends + AbstractDependencyInjectionSpringContextTests { + + private LdapServerManager ldapServerManager; + + protected void onSetUp() throws Exception { + super.onSetUp(); + + ldapServerManager.cleanAndSetup("setup_data.ldif"); + } + + public void setLdapServerManager(LdapServerManager ldapServerManager) { + this.ldapServerManager = ldapServerManager; + } +} diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/ConfigEnvHelper.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/ConfigEnvHelper.java new file mode 100644 index 00000000..9fd2034b --- /dev/null +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/ConfigEnvHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright 2005-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; + +import java.io.File; +import java.util.Hashtable; + +import javax.naming.Context; + +import org.apache.directory.server.configuration.MutableServerStartupConfiguration; +import org.apache.directory.server.jndi.ServerContextFactory; +import org.springframework.beans.factory.InitializingBean; + +/** + * Helper class to simplify Spring configuration of ApacheDS. + * + * @author Mattias Arthursson + */ +public class ConfigEnvHelper implements InitializingBean { + private final MutableServerStartupConfiguration configuration; + + private final Hashtable initialEnv; + + private final File workingDir = new File(System + .getProperty("java.io.tmpdir") + + File.separator + "ldaptemplate_apacheds"); + + public ConfigEnvHelper(Hashtable initialEnv, + MutableServerStartupConfiguration configuration) { + + this.initialEnv = initialEnv; + this.configuration = configuration; + } + + public Hashtable getEnv() { + return initialEnv; + } + + public void afterPropertiesSet() throws Exception { + initialEnv.put(Context.INITIAL_CONTEXT_FACTORY, ServerContextFactory.class.getName()); + configuration.setWorkingDirectory(workingDir); + initialEnv.putAll(configuration.toJndiEnvironment()); + } +} diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/LdapServerManager.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/LdapServerManager.java new file mode 100644 index 00000000..df62b00a --- /dev/null +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/LdapServerManager.java @@ -0,0 +1,126 @@ +/* + * Copyright 2005-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; + +import java.util.Properties; + +import javax.naming.Binding; +import javax.naming.Context; +import javax.naming.ContextNotEmptyException; +import javax.naming.InitialContext; +import javax.naming.Name; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.DirContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.directory.server.core.configuration.ShutdownConfiguration; +import org.apache.directory.server.jndi.ServerContextFactory; +import org.apache.directory.server.protocol.shared.store.LdifFileLoader; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.ldap.core.ContextSource; +import org.springframework.ldap.core.DistinguishedName; +import org.springframework.ldap.core.support.DefaultDirObjectFactory; + +/** + * Utility class to initialize the apache directory server for use in the + * integration tests. + * + * @author Mattias Arthursson + * + */ +public class LdapServerManager implements DisposableBean { + private static Log log = LogFactory.getLog(LdapServerManager.class); + + private ContextSource contextSource; + + public void setContextSource(ContextSource contextSource) { + this.contextSource = contextSource; + } + + public void destroy() throws Exception { + Properties env = new Properties(); + env.setProperty(Context.INITIAL_CONTEXT_FACTORY, + ServerContextFactory.class.getName()); + env.setProperty(Context.SECURITY_AUTHENTICATION, "simple"); + env.setProperty(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); + env.setProperty(Context.SECURITY_CREDENTIALS, "secret"); + + ShutdownConfiguration configuration = new ShutdownConfiguration(); + env.putAll(configuration.toJndiEnvironment()); + + new InitialContext(env); + } + + public void cleanAndSetup(String ldifFile) throws Exception { + DirContext ctx = contextSource.getReadWriteContext(); + + // First of all, make sure the database is empty. + Name startingPoint = null; + + // Different test cases have different base paths. This means that the + // starting point will be different. + if (ctx.getEnvironment().get( + DefaultDirObjectFactory.JNDI_ENV_BASE_PATH_KEY) != null) { + startingPoint = DistinguishedName.EMPTY_PATH; + } else { + startingPoint = new DistinguishedName("dc=jayway,dc=se"); + } + + try { + log.info("Cleaning all present data."); + clearSubContexts(ctx, startingPoint); + // Load the ldif to the recently started server + log.info("Loading setup data"); + LdifFileLoader loader = new LdifFileLoader(ctx, ldifFile); + loader.execute(); + } finally { + ctx.close(); + } + } + + private void clearSubContexts(DirContext ctx, Name name) + throws NamingException { + + NamingEnumeration enumeration = null; + try { + enumeration = ctx.listBindings(name); + while (enumeration.hasMore()) { + Binding element = (Binding) enumeration.next(); + DistinguishedName childName = new DistinguishedName(element + .getName()); + childName.prepend((DistinguishedName) name); + + try { + ctx.destroySubcontext(childName); + } catch (ContextNotEmptyException e) { + clearSubContexts(ctx, childName); + ctx.destroySubcontext(childName); + } + } + } catch (NamingException e) { + e.printStackTrace(); + } finally { + try { + enumeration.close(); + } catch (Exception e) { + // Never mind this + } + } + } +} diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapperTest.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapperTest.java index 16932b56..678bbfd8 100644 --- a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapperTest.java +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapperTest.java @@ -5,15 +5,8 @@ */ package org.springframework.ldap.odm.contextmapping; -import java.util.Date; -import java.util.Map; - -import javax.naming.Name; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.ldap.core.DirContextAdapter; -import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.odm.annotations.DirAttribute; import org.springframework.ldap.odm.annotations.NamingAttribute; import org.springframework.ldap.odm.annotations.NamingSuffix; @@ -22,328 +15,380 @@ import org.springframework.ldap.odm.attributetypes.LdapTypeConverter; import org.springframework.ldap.odm.attributetypes.ReferencedEntryEditorFactory; import org.springframework.ldap.odm.contextmapping.exception.ContextMapperException; import org.springframework.ldap.odm.entity.MockEntity; +import org.springframework.ldap.core.DirContextAdapter; +import org.springframework.ldap.core.DistinguishedName; import org.springframework.test.AbstractDependencyInjectionSpringContextTests; import org.testng.Assert; import org.testng.annotations.Test; +import javax.naming.Name; +import java.util.Date; +import java.util.Map; + public class AnnotatedClassContextMapperTest extends - AbstractDependencyInjectionSpringContextTests { - private static final Log LOGGER = LogFactory - .getLog(AnnotatedClassContextMapperTest.class); + AbstractDependencyInjectionSpringContextTests +{ + private static final Log LOGGER = LogFactory + .getLog(AnnotatedClassContextMapperTest.class); - private LdapTypeConverter typeConverter; + private LdapTypeConverter typeConverter; - private ReferencedEntryEditorFactory refEditorFactory; + private ReferencedEntryEditorFactory refEditorFactory; - public void setRefEditorFactory( - ReferencedEntryEditorFactory refEditorFactory) { - this.refEditorFactory = refEditorFactory; - } + public void setRefEditorFactory( + ReferencedEntryEditorFactory refEditorFactory) + { + this.refEditorFactory = refEditorFactory; + } - public void setTypeConverter(LdapTypeConverter typeConverter) { - this.typeConverter = typeConverter; - } + public void setTypeConverter(LdapTypeConverter typeConverter) + { + this.typeConverter = typeConverter; + } - @Override - protected String[] getConfigLocations() { - return new String[] { "conf/beans.xml" }; - } + @Override + protected String[] getConfigLocations() + { + return new String[]{"conf/beans.xml"}; + } - public void testMapsDirectoryAttributesToBeanProperties() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - ContextMap contextMap = contextMapper.getContextMap(); - Assert.assertEquals("cn", contextMap.attributeNameFor("Name"), - "Name mapping not as expected"); - Assert.assertEquals("mail", contextMap.attributeNameFor("Mail"), - "Mail mapping not as expected"); - Assert.assertEquals("addr", contextMap.attributeNameFor("Address"), - "Address mapping not as expected"); - Assert.assertEquals("userpassword", contextMap - .attributeNameFor("Password"), - "Password mapping not as expected"); - Assert.assertEquals("desc", contextMap - .attributeNameFor("Description"), - "Description mapping not as expected"); - } catch (ContextMapperException e) { - LOGGER.debug(e.getMessage()); - Assert.fail(e.getMessage(), e); - } - } + public void testMapsDirectoryAttributesToBeanProperties() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + ContextMap contextMap = contextMapper.getContextMap(); + Assert.assertEquals("cn", contextMap.attributeNameFor("Name"), + "Name mapping not as expected"); + Assert.assertEquals("mail", contextMap.attributeNameFor("Mail"), + "Mail mapping not as expected"); + Assert.assertEquals("addr", contextMap.attributeNameFor("Address"), + "Address mapping not as expected"); + Assert.assertEquals("userpassword", contextMap + .attributeNameFor("Password"), + "Password mapping not as expected"); + Assert.assertEquals("desc", contextMap + .attributeNameFor("Description"), + "Description mapping not as expected"); + } + catch (ContextMapperException e) + { + LOGGER.debug(e.getMessage()); + Assert.fail(e.getMessage(), e); + } + } - public void testReturnsCorrectNamingAttribute() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - Assert.assertEquals("cn", contextMapper.getNamingAttribute(), - "Context mapper naming attribute not as expected"); + public void testReturnsCorrectNamingAttribute() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + Assert.assertEquals("cn", contextMapper.getNamingAttribute(), + "Context mapper naming attribute not as expected"); - } catch (ContextMapperException e) { - LOGGER.debug(e.getMessage()); - Assert.fail(e.getMessage(), e); - } - } + } + catch (ContextMapperException e) + { + LOGGER.debug(e.getMessage()); + Assert.fail(e.getMessage(), e); + } + } - public void testReturnsCorrectObjectClasses() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - Assert.assertEquals(new String[] { "top", "person", - "organizationalPerson", "inetorgperson" }, contextMapper - .getObjectClasses(), - "Context mapper naming attribute not as expected"); + public void testReturnsCorrectObjectClasses() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + Assert.assertEquals(new String[]{"top", "person", + "organizationalPerson", "inetorgperson"}, contextMapper + .getObjectClasses(), + "Context mapper naming attribute not as expected"); - } catch (ContextMapperException e) { - LOGGER.debug(e.getMessage()); - Assert.fail(e.getMessage()); - } - } + } + catch (ContextMapperException e) + { + LOGGER.debug(e.getMessage()); + Assert.fail(e.getMessage()); + } + } - public void testBuildDn() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - MockEntity entity = new MockEntity(); - entity.setName("Mr Bean"); - entity.setAddress("Somewhere in england"); - entity.setDescription(new String[] { "The quick brown fox jumped", - "over the lazy dog" }); - Name dn = contextMapper.buildDn(entity); - Assert.assertEquals("cn=Mr Bean, ou=people, dc=example, dc=com", dn - .toString(), "dn not as expected"); + public void testBuildDn() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + MockEntity entity = new MockEntity(); + entity.setName("Mr Bean"); + entity.setAddress("Somewhere in england"); + entity.setDescription(new String[]{"The quick brown fox jumped", + "over the lazy dog"}); + Name dn = contextMapper.buildDn(entity); + Assert.assertEquals("cn=Mr Bean, ou=people, dc=example, dc=com", dn + .toString(), "dn not as expected"); - } catch (ContextMapperException e) { - LOGGER.debug(e.getMessage()); - Assert.fail(e.getMessage()); - } - } + } + catch (ContextMapperException e) + { + LOGGER.debug(e.getMessage()); + Assert.fail(e.getMessage()); + } + } - public void testMapToContext() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - MockEntity entity = new MockEntity(); - entity.setName("Mr Bean"); - entity.setMail("bean@bean.com"); - entity.setAddress("Somewhere in england"); - entity.setPassword("fred".getBytes()); - entity.setDescription(new String[] { "The quick brown fox jumped", - "over the lazy dog" }); - entity.setAcceptEmails(false); - entity.setResetLogin(new Date(1L)); - entity.setCreator(new DistinguishedName( - "uid=amAdmin,ou=people,dc=myretsu,dc=com")); - entity.setFailedLogins(3); - DirContextAdapter ctxAdapter = new DirContextAdapter(); - contextMapper.mapToContext(entity, ctxAdapter); + public void testMapToContext() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + MockEntity entity = new MockEntity(); + entity.setName("Mr Bean"); + entity.setMail("bean@bean.com"); + entity.setAddress("Somewhere in england"); + entity.setPassword("fred".getBytes()); + entity.setDescription(new String[]{"The quick brown fox jumped", + "over the lazy dog"}); + entity.setAcceptEmails(false); + entity.setResetLogin(new Date(1L)); + entity.setCreator(new DistinguishedName( + "uid=amAdmin,ou=people,dc=myretsu,dc=com")); + entity.setFailedLogins(3); + DirContextAdapter ctxAdapter = new DirContextAdapter(); + contextMapper.mapToContext(entity, ctxAdapter); - Assert.assertEquals("Mr Bean", ctxAdapter.getStringAttribute("cn"), - "Name mapping not as expected"); - Assert - .assertEquals("bean@bean.com", ctxAdapter - .getStringAttribute("mail"), - "Mail mapping not as expected"); - Assert.assertEquals("Somewhere in england", ctxAdapter - .getObjectAttribute("addr"), - "Address mapping not as expected"); - Assert.assertEquals("fred", new String((byte[]) ctxAdapter - .getObjectAttribute("userpassword")), - "Password mapping not as expected"); - Assert.assertEquals("The quick brown fox jumped", ctxAdapter - .getStringAttributes("desc")[0], - "Description mapping not as expected"); - Assert.assertEquals("false", ctxAdapter - .getStringAttribute("acceptemails"), - "AcceptEmails mapping not as expected"); - Assert.assertEquals("19700101100000.1", ctxAdapter - .getStringAttribute("loginresettime"), - "ResetLogin mapping not as expected"); - Assert.assertEquals("3", ctxAdapter - .getStringAttribute("failedlogins"), - "FailedLogins mapping not as expected"); - Assert.assertEquals("uid=amAdmin, ou=people, dc=myretsu, dc=com", - ctxAdapter.getStringAttribute("creatorname"), - "Creator mapping not as expected"); - } catch (ContextMapperException e) { - LOGGER.debug(e.getMessage()); - Assert.fail(e.getMessage(), e); - } - } + Assert.assertEquals("Mr Bean", ctxAdapter.getStringAttribute("cn"), + "Name mapping not as expected"); + Assert + .assertEquals("bean@bean.com", ctxAdapter + .getStringAttribute("mail"), + "Mail mapping not as expected"); + Assert.assertEquals("Somewhere in england", ctxAdapter + .getObjectAttribute("addr"), + "Address mapping not as expected"); + Assert.assertEquals("fred", new String((byte[]) ctxAdapter + .getObjectAttribute("userpassword")), + "Password mapping not as expected"); + Assert.assertEquals("The quick brown fox jumped", ctxAdapter + .getStringAttributes("desc")[0], + "Description mapping not as expected"); + Assert.assertEquals("false", ctxAdapter + .getStringAttribute("acceptemails"), + "AcceptEmails mapping not as expected"); + Assert.assertEquals("19700101100000.1", ctxAdapter + .getStringAttribute("loginresettime"), + "ResetLogin mapping not as expected"); + Assert.assertEquals("3", ctxAdapter + .getStringAttribute("failedlogins"), + "FailedLogins mapping not as expected"); + Assert.assertEquals("uid=amAdmin, ou=people, dc=myretsu, dc=com", + ctxAdapter.getStringAttribute("creatorname"), + "Creator mapping not as expected"); + } + catch (ContextMapperException e) + { + LOGGER.debug(e.getMessage()); + Assert.fail(e.getMessage(), e); + } + } - public void testMapFromContext() throws ContextMapperException { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockEntity.class, typeConverter, refEditorFactory); - DirContextAdapter ctxAdapter = new DirContextAdapter(); - ctxAdapter.setAttributeValue("cn", "Mr Bean"); - ctxAdapter.setAttributeValue("mail", "bean@bean.com"); - ctxAdapter.setAttributeValue("addr", "Somewhere in england"); - ctxAdapter.setAttributeValue("userpassword", "fred".getBytes()); - ctxAdapter - .setAttributeValues("desc", new String[] { "elem1", "elem2" }); - ctxAdapter.setAttributeValue("userpassword", "fred".getBytes()); - ctxAdapter.setAttributeValue("acceptemails", "true"); - ctxAdapter.setAttributeValue("loginresettime", "19700101100000.1"); - ctxAdapter.setAttributeValue("failedlogins", "3"); - ctxAdapter.setAttributeValue("creatorname", - "uid=amAdmin,ou=people,dc=myretsu,dc=com"); + public void testMapFromContext() throws ContextMapperException + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockEntity.class, typeConverter, refEditorFactory); + DirContextAdapter ctxAdapter = new DirContextAdapter(); + ctxAdapter.setAttributeValue("cn", "Mr Bean"); + ctxAdapter.setAttributeValue("mail", "bean@bean.com"); + ctxAdapter.setAttributeValue("addr", "Somewhere in england"); + ctxAdapter.setAttributeValue("userpassword", "fred".getBytes()); + ctxAdapter + .setAttributeValues("desc", new String[]{"elem1", "elem2"}); + ctxAdapter.setAttributeValue("userpassword", "fred".getBytes()); + ctxAdapter.setAttributeValue("acceptemails", "true"); + ctxAdapter.setAttributeValue("loginresettime", "19700101100000.1"); + ctxAdapter.setAttributeValue("failedlogins", "3"); + ctxAdapter.setAttributeValue("creatorname", + "uid=amAdmin,ou=people,dc=myretsu,dc=com"); - MockEntity entity = (MockEntity) contextMapper - .mapFromContext(ctxAdapter); - Assert.assertEquals(entity.getMail(), "bean@bean.com", - "The mocked entity should match what has been mapped"); - Assert.assertEquals("Mr Bean", entity.getName(), - "Name mapping not as expected"); - Assert.assertEquals(entity.getMail(), "bean@bean.com", - "Mail mapping not as expected"); - Assert.assertEquals(entity.getAddress(), "Somewhere in england", - "Address mapping not as expected"); - Assert.assertEquals("fred", new String(entity.getPassword()), - "Password mapping not as expected"); - Assert.assertEquals("elem1", entity.getDescription()[0], - "Description mapping not as expected"); - Assert.assertEquals(Boolean.TRUE, entity.getAcceptEmails(), - "AcceptEmails mapping not as expected"); - Assert.assertEquals(new Date(1L), entity.getResetLogin(), - "ResetLogin mapping not as expected"); - Assert.assertEquals(new Integer(3), entity.getFailedLogins(), - "FailedLogin mapping not as expected"); - Assert.assertEquals(new DistinguishedName( - "uid=amAdmin,ou=people,dc=myretsu,dc=com"), - entity.getCreator(), "Creator mapping not as expected"); + MockEntity entity = (MockEntity) contextMapper + .mapFromContext(ctxAdapter); + Assert.assertEquals(entity.getMail(), "bean@bean.com", + "The mocked entity should match what has been mapped"); + Assert.assertEquals("Mr Bean", entity.getName(), + "Name mapping not as expected"); + Assert.assertEquals(entity.getMail(), "bean@bean.com", + "Mail mapping not as expected"); + Assert.assertEquals(entity.getAddress(), "Somewhere in england", + "Address mapping not as expected"); + Assert.assertEquals("fred", new String(entity.getPassword()), + "Password mapping not as expected"); + Assert.assertEquals("elem1", entity.getDescription()[0], + "Description mapping not as expected"); + Assert.assertEquals(Boolean.TRUE, entity.getAcceptEmails(), + "AcceptEmails mapping not as expected"); + Assert.assertEquals(new Date(1L), entity.getResetLogin(), + "ResetLogin mapping not as expected"); + Assert.assertEquals(new Integer(3), entity.getFailedLogins(), + "FailedLogin mapping not as expected"); + Assert.assertEquals(new DistinguishedName( + "uid=amAdmin,ou=people,dc=myretsu,dc=com"), + entity.getCreator(), "Creator mapping not as expected"); - } + } - @Test(groups = { "AnnotatedClassContextMapper" }, expectedExceptions = ContextMapperException.class) - public void throwsExceptionWhenNamingSuffixHasSyntaxError() - throws ContextMapperException { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockModelNamingSuffixSyntaxError.class, typeConverter, - refEditorFactory); - Assert - .fail("AnnotatedClassContextMapper should throw an exception when naming path annotation syntax is " - + "incorrect."); - } + @Test(groups = {"AnnotatedClassContextMapper"}, expectedExceptions = ContextMapperException.class) + public void throwsExceptionWhenNamingSuffixHasSyntaxError() + throws ContextMapperException + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockModelNamingSuffixSyntaxError.class, typeConverter, + refEditorFactory); + Assert + .fail("AnnotatedClassContextMapper should throw an exception when naming path annotation syntax is " + + "incorrect."); + } - @Test(groups = { "AnnotatedClassContextMapper" }, expectedExceptions = ContextMapperException.class) - public void throwsExceptionWhenNamingSuffixNotInSeparateElements() - throws ContextMapperException { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockModelNamingSuffixNotInSeparateElements.class, - typeConverter, refEditorFactory); - Assert - .fail("AnnotatedClassContextMapper should throw an exception when naming path annotation syntax is " - + "incorrect."); - } + @Test(groups = {"AnnotatedClassContextMapper"}, expectedExceptions = ContextMapperException.class) + public void throwsExceptionWhenNamingSuffixNotInSeparateElements() + throws ContextMapperException + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockModelNamingSuffixNotInSeparateElements.class, + typeConverter, refEditorFactory); + Assert + .fail("AnnotatedClassContextMapper should throw an exception when naming path annotation syntax is " + + "incorrect."); + } - @Test(groups = { "AnnotatedClassContextMapper" }, expectedExceptions = ContextMapperException.class) - public void throwsExceptionWhenModelObjectMissingGetterOrSetter() - throws ContextMapperException { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockModelMissingSetter.class, typeConverter, refEditorFactory); - Assert.fail("Should've thrown exception due to missing getter/setter"); - } + @Test(groups = {"AnnotatedClassContextMapper"}, expectedExceptions = ContextMapperException.class) + public void throwsExceptionWhenModelObjectMissingGetterOrSetter() + throws ContextMapperException + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockModelMissingSetter.class, typeConverter, refEditorFactory); + Assert.fail("Should've thrown exception due to missing getter/setter"); + } - @Test(groups = { "AnnotatedClassContextMapper" }) - public void throwsExceptionWhenBeanPropertyNotAValidTranslationType() { - try { - AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( - MockModelInvalidTranslationType.class, typeConverter, - refEditorFactory); - Assert - .fail("Should've thrown exception due to missing getter/setter"); - } catch (ContextMapperException e) { - Assert - .assertTrue(e - .getMessage() - .contains( - "MockModelInvalidTranslationType.getMap() has invalid return type")); - } + @Test(groups = {"AnnotatedClassContextMapper"}) + public void throwsExceptionWhenBeanPropertyNotAValidTranslationType() + { + try + { + AnnotatedClassContextMapper contextMapper = new AnnotatedClassContextMapper( + MockModelInvalidTranslationType.class, typeConverter, + refEditorFactory); + Assert + .fail("Should've thrown exception due to missing getter/setter"); + } + catch (ContextMapperException e) + { + Assert + .assertTrue(e + .getMessage() + .contains( + "MockModelInvalidTranslationType.getMap() has invalid return type")); + } - } + } - @NamingAttribute("cn") - @NamingSuffix( { "ou=people", "dc=example", "dc=com" }) - @ObjectClasses( { "top", "person", "organizationalPerson", "inetorgperson" }) - public class MockModelMissingSetter { - @DirAttribute("cn") - private String name; + @NamingAttribute("cn") + @NamingSuffix({"ou=people", "dc=example", "dc=com"}) + @ObjectClasses({"top", "person", "organizationalPerson", "inetorgperson"}) + public class MockModelMissingSetter + { + @DirAttribute("cn") + private String name; - @DirAttribute("addr") - private String address; + @DirAttribute("addr") + private String address; - @DirAttribute("mail") - private String mail; + @DirAttribute("mail") + private String mail; - public String getName() { - return name; - } + public String getName() + { + return name; + } - public String getAddress() { - return address; - } + public String getAddress() + { + return address; + } - public String getMail() { - return mail; - } + public String getMail() + { + return mail; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) + { + this.name = name; + } - public void setAddress(String address) { - this.address = address; - } - } + public void setAddress(String address) + { + this.address = address; + } + } - @NamingAttribute("cn") - @NamingSuffix( { "ou=people", "dc=example", "dc=com" }) - @ObjectClasses( { "top", "person", "organizationalPerson", "inetorgperson" }) - public class MockModelBadMethodName { + @NamingAttribute("cn") + @NamingSuffix({"ou=people", "dc=example", "dc=com"}) + @ObjectClasses({"top", "person", "organizationalPerson", "inetorgperson"}) + public class MockModelBadMethodName + { - @DirAttribute("cn") - private String name; + @DirAttribute("cn") + private String name; - @DirAttribute("addr") - private String address; + @DirAttribute("addr") + private String address; - public String zzzName() { - return name; - } + public String zzzName() + { + return name; + } - public String getAddress() { - return address; - } - } + public String getAddress() + { + return address; + } + } - @NamingAttribute("cn") - @NamingSuffix( { "ou=people,dc=example ,dc=com" }) - @ObjectClasses( { "top", "person", "organizationalPerson", "inetorgperson" }) - public class MockModelNamingSuffixNotInSeparateElements { - } + @NamingAttribute("cn") + @NamingSuffix({"ou=people,dc=example ,dc=com"}) + @ObjectClasses({"top", "person", "organizationalPerson", "inetorgperson"}) + public class MockModelNamingSuffixNotInSeparateElements + { + } - @NamingAttribute("cn") - @NamingSuffix( { "ou=people", "dc 0); } - @Test(groups = "LdapDao") - public void filterByBeanProperty() + public void testFilterByBeanProperty() { ldapDao.create(testPerson); List results = ldapDao.filterByBeanProperty(testPerson.getEmailAddress(), "EmailAddress", TestPerson.class); @@ -156,9 +144,7 @@ public class LdapDaoTest Assert.assertTrue(results.size() > 0, "Filter should return collection containing more than one result. "); } - - @Test(groups = "LdapDao") - public void updateEntity() + public void testUpdateEntity() { try { @@ -176,9 +162,7 @@ public class LdapDaoTest } } - - @Test(groups = "LdapDao") - public void updateEntityThrowsExceptionWhenNameNotBound() + public void testUpdateEntityThrowsExceptionWhenNameNotBound() { try { @@ -187,15 +171,13 @@ public class LdapDaoTest ldapDao.update(testPerson); Assert.fail("Should've failed since the entry doesn't exist"); } - catch (EntryNotFoundException e) + catch (Exception e) { - Assert.assertTrue(e instanceof EntryNotFoundException); - Assert.assertTrue(e.getMessage().contains("Entry not found"), "Error message not as expected."); + Assert.assertTrue(e instanceof NameNotFoundException); } } - @Test(groups = "LdapDao") - public void deleteEntity() + public void testDeleteEntity() { ldapDao.create(testPerson); LOGGER.debug(testPerson); diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/MockEntity.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/MockEntity.java index 968b7039..40b1025e 100644 --- a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/MockEntity.java +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/MockEntity.java @@ -5,14 +5,14 @@ */ package org.springframework.ldap.odm.entity; -import java.util.Date; - import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.odm.annotations.DirAttribute; import org.springframework.ldap.odm.annotations.NamingAttribute; import org.springframework.ldap.odm.annotations.NamingSuffix; import org.springframework.ldap.odm.annotations.ObjectClasses; +import java.util.Date; + @NamingAttribute("cn") @NamingSuffix({"ou = people", "dc = example", "dc=com"}) @ObjectClasses({"top", "person", "organizationalPerson", "inetorgperson"}) diff --git a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/TestPerson.java b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/TestPerson.java index bdc066ae..80ce264b 100644 --- a/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/TestPerson.java +++ b/spring-ldap-odm/src/itest/java/org/springframework/ldap/odm/entity/TestPerson.java @@ -9,13 +9,14 @@ import org.springframework.ldap.odm.annotations.DirAttribute; import org.springframework.ldap.odm.annotations.NamingAttribute; import org.springframework.ldap.odm.annotations.NamingSuffix; import org.springframework.ldap.odm.annotations.ObjectClasses; +import org.apache.commons.lang.builder.EqualsBuilder; import com.thoughtworks.xstream.XStream; @NamingAttribute("uid") @NamingSuffix({"ou=people"}) -@ObjectClasses({"top", "person", "organizationalPerson", "inetorgperson"}) +@ObjectClasses({"person", "organizationalPerson", "inetorgperson"}) public class TestPerson { /*********************************** Directory mapped fields ************************************/ @@ -106,5 +107,10 @@ public class TestPerson return "\n" + xStream.toXML(this); } + public boolean equals(Object o) + { + return EqualsBuilder.reflectionEquals(this, o); + } + } diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverter.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverter.java index 4d9228e7..c7fbb7df 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverter.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverter.java @@ -5,15 +5,15 @@ */ package org.springframework.ldap.odm.attributetypes; +import org.springframework.beans.SimpleTypeConverter; +import org.springframework.beans.propertyeditors.CustomDateEditor; +import org.springframework.ldap.core.DistinguishedName; + +import javax.naming.ldap.LdapName; import java.beans.PropertyEditor; import java.text.SimpleDateFormat; import java.util.Date; -import javax.naming.ldap.LdapName; - -import org.springframework.beans.SimpleTypeConverter; -import org.springframework.beans.propertyeditors.CustomDateEditor; -import org.springframework.ldap.core.DistinguishedName; public class LdapTypeConverter extends SimpleTypeConverter { diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/NameEditor.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/NameEditor.java index ae17ecdb..36898738 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/NameEditor.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/NameEditor.java @@ -5,12 +5,11 @@ */ package org.springframework.ldap.odm.attributetypes; -import java.beans.PropertyEditorSupport; - -import javax.naming.ldap.LdapName; - import org.springframework.ldap.core.DistinguishedName; +import java.beans.PropertyEditorSupport; +import javax.naming.ldap.LdapName; + public class NameEditor extends PropertyEditorSupport { private Class conversionClass; diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditor.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditor.java index 30996977..641fc4f4 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditor.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditor.java @@ -5,17 +5,16 @@ */ package org.springframework.ldap.odm.attributetypes; -import java.beans.PropertyEditorSupport; - -import javax.naming.InvalidNameException; -import javax.naming.ldap.LdapName; - import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.odm.contextmapping.AnnotatedClassContextMapper; import org.springframework.ldap.odm.contextmapping.exception.ContextMapperException; +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import java.beans.PropertyEditorSupport; + public class ReferencedEntryEditor extends PropertyEditorSupport -{ +{ private LdapTemplate ldapTemplate; private AnnotatedClassContextMapper contextMapper; diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditorFactory.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditorFactory.java index 50c3408a..ec1444c4 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditorFactory.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ReferencedEntryEditorFactory.java @@ -10,11 +10,12 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.ldap.core.LdapTemplate; + import org.springframework.ldap.odm.attributetypes.exception.ReferencedEntryEditorCreationException; import org.springframework.ldap.odm.contextmapping.AnnotatedClassContextMapper; import org.springframework.ldap.odm.contextmapping.ContextMapperFactory; import org.springframework.ldap.odm.contextmapping.exception.ContextMapperException; +import org.springframework.ldap.core.LdapTemplate; public class ReferencedEntryEditorFactory { diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ValidConversionType.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ValidConversionType.java index 3b835892..0c268b94 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ValidConversionType.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/attributetypes/ValidConversionType.java @@ -5,11 +5,11 @@ */ package org.springframework.ldap.odm.attributetypes; -import java.util.Date; +import org.springframework.ldap.core.DistinguishedName; import javax.naming.ldap.LdapName; +import java.util.Date; -import org.springframework.ldap.core.DistinguishedName; /* Should be able to support any of Spring's conversion types. Add a test case if you add one */ public enum ValidConversionType diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapper.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapper.java index 6bd84457..ee026d03 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapper.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/contextmapping/AnnotatedClassContextMapper.java @@ -5,14 +5,6 @@ */ package org.springframework.ldap.odm.contextmapping; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import javax.naming.Name; -import javax.naming.directory.Attribute; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.TypeMismatchException; @@ -31,6 +23,13 @@ import org.springframework.ldap.odm.attributetypes.exception.ReferencedEntryEdit import org.springframework.ldap.odm.contextmapping.exception.ContextMapperException; import org.springframework.util.StringUtils; +import javax.naming.Name; +import javax.naming.directory.Attribute; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + public class AnnotatedClassContextMapper implements ContextMapper, ContextAssembler { private static final Log LOGGER = LogFactory.getLog(AnnotatedClassContextMapper.class); diff --git a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/dao/LdapDaoImpl.java b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/dao/LdapDaoImpl.java index fe478807..c0b20b7c 100644 --- a/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/dao/LdapDaoImpl.java +++ b/spring-ldap-odm/src/main/java/org/springframework/ldap/odm/dao/LdapDaoImpl.java @@ -5,21 +5,19 @@ */ package org.springframework.ldap.odm.dao; -import java.util.List; - -import javax.naming.Name; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.ldap.core.DirContextAdapter; -import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapTemplate; +import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.odm.contextmapping.AnnotatedClassContextMapper; import org.springframework.ldap.odm.contextmapping.ContextMapperFactory; import org.springframework.ldap.odm.contextmapping.exception.ContextMapperException; import org.springframework.ldap.odm.dao.exception.DaoException; import org.springframework.ldap.odm.dao.exception.DataIntegrityViolationException; -import org.springframework.ldap.odm.dao.exception.EntryNotFoundException; + +import javax.naming.Name; +import java.util.List; public class LdapDaoImpl implements LdapDao { @@ -62,12 +60,6 @@ public class LdapDaoImpl implements LdapDao ctxMapper.mapToContext(dirObject, contextAdapter); ldapTemplate.modifyAttributes(dn, contextAdapter.getModificationItems()); } - catch (org.springframework.ldap.NameNotFoundException e) - { - //We need to rethrow a serializable exception if we are going to invoke - //this as a remote service. - throw new EntryNotFoundException(e.getMessage()); - } catch (ContextMapperException e) { throw new DaoException(e.getMessage(), e); diff --git a/spring-ldap-odm/src/test/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverterTest.java b/spring-ldap-odm/src/test/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverterTest.java index 88966e2e..f9dc2eee 100644 --- a/spring-ldap-odm/src/test/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverterTest.java +++ b/spring-ldap-odm/src/test/java/org/springframework/ldap/odm/attributetypes/LdapTypeConverterTest.java @@ -5,260 +5,327 @@ */ package org.springframework.ldap.odm.attributetypes; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Date; - -import javax.naming.InvalidNameException; -import javax.naming.ldap.LdapName; - import junit.framework.TestCase; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.TypeMismatchException; import org.springframework.ldap.core.DistinguishedName; import org.testng.Assert; -public class LdapTypeConverterTest extends TestCase { - private static final Log LOGGER = LogFactory - .getLog(LdapTypeConverterTest.class); +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; - private LdapTypeConverter typeConverter; +public class LdapTypeConverterTest extends TestCase +{ + private static final Log LOGGER = LogFactory.getLog(LdapTypeConverterTest.class); - @Override - protected void setUp() throws Exception { - super.setUp(); - typeConverter = new LdapTypeConverter(); - } + private LdapTypeConverter typeConverter; - public void testConvertToByteArray() { - byte[] objectToTranslate = "fred".getBytes(); + @Override + protected void setUp() throws Exception + { + super.setUp(); + typeConverter = new LdapTypeConverter(); + } - try { - byte[] translated = (byte[]) typeConverter.convertIfNecessary( - objectToTranslate, byte[].class); - Assert.assertTrue(Arrays.equals(objectToTranslate, translated), - "byte[] attributes should pass through unchanged."); - } catch (TypeMismatchException e) { - Assert - .fail( - "Unexpected exception: byte[] attributes should pass through unchanged.", - e); - } - } + public void testConvertToByteArray() + { + byte[] objectToTranslate = "fred".getBytes(); - public void testConvertToBoolean() { - String objectToTranslate = "true"; - try { - Object translated = typeConverter.convertIfNecessary( - objectToTranslate, Boolean.class); - Assert - .assertEquals(true, translated, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + try + { + byte[] translated = (byte[]) typeConverter.convertIfNecessary( + objectToTranslate, byte[].class); + Assert.assertTrue(Arrays.equals(objectToTranslate, translated), + "byte[] attributes should pass through unchanged."); + } + catch (TypeMismatchException e) + { + Assert + .fail( + "Unexpected exception: byte[] attributes should pass through unchanged.", + e); + } + } - public void testConvertFromBoolean() { - boolean objectToTranslate = false; - try { - Object translated = typeConverter.getAsText(objectToTranslate); - Assert.assertEquals(translated, "false", - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToBoolean() + { + String objectToTranslate = "true"; + try + { + Object translated = typeConverter.convertIfNecessary( + objectToTranslate, Boolean.class); + Assert + .assertEquals(true, translated, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - public void testConvertToString() { - String objectToTranslate = "onetwothree"; - try { - Object translated = typeConverter.convertIfNecessary( - objectToTranslate, String.class); - Assert.assertEquals("onetwothree", translated, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertFromBoolean() + { + boolean objectToTranslate = false; + try + { + Object translated = typeConverter.getAsText(objectToTranslate); + Assert.assertEquals(translated, "false", + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - public void testConvertToStringArray() { - String object1 = "onetwothree"; - String object2 = "fourfivesix"; - String object3 = "seveneightnine"; - Object objectToTranslate = new String[] { object1, object2, object3 }; + public void testConvertToString() + { + String objectToTranslate = "onetwothree"; + try + { + Object translated = typeConverter.convertIfNecessary( + objectToTranslate, String.class); + Assert.assertEquals("onetwothree", translated, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, String[].class); - Assert.assertEquals("fourfivesix", translated[1], - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToStringArray() + { + String object1 = "onetwothree"; + String object2 = "fourfivesix"; + String object3 = "seveneightnine"; + Object objectToTranslate = new String[]{object1, object2, object3}; - public void testConvertToGeneralizedTime() throws ParseException { - String object1 = "20061005093637.44"; - DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S"); - Date expected = df.parse("20061005093637.44"); + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, String[].class); + Assert.assertEquals("fourfivesix", translated[1], + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object translated = typeConverter.convertIfNecessary(object1, - Date.class); - Assert.assertEquals(translated, expected, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToGeneralizedTime() throws ParseException + { + String object1 = "20061005093637.44"; + DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S"); + Date expected = df.parse("20061005093637.44"); - public void testConvertToGeneralizedTimeArray() throws ParseException { - String object1 = "20071105093655.44"; - String object2 = "20061005093637.44"; - Object objectToTranslate = new String[] { object1, object2 }; + try + { + Object translated = typeConverter.convertIfNecessary(object1, + Date.class); + Assert.assertEquals(translated, expected, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S"); - Date expected = df.parse("20061005093637.44"); + public void testConvertToGeneralizedTimeArray() throws ParseException + { + String object1 = "20071105093655.44"; + String object2 = "20061005093637.44"; + Object objectToTranslate = new String[]{object1, object2}; - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, Date[].class); - Assert.assertEquals(translated[1], expected, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation"); - } - } + DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S"); + Date expected = df.parse("20061005093637.44"); - public void testConvertToLdapName() { - String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; - try { - Object translated = typeConverter.convertIfNecessary(object1, - LdapName.class); - Assert.assertEquals(translated, new LdapName(object1), - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } catch (InvalidNameException e) { - Assert.fail("Problem with test: Ldap name can't be parsed.", e); - } - } + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, Date[].class); + Assert.assertEquals(translated[1], expected, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation"); + } + } - public void testConvertToLdapNameArray() { - String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; - String object2 = "uid=fred, ou = people, dc = myretsu,dc=com"; - Object objectToTranslate = new String[] { object1, object2 }; + public void testConvertToLdapName() + { + String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; + try + { + Object translated = typeConverter.convertIfNecessary(object1, + LdapName.class); + Assert.assertEquals(translated, new LdapName(object1), + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + catch (InvalidNameException e) + { + Assert.fail("Problem with test: Ldap name can't be parsed.", e); + } + } - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, LdapName[].class); - Assert.assertEquals(new LdapName(object2), translated[1], - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } catch (InvalidNameException e) { - Assert.fail("Problem with test: Ldap name can't be parsed.", e); - } - } + public void testConvertToLdapNameArray() + { + String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; + String object2 = "uid=fred, ou = people, dc = myretsu,dc=com"; + Object objectToTranslate = new String[]{object1, object2}; - public void testConvertToDistinguishedName() { - String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; - try { - Object translated = typeConverter.convertIfNecessary(object1, - DistinguishedName.class); - Assert.assertEquals(new DistinguishedName(object1), translated, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, LdapName[].class); + Assert.assertEquals(new LdapName(object2), translated[1], + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + catch (InvalidNameException e) + { + Assert.fail("Problem with test: Ldap name can't be parsed.", e); + } + } - public void testConvertToDistinguishedNameArray() { - String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; - String object2 = "uid=fred, ou = people, dc = myretsu,dc=com"; - Object objectToTranslate = new String[] { object1, object2 }; + public void testConvertToDistinguishedName() + { + String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; + try + { + Object translated = typeConverter.convertIfNecessary(object1, + DistinguishedName.class); + Assert.assertEquals(new DistinguishedName(object1), translated, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, DistinguishedName[].class); - Assert.assertEquals(new DistinguishedName(object2), translated[1], - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToDistinguishedNameArray() + { + String object1 = "uid=amAdmin, ou = people, dc = myretsu,dc=com"; + String object2 = "uid=fred, ou = people, dc = myretsu,dc=com"; + Object objectToTranslate = new String[]{object1, object2}; - public void testConvertToLong() { - String object1 = "9887342"; - try { - Object translated = typeConverter.convertIfNecessary(object1, - Long.class); - Assert.assertEquals(9887342L, translated, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, DistinguishedName[].class); + Assert.assertEquals(new DistinguishedName(object2), translated[1], + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - public void testConvertToLongArray() { - String object1 = "878787"; - String object2 = "23948787"; - Object objectToTranslate = new String[] { object1, object2 }; + public void testConvertToLong() + { + String object1 = "9887342"; + try + { + Object translated = typeConverter.convertIfNecessary(object1, + Long.class); + Assert.assertEquals(9887342L, translated, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, Long[].class); - Assert.assertEquals(23948787L, translated[1], - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToLongArray() + { + String object1 = "878787"; + String object2 = "23948787"; + Object objectToTranslate = new String[]{object1, object2}; - public void testConvertToInteger() { - String object1 = "9887342"; + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, Long[].class); + Assert.assertEquals(23948787L, translated[1], + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object translated = typeConverter.convertIfNecessary(object1, - Integer.class); - Assert.assertEquals(9887342, translated, - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToInteger() + { + String object1 = "9887342"; - public void testConvertToIntegerArray() { - String object1 = "878787"; - String object2 = "23948787"; - Object objectToTranslate = new String[] { object1, object2 }; + try + { + Object translated = typeConverter.convertIfNecessary(object1, + Integer.class); + Assert.assertEquals(9887342, translated, + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - try { - Object[] translated = (Object[]) typeConverter.convertIfNecessary( - objectToTranslate, Integer[].class); - Assert.assertEquals(23948787, translated[1], - "Unexpected translated value"); - } catch (TypeMismatchException e) { - Assert.fail("Unexpected exception during translation", e); - } - } + public void testConvertToIntegerArray() + { + String object1 = "878787"; + String object2 = "23948787"; + Object objectToTranslate = new String[]{object1, object2}; - public void testThrowsTypeMismatchExceptionWhenTypeTranslationFails() { - String object1 = "asdlkjkalkjl"; + try + { + Object[] translated = (Object[]) typeConverter.convertIfNecessary( + objectToTranslate, Integer[].class); + Assert.assertEquals(23948787, translated[1], + "Unexpected translated value"); + } + catch (TypeMismatchException e) + { + Assert.fail("Unexpected exception during translation", e); + } + } - Object[] translated; - try { - translated = (Object[]) typeConverter.convertIfNecessary(object1, - LdapName.class); - Assert.fail("Should've thrown exception"); - } catch (TypeMismatchException e) { - // Pass - } - } + public void testThrowsTypeMismatchExceptionWhenTypeTranslationFails() + { + String object1 = "asdlkjkalkjl"; + + Object[] translated; + try + { + translated = (Object[]) typeConverter.convertIfNecessary(object1, + LdapName.class); + Assert.fail("Should've thrown exception"); + } + catch (TypeMismatchException e) + { + // Pass + } + } }