Patch from Jasper on July 25.

This commit is contained in:
Ulrik Sandberg
2007-07-25 08:52:31 +00:00
parent d92fcf17d1
commit 6484f85c5b
15 changed files with 446 additions and 231 deletions

View File

@@ -1,95 +1,95 @@
<?xml version="1.0"?>
<project name="spring-ldap-odm" default="dist">
<property file="build.properties" />
<property file="project.properties" />
<property file="${common.build.dir}/build.properties" />
<property file="${common.build.dir}/project.properties" />
<property file="${user.home}/build.properties" />
<property name="project.title" value="Spring LDAP ODM" />
<property name="project.package" value="org.springframework.ldap.odm" />
<property name="ldap.server" value="127.0.0.1" />
<property name="ldap.user" value="&quot;cn=Manager,dc=jayway,dc=se&quot;" />
<property name="ldap.password" value="secret" />
<!-- Cannot import common-targets since itest-targets already does -->
<import file="${common.build.dir}/itest-targets.xml" />
<import file="${common.build.dir}/doc-targets.xml" />
<import file="${common.build.dir}/clover-targets.xml" />
<import file="${common.build.dir}/jdiff-targets.xml" />
<!-- extend common-build with source capability -->
<target name="build.prepare.make.config.dirs" depends="common-targets.build.prepare.make.config.dirs">
<mkdir dir="${lib.dir}/source" />
</target>
<!--
Overridden to create test report and run integration tests as well.
-->
<target name="tests" depends="tests-local,test-report,itests,itest-report" description="Runs all tests, first local then server (if any)" />
<!--
Overridden only to have the errorproperty and failureproperty attributes
added to the junit task.
-->
<!-- Runs the local unit tests. -->
<target name="tests-local" depends="tests.prepare" description="Run all local tests">
<!-- for the time being we just halt on failure, since these are
local tests and there is no server to shut down, etc. But if
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. -->
<junit forkmode="perBatch" printsummary="yes" haltonfailure="no" haltonerror="no" dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true">
<jvmarg value="${unitvm}" />
<jvmarg value="-Djava.security.auth.login.config=${target.testclasses.dir}/auth.conf" />
<jvmarg value="${test.arguments}" />
<classpath>
<pathelement location="${target.classes.dir}" />
<pathelement location="${target.testclasses.dir}" />
<pathelement location="${target.genclasses.dir}" />
<path refid="test.classpath" />
</classpath>
<formatter type="plain" />
<formatter type="xml" />
<batchtest fork="yes" todir="${target.testresults.dir}">
<fileset dir="${target.testclasses.dir}" includes="${test.includes}" excludes="${test.excludes}" />
</batchtest>
</junit>
</target>
<property name="target.testresults.html.dir" location="${target.testresults.dir}/html" />
<!-- Generate the unit test report -->
<target name="test-report" depends="build.prepare" description="Generate HTML report of unit test results">
<delete dir="${target.testresults.html.dir}" />
<mkdir dir="${target.testresults.html.dir}" />
<junitreport todir="${target.testresults.html.dir}">
<fileset dir="${target.testresults.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${target.testresults.html.dir}" />
</junitreport>
<echo>
Unit test report has been generated.
The HTML report is ${target.testresults.html.dir}/index.html
</echo>
<fail if="tests.failed" message="Unit tests failed" />
</target>
<target name="clover-report" depends="clover.instrument, tests-local" description="Produce a test coverage report">
<clover-report>
<current outfile="${target.clover.dir}/coverage.xml" />
<current outfile="${target.clover.dir}/html">
<format type="html" />
</current>
</clover-report>
</target>
</project>
<?xml version="1.0"?>
<project name="spring-ldap-odm" default="dist">
<property file="build.properties" />
<property file="project.properties" />
<property file="${common.build.dir}/build.properties" />
<property file="${common.build.dir}/project.properties" />
<property file="${user.home}/build.properties" />
<property name="project.title" value="Spring LDAP ODM" />
<property name="project.package" value="org.springframework.ldap.odm" />
<property name="ldap.server" value="127.0.0.1" />
<property name="ldap.user" value="&quot;cn=Manager,dc=jayway,dc=se&quot;" />
<property name="ldap.password" value="secret" />
<!-- Cannot import common-targets since itest-targets already does -->
<import file="${common.build.dir}/itest-targets.xml" />
<import file="${common.build.dir}/doc-targets.xml" />
<import file="${common.build.dir}/clover-targets.xml" />
<import file="${common.build.dir}/jdiff-targets.xml" />
<!-- extend common-build with source capability -->
<target name="build.prepare.make.config.dirs" depends="common-targets.build.prepare.make.config.dirs">
<mkdir dir="${lib.dir}/source" />
</target>
<!--
Overridden to create test report and run integration tests as well.
-->
<target name="tests" depends="tests-local,test-report,copy.itest.resources,itests,itest-report" description="Runs all tests, first local then server (if any)" />
<!--
Overridden only to have the errorproperty and failureproperty attributes
added to the junit task.
-->
<!-- Runs the local unit tests. -->
<target name="tests-local" depends="tests.prepare" description="Run all local tests">
<!-- for the time being we just halt on failure, since these are
local tests and there is no server to shut down, etc. But if
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. -->
<junit forkmode="perBatch" printsummary="yes" haltonfailure="no" haltonerror="no" dir="${basedir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true">
<jvmarg value="${unitvm}" />
<jvmarg value="-Djava.security.auth.login.config=${target.testclasses.dir}/auth.conf" />
<jvmarg value="${test.arguments}" />
<classpath>
<pathelement location="${target.classes.dir}" />
<pathelement location="${target.testclasses.dir}" />
<pathelement location="${target.genclasses.dir}" />
<path refid="test.classpath" />
</classpath>
<formatter type="plain" />
<formatter type="xml" />
<batchtest fork="yes" todir="${target.testresults.dir}">
<fileset dir="${target.testclasses.dir}" includes="${test.includes}" excludes="${test.excludes}" />
</batchtest>
</junit>
</target>
<property name="target.testresults.html.dir" location="${target.testresults.dir}/html" />
<!-- Generate the unit test report -->
<target name="test-report" depends="build.prepare" description="Generate HTML report of unit test results">
<delete dir="${target.testresults.html.dir}" />
<mkdir dir="${target.testresults.html.dir}" />
<junitreport todir="${target.testresults.html.dir}">
<fileset dir="${target.testresults.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${target.testresults.html.dir}" />
</junitreport>
<echo>
Unit test report has been generated.
The HTML report is ${target.testresults.html.dir}/index.html
</echo>
<fail if="tests.failed" message="Unit tests failed" />
</target>
<target name="clover-report" depends="clover.instrument, tests-local" description="Produce a test coverage report">
<clover-report>
<current outfile="${target.clover.dir}/coverage.xml" />
<current outfile="${target.clover.dir}/html">
<format type="html" />
</current>
</clover-report>
</target>
</project>

View File

@@ -1,97 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.jayasoft.org/misc/ivy/samples/ivy.xsd">
<info organisation="org.springframework" module="spring-ldap-odm" />
<configurations>
<conf name="default" extends="global" />
<conf name="global" visibility="private" />
<conf name="buildtime" visibility="private" />
<conf name="test" visibility="private" />
<conf name="source" visibility="public" />
</configurations>
<publications>
<artifact name="spring-ldap-odm" type="jar" conf="default" />
<artifact name="spring-ldap-odm-src" type="zip" conf="source" />
</publications>
<dependencies defaultconf="global->default">
<!-- global (core) dependencies -->
<dependency org="commons-logging" name="commons-logging" rev="1.0.4" />
<dependency org="commons-lang" name="commons-lang" rev="2.1" />
<dependency org="commons-collections" name="commons-collections" rev="3.1" />
<dependency org="org.springframework" name="spring-ldap" rev="latest.integration"/>
<dependency org="org.springframework" name="spring-beans" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-core" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-context" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-dao" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-src" rev="2.0.4" conf="source->source">
<artifact name="spring-src" type="zip"/>
</dependency>
<dependency org="com.sun" name="ldapbp" rev="1.0" />
<dependency org="xstream" name="xstream" rev="1.2" />
<!-- build time only dependencies -->
<dependency org="org.tigris" name="svnant" rev="1.0.0" conf="buildtime->default">
<artifact name="svnant" type="jar"/>
<artifact name="svnClientAdapter" type="jar"/>
<artifact name="svnjavahl" type="jar"/>
</dependency>
<!-- test time only dependencies -->
<dependency org="com.cenqua.clover" name="clover" rev="1.3.12" conf="test->default" />
<dependency org="org.springframework" name="spring-mock" rev="2.0.4"
conf="test->default"/>
<dependency org="gsbase" name="gsbase" rev="2.0.1" conf="test->default"/>
<dependency org="junit" name="junit" rev="3.8.1" conf="test->default"/>
<dependency org="junit-addons" name="junit-addons" rev="1.4" conf="test->default"/>
<dependency org="junitperf" name="junitperf" rev="1.8" conf="test->default"/>
<dependency org="org.easymock" name="easymock" rev="2.2" conf="test->default"/>
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.jayasoft.org/misc/ivy/samples/ivy.xsd">
<info organisation="org.springframework" module="spring-ldap-odm" />
<configurations>
<conf name="default" extends="global" />
<conf name="global" visibility="private" />
<conf name="buildtime" visibility="private" />
<conf name="test" visibility="private" />
<conf name="source" visibility="public" />
</configurations>
<publications>
<artifact name="spring-ldap-odm" type="jar" conf="default" />
<artifact name="spring-ldap-odm-src" type="zip" conf="source" />
</publications>
<dependencies defaultconf="global->default">
<!-- global (core) dependencies -->
<dependency org="commons-logging" name="commons-logging" rev="1.0.4" />
<dependency org="commons-lang" name="commons-lang" rev="2.1" />
<dependency org="commons-collections" name="commons-collections" rev="3.1" />
<dependency org="org.springframework" name="spring-ldap" rev="latest.integration"/>
<dependency org="org.springframework" name="spring-beans" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-core" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-context" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-dao" rev="2.0.4"/>
<dependency org="org.springframework" name="spring-src" rev="2.0.4" conf="source->source">
<artifact name="spring-src" type="zip"/>
</dependency>
<dependency org="com.sun" name="ldapbp" rev="1.0" />
<dependency org="xstream" name="xstream" rev="1.2" />
<!-- build time only dependencies -->
<dependency org="org.tigris" name="svnant" rev="1.0.0" conf="buildtime->default">
<artifact name="svnant" type="jar"/>
<artifact name="svnClientAdapter" type="jar"/>
<artifact name="svnjavahl" type="jar"/>
</dependency>
<!-- test time only dependencies -->
<dependency org="com.cenqua.clover" name="clover" rev="1.3.12" conf="test->default" />
<dependency org="org.springframework" name="spring-mock" rev="2.0.4"
conf="test->default"/>
<dependency org="gsbase" name="gsbase" rev="2.0.1" conf="test->default"/>
<dependency org="junit" name="junit" rev="3.8.1" conf="test->default"/>
<dependency org="junit-addons" name="junit-addons" rev="1.4" conf="test->default"/>
<dependency org="junitperf" name="junitperf" rev="1.8" conf="test->default"/>
<dependency org="org.easymock" name="easymock" rev="2.2" conf="test->default"/>
<dependency org="org.easymock" name="easymockclassextension" rev="2.2.2" conf="test->default"/>
<dependency org="cglib" name="cglib-nodep" rev="2.1_3" conf="test->default"/>
<dependency org="org.testng" name="testng" rev="5.0" conf="test->default" />
<!-- Test dependencies for Apache Directory Server -->
<dependency org="org.apache.directory.server" name="apacheds-core" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-core-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-server-jndi" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-server-main" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-changepw" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-kerberos" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-kerberos-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-ldap" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-asn1" rev="0.9.5.3"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-asn1-codec" rev="0.9.5.3"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-ldap" rev="0.9.5.3"
conf="test->default"/>
<dependency org="log4j" name="log4j" rev="1.2.9" conf="test->default" />
<dependency org="antlr" name="antlr" rev="2.7.2" conf="test->default" />
<dependency org="jdbm" name="jdbm" rev="1.0" conf="test->default" />
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.0"
conf="test->default" />
<dependency org="org.apache.mina" name="mina-core" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.mina" name="mina-filter-ssl" rev="1.0.0"
conf="test->default"/>
<!-- End test dependencies for Apache Directory Server -->
</dependencies>
</ivy-module>
<dependency org="cglib" name="cglib-nodep" rev="2.1_3" conf="test->default"/>
<!-- Test dependencies for Apache Directory Server -->
<dependency org="org.apache.directory.server" name="apacheds-core" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-core-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-server-jndi" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-server-main" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-changepw" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-kerberos" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-kerberos-shared" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.server" name="apacheds-protocol-ldap" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-asn1" rev="0.9.5.3"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-asn1-codec" rev="0.9.5.3"
conf="test->default"/>
<dependency org="org.apache.directory.shared" name="shared-ldap" rev="0.9.5.3"
conf="test->default"/>
<dependency org="log4j" name="log4j" rev="1.2.9" conf="test->default" />
<dependency org="antlr" name="antlr" rev="2.7.2" conf="test->default" />
<dependency org="jdbm" name="jdbm" rev="1.0" conf="test->default" />
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.0"
conf="test->default" />
<dependency org="org.apache.mina" name="mina-core" rev="1.0.0"
conf="test->default"/>
<dependency org="org.apache.mina" name="mina-filter-ssl" rev="1.0.0"
conf="test->default"/>
<!-- End test dependencies for Apache Directory Server -->
</dependencies>
</ivy-module>

View File

@@ -5,6 +5,7 @@
*/
package org.springframework.ldap.odm.dao;
import junit.framework.Assert;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -14,14 +15,13 @@ import org.springframework.ldap.NameNotFoundException;
import org.springframework.ldap.core.DistinguishedName;
import org.springframework.ldap.odm.entity.ITestPerson;
import org.springframework.ldap.odm.entity.ITestRole;
import org.testng.Assert;
import java.util.List;
public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
public class LdapDaoITest extends AbstractLdapTemplateIntegrationTest
{
protected static final Log LOGGER = LogFactory.getLog(LdapDaoTest.class);
protected static final Log LOGGER = LogFactory.getLog(LdapDaoITest.class);
protected LdapDao ldapDao;
private ITestPerson testPerson;
@@ -87,7 +87,7 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
ldapDao.create(testPerson);
ITestPerson retrieved = (ITestPerson) ldapDao.findByNamingAttribute(testPerson.getIdentifier(), ITestPerson.class);
LOGGER.debug(retrieved);
Assert.assertNotNull(retrieved, "Should've found the created entity.");
Assert.assertNotNull("Should've found the created entity.", retrieved);
}
@@ -109,7 +109,7 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
DistinguishedName dn = new DistinguishedName("uid=" + testPerson.getIdentifier() + ",ou=people");
ITestPerson retrieved = (ITestPerson) ldapDao.findByDn(dn, ITestPerson.class);
LOGGER.debug(retrieved);
Assert.assertNotNull(retrieved, "Should've found the created entity.");
Assert.assertNotNull("Should've found the created entity.", retrieved);
}
@@ -123,9 +123,9 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
}
catch (Exception expected)
{
Assert.assertTrue(expected instanceof NameAlreadyBoundException,
"Exception type doesn't match expected. ( got: "
+ expected.getMessage());
Assert.assertTrue("Exception type doesn't match expected. ( got: "
+ expected.getMessage(),
expected instanceof NameAlreadyBoundException);
}
}
@@ -141,7 +141,8 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
ldapDao.create(testPerson);
List results = ldapDao.filterByBeanProperty(testPerson.getEmailAddress(), "EmailAddress", ITestPerson.class);
LOGGER.debug("filterByBeanProperty returned: " + results.size() + " results.");
Assert.assertTrue(results.size() > 0, "Filter should return collection containing more than one result. ");
Assert.assertTrue("Filter should return collection containing more than one result. ",
results.size() > 0);
}
public void testUpdateEntity()
@@ -154,7 +155,7 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
ldapDao.update(testPerson);
ITestPerson retrieved = (ITestPerson) ldapDao.findByNamingAttribute(testPerson.getIdentifier(),
ITestPerson.class);
Assert.assertEquals(retrieved.getEmailAddress(), newEmail, "Email name not updated.");
Assert.assertEquals("Email name not updated.", retrieved.getEmailAddress(), newEmail);
}
catch (Exception unexpected)
{
@@ -183,7 +184,7 @@ public class LdapDaoTest extends AbstractLdapTemplateIntegrationTest
LOGGER.debug(testPerson);
ldapDao.delete(testPerson);
ITestPerson retrieved = (ITestPerson) ldapDao.findByNamingAttribute(testPerson.getIdentifier(), ITestPerson.class);
Assert.assertNull(retrieved, "Entity should've been deleted.");
Assert.assertNull("Entity should've been deleted.", retrieved);
}

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This context automatically starts the Apache Directory Server
and sets up the test data
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- JNDI environment variable -->
<bean id="environment"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="java.naming.security.authentication">
simple
</prop>
<prop key="java.naming.security.principal">
${userDn}
</prop>
<prop key="java.naming.security.credentials">
${password}
</prop>
</props>
</property>
</bean>
<!--
Note the non-standard port, in order to leave 389 unused, thus
making it easier for the integration tests requiring OpenLDAP.
-->
<bean id="configuration" class="org.apache.directory.server.configuration.MutableServerStartupConfiguration">
<property name="ldapPort" value="3900" />
<property name="contextPartitionConfigurations">
<set>
<ref bean="jaywayPartitionConfiguration"/>
</set>
</property>
</bean>
<bean id="jaywayPartitionConfiguration"
class="org.apache.directory.server.core.partition.impl.btree.MutableBTreePartitionConfiguration">
<property name="name" value="example" />
<property name="suffix" value="dc=example,dc=com" />
<property name="contextEntry">
<value>
objectClass: top
objectClass: domain
objectClass: extensibleObject
dc: example
</value>
</property>
</bean>
<bean id="configEnvHelper" class="org.springframework.ldap.ConfigEnvHelper">
<constructor-arg ref="environment" />
<constructor-arg ref="configuration" />
</bean>
<bean name="serverContext" class="javax.naming.InitialContext">
<constructor-arg>
<bean class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
<property name="targetObject" ref="configEnvHelper" />
<property name="propertyPath" value="env" />
</bean>
</constructor-arg>
</bean>
<bean name="ldapServerManager" class="org.springframework.ldap.LdapServerManager">
<property name="contextSource" ref="contextSource" />
</bean>
<!-- Custom editors required to launch ApacheDS -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="javax.naming.directory.Attributes">
<bean class="org.apache.directory.server.core.configuration.AttributesPropertyEditor"/>
</entry>
</map>
</property>
</bean>
</beans>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<import resource="classpath:/apacheDsContext.xml"/>
<bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:/ldap.properties" />
</bean>
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource" >
<property name="urls" value="${urls}" />
<property name="userDn" value="${userDn}" />
<property name="password" value="${password}" />
<property name="base" value="${base}" />
<property name="dirObjectFactory" value="org.springframework.ldap.core.support.DefaultDirObjectFactory" />
</bean>
<bean id="ldapTemplate" singleton="true" class="org.springframework.ldap.core.LdapTemplate">
<constructor-arg ref="contextSource"/>
</bean>
<bean id="typeConverter" singleton="true" class="org.springframework.ldap.odm.attributetypes.LdapTypeConverter"/>
<bean id="referencedEntryEditorFactory" singleton="true"
class="org.springframework.ldap.odm.attributetypes.ReferencedEntryEditorFactory">
<constructor-arg value="${base}" />
<constructor-arg ref="ldapTemplate"/>
</bean>
<bean id="ctxMapperFactory" singleton="true"
class="org.springframework.ldap.odm.mapping.ObjectDirectoryMapperFactory">
<constructor-arg ref="typeConverter"/>
<constructor-arg ref="referencedEntryEditorFactory"/>
</bean>
<bean id="ldapDao" singleton="true" class="org.springframework.ldap.odm.dao.LdapDaoImpl">
<constructor-arg ref="ldapTemplate"/>
<constructor-arg ref="ctxMapperFactory"/>
</bean>
</beans>

View File

@@ -0,0 +1,4 @@
urls=ldap://127.0.0.1:3900
userDn=uid=admin,ou=system
password=secret
base=dc=example,dc=com

View File

@@ -0,0 +1,50 @@
<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<!-- <param name="ConversionPattern" value="[%d{dd/MMM/yyy:HH:mm:ss:SS}] [%t] [%x] %-5p %c{1} - %m %n"/> -->
<param name="ConversionPattern" value="[%t] [%x] %-5p %c{1} - %m %n"/>
</layout>
</appender>
<appender name="file" class="org.apache.log4j.FileAppender">
<param name="file" value="odm.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd/MMM/yyy:HH:mm:ss:SS}] [%t] [%x] %-5p %c{1} - %m %n"/>
</layout>
</appender>
<logger name="org.springframework.beans">
<level value="warn"/>
<appender-ref ref="console"/>
</logger>
<logger name="org.springframework.context">
<level value="warn"/>
<appender-ref ref="console"/>
</logger>
<logger name="org.apache.directory">
<level value="error"/>
<appender-ref ref="console"/>
</logger>
<logger name="org.springframework.core">
<level value="warn"/>
<appender-ref ref="console"/>
</logger>
<logger name="org.springframework.ldap.core">
<level value="info"/>
<appender-ref ref="console"/>
</logger>
<logger name="org.springframework.ldap.odm">
<level value="debug"/>
<appender-ref ref="console"/>
</logger>
</log4j:configuration>

View File

@@ -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

View File

@@ -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

View File

@@ -16,9 +16,9 @@ import java.text.SimpleDateFormat;
import java.util.Date;
/**
* <p>
* <p/>
* LdapTypeConverter is responsible for the conversion of LDAP attributes returned in String form
* to native java types and vice versa. It it leverages Spring's property editors, with
* to native java types and vice versa. It it leverages Spring's property editors, with
* some custom editors to:
* <li>
* <ul>convert generalized time strings to <code>java.util.Date.</code></ul>
@@ -26,17 +26,18 @@ import java.util.Date;
* <code>org.springframework.ldap.core.DistinguishedName</code>.</ul>
* </li>
* </p>
* <p>
* <p/>
* Additional custom editors may be created at runtime to if an Object Directory Map
* contains references to other mapped objects (eg. A role of type Role.class containing
* references to members of type Person.class)
*
* <p/>
* </p>
*
*/
public class LdapTypeConverter extends SimpleTypeConverter
{
private static final DateFormat GENERALIZED_TIME = new SimpleDateFormat("yyyyMMddHHmmss.S");
private static final DateFormat GENERALIZED_TIME
= new SimpleDateFormat("yyyyMMddHHmmss.SSSZ");
public LdapTypeConverter()
{

View File

@@ -1,7 +1,8 @@
<html>
<body>
Provides a realization of the Data Access Object (DAO) pattern using object directory mapping.
Provides a realization of the Data Access Object (DAO) pattern using LDAP
object directory mapping.
</body>
</html>

View File

@@ -30,7 +30,9 @@ public interface ObjectDirectoryMap
/** The set of bean property names in the Object Directory Map. */
Set<String> beanPropertyNames();
/** The <code>Class</code> that the Object Directory Map corresponds to. */
/** The <code>Class</code> that the Object Directory Map represents. That is,
* LDAP entries will be serialized to and from this class.
*/
Class getClazz();
/** The name of the attribute corresponding to the first element in a distinguished

View File

@@ -1,7 +1,7 @@
<html>
<body>
Contains utility classes.
Utility classes.
</body>
</html>

View File

@@ -19,8 +19,8 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Calendar;
//TODO: There's probably a lot of redundant tests in here
public class LdapTypeConverterTest extends TestCase
{
private static final Log LOGGER = LogFactory.getLog(LdapTypeConverterTest.class);
@@ -120,17 +120,15 @@ public class LdapTypeConverterTest extends TestCase
}
}
public void testConvertToGeneralizedTime() throws ParseException
public void testConvertToDate() throws ParseException
{
String object1 = "20061005093637.44";
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S");
Date expected = df.parse("20061005093637.44");
String object1 = "19700101100000.000+1000";
try
{
Object translated = typeConverter.convertIfNecessary(object1,
Date.class);
Assert.assertEquals(translated, expected,
Assert.assertEquals(translated, new Date(0L),
"Unexpected translated value");
}
catch (TypeMismatchException e)
@@ -141,41 +139,44 @@ public class LdapTypeConverterTest extends TestCase
public void testConvertFromDate()
{
Date source = new Date(1184283822285L); //Friday July 13, 2007 9:43:42 AM
Assert.assertEquals(typeConverter.getAsText(source), "20070713094342.285");
Date source = new Date(1184283822285L); //Friday July 13, 2007 9:43:42 AM GMT+1000
LOGGER.debug(typeConverter.getAsText(source));
Assert.assertTrue(typeConverter.getAsText(source)
.matches("20070713\\d\\d\\d\\d42.285\\+\\d\\d\\d\\d"));
}
public void testConvertToGeneralizedTimeArray() throws ParseException
public void testConvertToDateArray() throws ParseException
{
String object1 = "20071105093655.44";
String object2 = "20061005093637.44";
String object1 = "20071105093655.0+1000";
String object2 = "19700101100000.0+1000";
Object objectToTranslate = new String[]{object1, object2};
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss.S");
Date expected = df.parse("20061005093637.44");
try
{
Object[] translated = (Object[]) typeConverter.convertIfNecessary(
objectToTranslate, Date[].class);
Assert.assertEquals(translated[1], expected,
Assert.assertEquals(translated[1], new Date(0L),
"Unexpected translated value");
}
catch (TypeMismatchException e)
{
e.printStackTrace();
Assert.fail("Unexpected exception during translation");
}
}
public void testConvertFromDateArray()
{
Date date1 = new Date(1184283822285L); //Friday July 13, 2007 9:43:42 AM
Date date2 = new Date(0); //epoch
Date date1 = new Date(1184283822285L); //Friday July 13, 2007 9:43:42 AM + GMT+1000
Date date2 = new Date(0); //epoch + GMT + 1000
Date[] dates = new Date[]{date1, date2};
String[] converted = typeConverter.getAllAsText(dates);
Assert.assertEquals(converted[0], "20070713094342.285");
Assert.assertEquals(converted[1], "19700101100000.0");
Assert.assertTrue(converted[0].matches("20070713\\d\\d\\d\\d42.285\\+\\d\\d\\d\\d"));
Assert.assertTrue(converted[1].matches("19700101\\d\\d\\d\\d00.000\\+\\d\\d\\d\\d"));
}
public void testConvertToLdapName()

View File

@@ -150,7 +150,8 @@ public class ObjectDirectoryMapperImplTest extends TestCase
Assert.assertEquals("bean@bean.com", ctxAdapter.getStringAttribute("mail"));
Assert.assertEquals("fred", new String((byte[]) ctxAdapter.getObjectAttribute("userpassword")));
Assert.assertEquals("false", ctxAdapter.getStringAttribute("acceptemails"));
Assert.assertEquals("19700101100000.1", ctxAdapter.getStringAttribute("loginresettime"));
Assert.assertTrue(ctxAdapter.getStringAttribute("loginresettime")
.matches("19700101\\d\\d\\d\\d00.001\\+\\d\\d\\d\\d"));
Assert.assertEquals("3", ctxAdapter.getStringAttribute("failedlogins"));
Assert.assertEquals("uid=amAdmin, ou=people, dc=myretsu, dc=com",
ctxAdapter.getStringAttribute("creatorname"));