diff --git a/changelog.txt b/changelog.txt
index 2e35e322..2d30b55d 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,569 +1,574 @@
-Spring LDAP CHANGELOG
-=====================
-http://www.springframework.org/ldap
-
-http://www.ietf.org/rfc/rfc1960.txt
-http://www.ietf.org/rfc/rfc2251.txt
-http://www.ietf.org/rfc/rfc2252.txt
-http://www.ietf.org/rfc/rfc2253.txt
-http://www.ietf.org/rfc/rfc2254.txt
-http://www.ietf.org/rfc/rfc2255.txt
-http://www.ietf.org/rfc/rfc2256.txt
-http://www.ietf.org/rfc/rfc2696.txt
-
-Changes in version 1.3.1 (Fall 2009)
--------------------------------------------
-* Added an extension to ContextMapperCallbackHandler that can provide the
- associated mapper with an indication that the response is different for
- each search result. (LDAP-185)
-
-* Added utility methods for converting a Windows security identifier (SID)
- between a binary format and a slightly more readable string format.
- http://msdn.microsoft.com/en-us/library/aa379571%28VS.85%29.aspx
- (LDAP-187)
-
-* Added authentication methods that provide a possible authentication
- exception through an AuthenticationErrorCallback. (LDAP-192)
-
-* DefaultDirObjectFactory calls a Java5 version of the IllegalArgumentException
- constructor. (LDAP 196).
-
-* Upgraded Spring to 2.5.6.SEC01. (LDAP-194)
-
-Changes in version 1.3.0 (Jan 2009)
--------------------------------------------
-* Added methods for simple LDAP 'bind' authentication in LdapOperations and
- SimpleLdapOperations. The methods will perform a search given a supplied
- filter, call ContextSource#getContext(dn, password), and optionally callback
- to a supplied instance to perform an LDAP operation on the context.
-
-* Re-used the same fix for LDAP-109 and LDAP-50 that was used in
- DefaultDirObjectFactory to secure the DirContextAdapter constructors from
- invalid CompositeNames.
-
-* Made sure DirContextOperations#addAttributeValue(String, Object) does not add
- any duplicate values per default; added alternate method:
- DirContextOperations#addAttributeValue(String, Object, boolean) to enable
- behavior other than the default (i.e. allowing duplicates).
-
-* Made sure that DirContextAdapter#setDn() throws exception if in update mode
- (The value is not set anyway, and this was previously silently ignored).
-
-* Improved more search methods that take handlers so that they will work
- with handlers that use ContextMappers, e.g. ContextMapperCallbackHandler.
- (LDAP-162)
-
-* Made sure article sample tests are possible to run without running web
- application (i.e. tests automatically start internal LDAP server). (LDAP-143)
-
-* SortControlDirContextProcessor no longer has hard dependencies to controls in
- LDAP Booster Pack. (LDAP-159)
-
-* Common code in DirContextProcessor implementations has been pulled up to a
- base class called AbstractFallbackRequestAndResponseControlDirContextProcessor.
- (LDAP-161)
-
-* PagedResultsRequestControl has been deprecated in favor of
- PagedResultsDirContextProcessor, which takes advantage of the new
- AbstractFallbackRequestAndResponseControlDirContextProcessor. (LDAP-160)
-
-* Added spring-tx as required dependency (the DataAccessExceptions require
- this).
-
-* Added demo projects to simplify refactoring demonstrations. (LDAP-154)
-
-* Added LdapEntryIdentification, a simple bean containing the DNs of an LDAP
- entry, relative to the base context as well as absolute. Also added
- special ContextMapper implementation producing these entries;
- LdapEntryIdentificationContextMapper. (LDAP-149)
-
-* Added LdapTemplate#searchForObject(base, filter, mapper) and
- SimpleLdapTemplate#searchForObject(base, filter, mapper); methods
- to search for a single object, analogous to JdbcTemplate#queryForObject().
- (LDAP-150)
-
-* DistinguishedName (LdapRdnComponent really) now correctly calculates the
- hashCode for names where case differs, and now correctly adheres to the
- equals/hashCode contract. (LDAP-151)
-
-* Various improvements to immutability of DistinguishedNames throughout the
- framework. DistinguishedName#immutableDistinguishedName now produces a truly
- immutable copy of the original. Also made sure that it is not possible to
- accidentally alter the internal state of e.g. DirContextAdapter by modifying
- its DistinguishedName - copies are now returned in DirContextAdapter#getDn()
- and DirContextAdapter#getBase(). (LDAP-146)
-
-* Added LdapTemplate#rebind(DirContextOperations). (LDAP-144)
-
-* Added PresentFilter and NotPresentFilter to simplify searching for presence
- or absence of an attribute. (LDAP-152)
-
-* Added DirContextAdapter constructor that takes its DN as a String. (LDAP-145)
-
-Changes in version 1.3.0.RC1 (Oct 2008)
--------------------------------------------
-* TLS connections are now supported using the DefaultTlsDirContextAuthenticationStrategy
- and ExternalTlsDirContextAuthenticationStrategy. (LDAP-8)
-
-* NameNotFound is no longer silently ignored in searches. It is possible
- to use the old behavior by setting the ignoreNameNotFoundException property
- to true in LdapTemplate. (LDAP-134)
-
-* Referrals can now be handled by setting the property 'Context.REFERRAL'
- to 'follow' in the base context supplied to AbstractContextSource, provided
- that name servers are set up properly. Any DirContextAdapter instances
- resulting from referrals will provide the URL of the referred server in
- getReferralUrl(). (LDAP-136, LDAP-9)
-
-* The hard dependency on LDAP Booster Pack has now been completely removed,
- preventing NoClassDefFoundErrors when using Paged Results without that
- library on the classpath. (LDAP-110, LDAP-118)
-
-* The dreaded problem with '\' in Distinguished Names is now resolved.
- (LDAP-50, LDAP-109)
-
-* Added bind method that takes a DirContextOperations instance as parameter,
- performing the bind using the DN and Attributes from the DirContextOperations
- instance. (LDAP-140)
-
-* DistinguishedName now returns compactly formatted String representations
- from toString, e.g.:
- cn=John Doe,ou=Company,c=Sweden
- rather than
- cn=John Doe, ou=Company, c=Sweden
- To keep using the old formatting (for backward compatibility) set the
- system property org.springframework.ldap.core.spacedDnFormat to true.
- (LDAP-138, LDAP-112, LDAP-91)
-
-* Changed default of 'pooling' flag in AbstractContextSource.
- This now defaults to false; consider the Spring LDAP PoolingContextSource
- as the preferred alternative to using the built-in Java Connection Pooling.
-
-* Added configuration property to AbstractContextSource to specify referral
- behavior. Setting this property to 'follow' will enable referrals to be
- automatically followed, provided that the name server environment is properly
- set up.
-
-* Now using Maven for building internally. (LDAP-80, LDAP-82, LDAP-95)
-
-* Added HardcodedFilter class and corresponding PropertyEditor FilterEditor,
- to allow for easily working with pre-encoded search filters
- e.g. in configuration files. (LDAP-28)
-
-* Added ContextSourceAndHibernateTransactionManager to enable integration
- of client-side LDAP Transactions in a Hibernate environment. (LDAP-115)
-
-* Added append method to BinaryLogicalFilter allowing client code to use
- and/or filters from the same code. (LDAP-116)
-
-* Introduced DirContextAuthenticationStrategy to AbstractContextSource
- to enable more flexible context authentication strategies, e.g.
- TLS and Proxy Auth. (LDAP-124)
-
-* Corrected reference doc claiming DataAccessException hierarchy. (LDAP-106)
-
-* Probably the most requested feature of all - a plain method for simple
- authentication is now provided in the ContextSource interface.
- (LDAP-39, LDAP-103)
-
-* The order of multi-valued attributes is now properly preserved by
- DirContextAdapter#getModificationItems(). (LDAP-96)
-
-* ContextSourceTransactionManager now properly throws a
- CannotCreateTransactionException if anything goes wrong in doBegin(). (LDAP-122)
-
-* It is now possible to set the criticality on PagedResultsControl.
- (LDAP-126)
-
-* DirContextAdapter now has a getObjectAttributes method, as stated in
- reference docs. (LDAP-137)
-
-* DirContextAdapter#getStringAttributes, getObjectAttributes, and
- getAttributeSortedStringSet now all return null if the requested Attribute
- is not present, and an empty result (array or set) if present but empty.
- (LDAP-130)
-
-* SimpleLdapOperations/SimpleLdapTemplate now has mirrored methods that take
- Name parameters. (LDAP-139)
-
-* Fixed documentation glitch regarding ContextSourceAndDataSourceTransactionManager.
- (LDAP-99)
-
-* Added the possibility to configure the search scope on DefaultDirContextValidator.
- Changed the default to OBJECT_SCOPE. (LDAP-121)
-
-* Fixed DistinguishedName parsing error; \r is now allowed in Distinguished Names,
- complying with LDAP v3 DN RFC. (LDAP-97)
-
-* Moved SingleContextSource from an obscure inner class to a top-level
- class. This class doesn't close the DirContext, but reuses the same.
- Useful for scenarios like Paged Results. (LDAP-114)
-
-* Removed deprecated method setUserName() in AbstractContextSource.
-
-* Added a method DistinguishedName.toCompactString that returns a more
- compact String representation without blanks. (LDAP-91)
-
-* Improved search methods that take handlers so that they will work
- with handlers that use ContextMappers, eg ContextMapperCallbackHandler.
- (LDAP-107)
-
-* Fixed a problem where the narrowest possible exception subclass was
- not always found in the exception translation. (LDAP-100)
-
-* Made changes required for paged results to work when using Spring LDAP
- connection pool with a single connection. (LDAP-114)
-
-* Removed AcegiAuthenticationSource - use SpringSecurityAuthenticationSource
- (included with Spring Security) instead.
-
-* Upgraded commons-lang to 2.3.
-
-* Upgraded Spring to 2.5.6. (LDAP-125)
-
-Changes in version 1.2.1 (Dec 2007)
--------------------------------------------
-* Added pooling library which features flexible connection validation
- and better configuration than the built-in pooling. (LDAP-85)
-
-* Fixed a problem in AbstractContextSource which led to an unnecessary
- reference to the LDAP Booster Pack (ldapbp). (LDAP-88, LDAP-89)
-
-* Added missing package description and updated copyright. (LDAP-92)
-
-* Added build instructions. (LDAP-27)
-
-* Fixed bug in SimpleLdapTemplate where the wrong target method was being
- called. (LDAP-93)
-
-* Made createContext in AbstractContextSource protected rather than
- package private. (LDAP-94)
-
-Changes in version 1.2 (Oct 2007)
--------------------------------------------
-A number of API-breaking changes have been made in the 1.2 release compared to version 1.1.2.
-Consequently this is NOT a drop-in replacement for Spring LDAP 1.1.2,
-though upgrading should not present all that much work. Please see
-the supplied upgrade guide for details.
-
-* Added getContextSource on LdapTemplate.
-
-* The following getters on AbstractContextSource have been added:
- getContextFactory
- getDirObjectFactory
- getAuthenticationSource
- getUrls (was protected)
- isPooled
- isAnonymousReadOnly
-
-* Upgraded to Spring 2.0.6 internally. Spring 1.2.x is still supported.
-
-* Reviewed all javadoc.
-
-* Revised reference manual.
-
-* AbstractConnection source now actively removes pooling flag from context environment
- if pooling is set to 'false'. (LDAP-83)
-
-* AcegiAuthenticationSource now supports anonymous authentication. (LDAP-67)
-
-* Added BaseLdapPathSource, BaseLdapPathAware and BaseLdapNameBeanPostProcessor to be used
- if the ContextSource base path is needed by beans. There is now also a DistinguishedNameEditor
- available for directly injecting DistinguishedName instances to beans. (LDAP-86)
-
-* Added immutableDistinguishedName() method in DistinguishedName to get an immutable
- copy of the instance. (LDAP-87)
-
-* Added easier access methods for RDN attributes and values. (LDAP-71)
-
-* Added lookupContext() and alternate modifyAttributes() in LdapOperations/LdapTemplate
- to simplify updates. (LDAP-78)
-
-* Modified append() method in DistinguishedName. This method now returns the instance, to
- enable more fluent building of DistinguishedNames. (LDAP-74)
-
-* Added SimpleLdapTemplate providing Java 5 generics support. (LDAP-72)
-
-* Added AbstractContextMapper implementation. (LDAP-76)
-
-Changes in version 1.2-RC1 (5.12.2007)
--------------------------------------------
-A number of API-breaking changes have been made in this release,
-mainly package restructuring stuff (LDAP-33). Consequently this is
-NOT a drop-in replacement for Spring LDAP 1.1.2, though upgrading
-should not present all that much work. Please see the supplied
-upgrade guide for details.
-
-* Restructured packages (LDAP-33):
- - Moved the core classes into the package ldap.core.
- - Moved subpackages of ldap.support to top level.
- - Moved most classes in ldap.support to ldap.core or ldap.core.support.
- - Moved classes in ldap.utils to ldap.support and removed ldap.utils.
-
-* Changed the exception hierarchy to be an unchecked mirror of the JNDI
- NamingException hierarchy (LDAP-4).
-
-* Deprecated the userName property in AbstractContextSource and changed
- it to the more correct userDn (LDAP-18).
-
-* Fixed bug causing PagedResultsRequestControl processing to fail against AD
- in the case of a PartialResultsException (LDAP-32).
-
-* Fixed bug causing NullPointerException in some environments when performing
- PagedResultsRequestControl search (LDAP-37).
-
-* Implemented client-side transaction support for Spring LDAP. See reference
- documentation for further information (LDAP-29).
-
-* DirContextAdapter.setAttribute() now properly updates updatedAttrs in update mode
- (resulting in ModificationItems if applicable) (LDAP-15).
-
-* Exceptions thrown by Spring LDAP are now always Serializable, regardless of whether
- the wrapped NamingException is (which is not always the case) (LDAP-14).
-
-* LdapRdnComponent now implements Serializable (LDAP-45).
-
-* Rewrote LdapEncoder.nameDecode() to solve problem with national characters and
- remove regular expression used in parsing, drastically improving Distinguished Name
- parsing performance as a bonus (LDAP-30).
-
-* The DefaultDirObjectFactory.JNDI_ENV_BASE_PATH_KEY has been deprecated. If the base
- property needs to be accessed from a subclass to AbstractContextSource, use the new
- protected method getBase (LDAP-55).
-
-* LdapContextSource.getAnonymousEnv no longer sets a broken ResponseControlFactory in
- the environment (LDAP-64).
-
-* Upgraded ApacheDS to 1.0.0 (LDAP-32).
-
-* Upgraded to Acegi Security 1.0.3 (LDAP-61).
-
-* Upgraded to ApacheDS 1.0.0 (LDAP-32).
-
-* Upgraded to Spring 2.0.4 internally. Spring 1.2.x is still supported (LDAP-35, LDAP-51).
-
-* Upgraded to Spring WebFlow 1.0.2 in the Person sample (LDAP-60).
-
-* Fixed a number of documentation errors and typos (LDAP-41, LDAP-40, LDAP-47, LDAP-48).
-
-* Extracted useful inner classes from LdapTemplate to top-level classes (LDAP-42).
-
-* Implemented addAttributeValue and removeAttributeValue in DirContextAdapter (LDAP-5).
-
-* Modified DirContextOperations interface so that getNameInNamespace doesn't throw NamingException.
-
-* Fixed NullPointerException when getting PagedResultsRequestControl response (LDAP-66).
-
-* Rewrote logic i DirContextAdapter.getModificationItems(). The JNDI provider's Attribute
- comparison logic is now used internally. Also, REMOVE_ATTRIBUTE items are placed
- first in the ModificationItem array, in order to prevent ATTRIBUTE_ALREADY_EXIST errors
- (LDAP-13, LDAP-46).
-
-* In internal integration tests, each test now runs on a clean LDAP database (LDAP-43).
-
-* DirContextProcessor#postProcess() is now called in searches regardless of whether an
- exception is thrown (LDAP-26).
-
-* Moved SortControlDirContextProcessor to spring-ldap from sandbox (LDAP-68).
-
-
-Changes in version 1.1.2 (1.12.2006)
--------------------------------------------
-* Fixed problem with DirContextAdapter.getNameInNameSpace. Now it really
- returns the full DN.
-
-* There is now a wrapper class called PagedResult, which can be used to
- wrap the resulting list and the PagedResultsCookie after using
- PagedResultsRequestControl.
-
-* The actual cookie in PagedResultsCookie is now immutable.
-
-* The person sample is now a Spring WebFlow application, where the user
- can manage persons and standard LDAP access groups.
-
-* Improved javadoc for DefaultDirObjectFactory and DistinguishedName.
-
-* Upgraded Spring to 2.0.1 internally. Spring 1.2.8 is still supported.
-
-Changes in version 1.1.1 (18.11.2006)
--------------------------------------------
-* Added capability to use server-side controls in search by leveraging
- DirContextProcessor.
-
-* Added generic DirContextProcessor that is run before and after a search.
-
-* Added paged search result functionality in PagedResultsRequestControl,
- which is an implementation of DirContextProcessor.
-
-* Fixed problem with DirContextAdapter, where the wrong change was applied
- when a change was followed by a reset to the original values.
-
-* DirContextAdapter.getNameInNamespace() now returns the full DN, as per the
- documentation for javax.naming.Context.
-
-* The parsing of DistinguishedName has been changed from using regexp to
- a JavaCC parser, which means improved performance (5-6 times faster) and
- better error messages.
-
-* DistinguishedName now supports multi-valued RDNs separated by a '+' sign,
- like "cn=Rod+sn=Johnson", for example. All according to spec 2253.
-
-* LdapRdn is now Serializable.
-
-* Added lookup methods that take an array of return attribute names.
-
-* Made DistinguishedName.EMPTY_NAME an immutable DistinguishedName instance.
-
-* Separated integration tests that require OpenLDAP from the other integration
- tests that run the in-JVM Apache DS server.
-
-* Changed the spring-ldap-person sample application to authenticate and
- authorize against groups rather than role attributes.
-
-* Upgraded Spring to 2.0 internally. Spring 1.2.8 is still supported.
-
-Changes in version 1.1 (28.8.2006)
--------------------------------------------
-* Changed base package from net.sf.ldaptemplate to org.springframework.ldap
-
-* Changed package ...support.acegi to ...support.authentication
-
-* Replaced SearchResultCallbackHandler with NameClassCallbackHandler
- to enable its use in all search operations (search, list, listBindings).
- Changed all references and implementing classes accordingly,
- including name changes where applicable:
- ** CollectingSearchResultCallbackHandler was replaced by CollectingNameClassPairCallbackHandler.
- ** CountSearchResultCallbackHandler was replaced by CountNameClassPairCallbackHandler
-
-* Added NameClassPairMapper for use with list operations
-
-* Added DefaultNameClassPairCallbackHandler.
-
-* Added DefaultValuesAuthenticationSourceDecorator to enable default authentication
- information when AuthenticationSource returns empty values.
-
-* ContextSource implementations now creates authenticated Contexts by default,
- since the previous behaviour has proven to be confusing.
- The authenticatedReadOnly flag was replaced by an anonymousReadOnly flag.
-
-* AbstractContextSource now defaults the dirObjectFactory property to DefaultDirObjectFactory.
-
-* Added search methods to LdapTemplate for specifying return attributes.
-
-* Added list and listBindings methods to LdapTemplate.
-
-* Fixed bug in AbstractContextSource regarding java version number and base path.
-
-* Improved javadocs.
-
-* Upgraded Spring to 2.0-rc3.
-
-* Added full reference documentation.
-
-Changes in version 1.0.2 (LdapTemplate) (26.6.2006)
-------------------------------------
-* Added methods in LdapTemplate to unbind recursively.
-
-* Added rename() method to LdapTemplate.
-
-* Fixed bug in getPrefix() of DistinguishedName.
-
-* Fixed bug in getModificationItems() of DirContextAdapter.
- The method now correctly handles changes of individual vales in
- multi-value attributes.
-
-* Introduced AbstractContextSource, moved the code from LdapContextSource there
- and made LdapContextSource and DirContextSource inherit from this.
-
-* Upgraded to Acegi 1.0.0. Removed classes no longer needed:
- LdapTemplateLdapAuthenticationProvider
- LdapTemplateUserDetails
- *NOTE*:
- This means that configuration needs to be changed if using Acegi,
- since the API and package structure has changed in Acegi between
- versions 1.0.0-RC2 and 1.0.0 final.
-
-
-Changes in version 1.0.1 (LdapTemplate) (5.5.2006)
------------------------------------
-* Now checking whether the first argument to getObjectInstance in
- DefaultDirObjectFactory is a Context, and if so, closing it properly.
-
-* Fixed reference to non-existent ContextSourceImpl in ldaptemplate-person.
-
-* Upgraded Spring to 2.0-m4.
-
-* Upgraded DDSteps to 1.1-rc1 and EasyMock to 1.2.
-
-Changes in version 1.0 (LdapTemplate) (24.4.2006)
-----------------------------------
-* Introduced the AuthenticationSource interface to enable other strategies for
- retrieving principal and credentials than a hard-coded username/password.
-
-* Added the AcegiAuthenticationSource implementation for retrieving a previously
- authenticated principal and credentials using Acegi.
-
-* Added a 'cacheEnvironmentProperties' property that enables the user to choose
- whether to cache the environment HashMap or to re-create it each time a new
- Context is created.
-
-* Added an ignorePartialResultException to LdapTemplate which causes all
- PartialResultExceptions to be ignored during searches, for use when working
- against Active Directory, which cannot handle referrals correctly.
-
-* Added search methods in LdapOperations (and LdapTemplate) that take a
- parameter for SearchControls.
-
-* The methods getNamesOfModifiedAttributes, update, and getAttributeSortedStringSet
- in DirContextOperations (and DirContextAdapter) no longer throw NamingException.
- Instead, they throw unchecked DataAccessExceptions.
-
-* The method getModificationItems in AttributeModificationsAware no longer throws
- NamingException. Instead, it throws unchecked DataAccessExceptions.
-
-* Removed the (unused) 'task' parameter to NamingExceptionTranslator.translate.
-
-* Removed the deprecated ContextSourceImpl class.
-
-* Integration tests now run using an in-memory version of Apache Directory Server,
- rather than requiring a working installation of a directory server.
-
-* Integration tests now run together with pure unit tests under the 'tests' Ant target.
-
-* The ldaptemplate-person sample web application now uses an in-memory version of Apache
- Directory Server, rather than requiring a working installation of a directory server.
-
-* Upgraded Spring to 2.0-m3.
-
-* The build now uses Ivy 1.3.1.
-
-Changes in version 1.0-RC2 (LdapTemplate) (22.2.2006)
---------------------------------------
-* LdapV2 is now supported.
- ContextSourceImpl has been deprecated. In stead the new
- LdapContextSource should be used for LdapV3 and a DirContextSource
- has been added for LdapV2 compatibility.
-
-* Ability has been added in LdapContextSource and DirContextSource
- to specify that an authenticated context should be used for
- read-only operations as well. Use property 'authenticatedReadOnly'
- in LdapContextSource/DirContextSource.
-
-* The Filter classes have been cleaned up.
-
-* DirContextAdapter has been cleaned up. Most important to note is that
- in this operation the 'setStringAttribute/setStringAttributes' methods
- have been removed and replaced by 'setAttributeValue/setAttributeValues'.
-
-* Base DNs are now correctly URL encoded when building the connection String.
- This means that spaces and other 'unsafe' characters in base DNs should no
- longer be manually URL encoded.
-
-* An AttributesIntegrityViolationException has been added and is thrown when
- an InvalidAttributesException is encountered.
-
-* More unit tests have been added.
-
-Changes in version 1.0-RC1 (LdapTemplate) (27.1.2006)
---------------------------------------
-* First public release candidate.
+Spring LDAP CHANGELOG
+=====================
+http://www.springframework.org/ldap
+
+http://www.ietf.org/rfc/rfc1960.txt
+http://www.ietf.org/rfc/rfc2251.txt
+http://www.ietf.org/rfc/rfc2252.txt
+http://www.ietf.org/rfc/rfc2253.txt
+http://www.ietf.org/rfc/rfc2254.txt
+http://www.ietf.org/rfc/rfc2255.txt
+http://www.ietf.org/rfc/rfc2256.txt
+http://www.ietf.org/rfc/rfc2696.txt
+
+Changes in version 1.3.1 (Spring 2010)
+-------------------------------------------
+* Added an object-directory mapping framework (ODM). Contributed by Paul
+ Harvey.
+
+* Added an LDIF parsing framework. Contributed by Keith Barlow.
+
+* Added an extension to ContextMapperCallbackHandler that can provide the
+ associated mapper with an indication that the response is different for
+ each search result. (LDAP-185)
+
+* Added utility methods for converting a Windows security identifier (SID)
+ between a binary format and a slightly more readable string format.
+ http://msdn.microsoft.com/en-us/library/aa379571%28VS.85%29.aspx
+ (LDAP-187)
+
+* Added authentication methods that provide a possible authentication
+ exception through an AuthenticationErrorCallback. (LDAP-192)
+
+* DefaultDirObjectFactory calls a Java5 version of the IllegalArgumentException
+ constructor. (LDAP 196).
+
+* Upgraded Spring to 2.5.6.SEC01. (LDAP-194)
+
+Changes in version 1.3.0 (Jan 2009)
+-------------------------------------------
+* Added methods for simple LDAP 'bind' authentication in LdapOperations and
+ SimpleLdapOperations. The methods will perform a search given a supplied
+ filter, call ContextSource#getContext(dn, password), and optionally callback
+ to a supplied instance to perform an LDAP operation on the context.
+
+* Re-used the same fix for LDAP-109 and LDAP-50 that was used in
+ DefaultDirObjectFactory to secure the DirContextAdapter constructors from
+ invalid CompositeNames.
+
+* Made sure DirContextOperations#addAttributeValue(String, Object) does not add
+ any duplicate values per default; added alternate method:
+ DirContextOperations#addAttributeValue(String, Object, boolean) to enable
+ behavior other than the default (i.e. allowing duplicates).
+
+* Made sure that DirContextAdapter#setDn() throws exception if in update mode
+ (The value is not set anyway, and this was previously silently ignored).
+
+* Improved more search methods that take handlers so that they will work
+ with handlers that use ContextMappers, e.g. ContextMapperCallbackHandler.
+ (LDAP-162)
+
+* Made sure article sample tests are possible to run without running web
+ application (i.e. tests automatically start internal LDAP server). (LDAP-143)
+
+* SortControlDirContextProcessor no longer has hard dependencies to controls in
+ LDAP Booster Pack. (LDAP-159)
+
+* Common code in DirContextProcessor implementations has been pulled up to a
+ base class called AbstractFallbackRequestAndResponseControlDirContextProcessor.
+ (LDAP-161)
+
+* PagedResultsRequestControl has been deprecated in favor of
+ PagedResultsDirContextProcessor, which takes advantage of the new
+ AbstractFallbackRequestAndResponseControlDirContextProcessor. (LDAP-160)
+
+* Added spring-tx as required dependency (the DataAccessExceptions require
+ this).
+
+* Added demo projects to simplify refactoring demonstrations. (LDAP-154)
+
+* Added LdapEntryIdentification, a simple bean containing the DNs of an LDAP
+ entry, relative to the base context as well as absolute. Also added
+ special ContextMapper implementation producing these entries;
+ LdapEntryIdentificationContextMapper. (LDAP-149)
+
+* Added LdapTemplate#searchForObject(base, filter, mapper) and
+ SimpleLdapTemplate#searchForObject(base, filter, mapper); methods
+ to search for a single object, analogous to JdbcTemplate#queryForObject().
+ (LDAP-150)
+
+* DistinguishedName (LdapRdnComponent really) now correctly calculates the
+ hashCode for names where case differs, and now correctly adheres to the
+ equals/hashCode contract. (LDAP-151)
+
+* Various improvements to immutability of DistinguishedNames throughout the
+ framework. DistinguishedName#immutableDistinguishedName now produces a truly
+ immutable copy of the original. Also made sure that it is not possible to
+ accidentally alter the internal state of e.g. DirContextAdapter by modifying
+ its DistinguishedName - copies are now returned in DirContextAdapter#getDn()
+ and DirContextAdapter#getBase(). (LDAP-146)
+
+* Added LdapTemplate#rebind(DirContextOperations). (LDAP-144)
+
+* Added PresentFilter and NotPresentFilter to simplify searching for presence
+ or absence of an attribute. (LDAP-152)
+
+* Added DirContextAdapter constructor that takes its DN as a String. (LDAP-145)
+
+Changes in version 1.3.0.RC1 (Oct 2008)
+-------------------------------------------
+* TLS connections are now supported using the DefaultTlsDirContextAuthenticationStrategy
+ and ExternalTlsDirContextAuthenticationStrategy. (LDAP-8)
+
+* NameNotFound is no longer silently ignored in searches. It is possible
+ to use the old behavior by setting the ignoreNameNotFoundException property
+ to true in LdapTemplate. (LDAP-134)
+
+* Referrals can now be handled by setting the property 'Context.REFERRAL'
+ to 'follow' in the base context supplied to AbstractContextSource, provided
+ that name servers are set up properly. Any DirContextAdapter instances
+ resulting from referrals will provide the URL of the referred server in
+ getReferralUrl(). (LDAP-136, LDAP-9)
+
+* The hard dependency on LDAP Booster Pack has now been completely removed,
+ preventing NoClassDefFoundErrors when using Paged Results without that
+ library on the classpath. (LDAP-110, LDAP-118)
+
+* The dreaded problem with '\' in Distinguished Names is now resolved.
+ (LDAP-50, LDAP-109)
+
+* Added bind method that takes a DirContextOperations instance as parameter,
+ performing the bind using the DN and Attributes from the DirContextOperations
+ instance. (LDAP-140)
+
+* DistinguishedName now returns compactly formatted String representations
+ from toString, e.g.:
+ cn=John Doe,ou=Company,c=Sweden
+ rather than
+ cn=John Doe, ou=Company, c=Sweden
+ To keep using the old formatting (for backward compatibility) set the
+ system property org.springframework.ldap.core.spacedDnFormat to true.
+ (LDAP-138, LDAP-112, LDAP-91)
+
+* Changed default of 'pooling' flag in AbstractContextSource.
+ This now defaults to false; consider the Spring LDAP PoolingContextSource
+ as the preferred alternative to using the built-in Java Connection Pooling.
+
+* Added configuration property to AbstractContextSource to specify referral
+ behavior. Setting this property to 'follow' will enable referrals to be
+ automatically followed, provided that the name server environment is properly
+ set up.
+
+* Now using Maven for building internally. (LDAP-80, LDAP-82, LDAP-95)
+
+* Added HardcodedFilter class and corresponding PropertyEditor FilterEditor,
+ to allow for easily working with pre-encoded search filters
+ e.g. in configuration files. (LDAP-28)
+
+* Added ContextSourceAndHibernateTransactionManager to enable integration
+ of client-side LDAP Transactions in a Hibernate environment. (LDAP-115)
+
+* Added append method to BinaryLogicalFilter allowing client code to use
+ and/or filters from the same code. (LDAP-116)
+
+* Introduced DirContextAuthenticationStrategy to AbstractContextSource
+ to enable more flexible context authentication strategies, e.g.
+ TLS and Proxy Auth. (LDAP-124)
+
+* Corrected reference doc claiming DataAccessException hierarchy. (LDAP-106)
+
+* Probably the most requested feature of all - a plain method for simple
+ authentication is now provided in the ContextSource interface.
+ (LDAP-39, LDAP-103)
+
+* The order of multi-valued attributes is now properly preserved by
+ DirContextAdapter#getModificationItems(). (LDAP-96)
+
+* ContextSourceTransactionManager now properly throws a
+ CannotCreateTransactionException if anything goes wrong in doBegin(). (LDAP-122)
+
+* It is now possible to set the criticality on PagedResultsControl.
+ (LDAP-126)
+
+* DirContextAdapter now has a getObjectAttributes method, as stated in
+ reference docs. (LDAP-137)
+
+* DirContextAdapter#getStringAttributes, getObjectAttributes, and
+ getAttributeSortedStringSet now all return null if the requested Attribute
+ is not present, and an empty result (array or set) if present but empty.
+ (LDAP-130)
+
+* SimpleLdapOperations/SimpleLdapTemplate now has mirrored methods that take
+ Name parameters. (LDAP-139)
+
+* Fixed documentation glitch regarding ContextSourceAndDataSourceTransactionManager.
+ (LDAP-99)
+
+* Added the possibility to configure the search scope on DefaultDirContextValidator.
+ Changed the default to OBJECT_SCOPE. (LDAP-121)
+
+* Fixed DistinguishedName parsing error; \r is now allowed in Distinguished Names,
+ complying with LDAP v3 DN RFC. (LDAP-97)
+
+* Moved SingleContextSource from an obscure inner class to a top-level
+ class. This class doesn't close the DirContext, but reuses the same.
+ Useful for scenarios like Paged Results. (LDAP-114)
+
+* Removed deprecated method setUserName() in AbstractContextSource.
+
+* Added a method DistinguishedName.toCompactString that returns a more
+ compact String representation without blanks. (LDAP-91)
+
+* Improved search methods that take handlers so that they will work
+ with handlers that use ContextMappers, eg ContextMapperCallbackHandler.
+ (LDAP-107)
+
+* Fixed a problem where the narrowest possible exception subclass was
+ not always found in the exception translation. (LDAP-100)
+
+* Made changes required for paged results to work when using Spring LDAP
+ connection pool with a single connection. (LDAP-114)
+
+* Removed AcegiAuthenticationSource - use SpringSecurityAuthenticationSource
+ (included with Spring Security) instead.
+
+* Upgraded commons-lang to 2.3.
+
+* Upgraded Spring to 2.5.6. (LDAP-125)
+
+Changes in version 1.2.1 (Dec 2007)
+-------------------------------------------
+* Added pooling library which features flexible connection validation
+ and better configuration than the built-in pooling. (LDAP-85)
+
+* Fixed a problem in AbstractContextSource which led to an unnecessary
+ reference to the LDAP Booster Pack (ldapbp). (LDAP-88, LDAP-89)
+
+* Added missing package description and updated copyright. (LDAP-92)
+
+* Added build instructions. (LDAP-27)
+
+* Fixed bug in SimpleLdapTemplate where the wrong target method was being
+ called. (LDAP-93)
+
+* Made createContext in AbstractContextSource protected rather than
+ package private. (LDAP-94)
+
+Changes in version 1.2 (Oct 2007)
+-------------------------------------------
+A number of API-breaking changes have been made in the 1.2 release compared to version 1.1.2.
+Consequently this is NOT a drop-in replacement for Spring LDAP 1.1.2,
+though upgrading should not present all that much work. Please see
+the supplied upgrade guide for details.
+
+* Added getContextSource on LdapTemplate.
+
+* The following getters on AbstractContextSource have been added:
+ getContextFactory
+ getDirObjectFactory
+ getAuthenticationSource
+ getUrls (was protected)
+ isPooled
+ isAnonymousReadOnly
+
+* Upgraded to Spring 2.0.6 internally. Spring 1.2.x is still supported.
+
+* Reviewed all javadoc.
+
+* Revised reference manual.
+
+* AbstractConnection source now actively removes pooling flag from context environment
+ if pooling is set to 'false'. (LDAP-83)
+
+* AcegiAuthenticationSource now supports anonymous authentication. (LDAP-67)
+
+* Added BaseLdapPathSource, BaseLdapPathAware and BaseLdapNameBeanPostProcessor to be used
+ if the ContextSource base path is needed by beans. There is now also a DistinguishedNameEditor
+ available for directly injecting DistinguishedName instances to beans. (LDAP-86)
+
+* Added immutableDistinguishedName() method in DistinguishedName to get an immutable
+ copy of the instance. (LDAP-87)
+
+* Added easier access methods for RDN attributes and values. (LDAP-71)
+
+* Added lookupContext() and alternate modifyAttributes() in LdapOperations/LdapTemplate
+ to simplify updates. (LDAP-78)
+
+* Modified append() method in DistinguishedName. This method now returns the instance, to
+ enable more fluent building of DistinguishedNames. (LDAP-74)
+
+* Added SimpleLdapTemplate providing Java 5 generics support. (LDAP-72)
+
+* Added AbstractContextMapper implementation. (LDAP-76)
+
+Changes in version 1.2-RC1 (5.12.2007)
+-------------------------------------------
+A number of API-breaking changes have been made in this release,
+mainly package restructuring stuff (LDAP-33). Consequently this is
+NOT a drop-in replacement for Spring LDAP 1.1.2, though upgrading
+should not present all that much work. Please see the supplied
+upgrade guide for details.
+
+* Restructured packages (LDAP-33):
+ - Moved the core classes into the package ldap.core.
+ - Moved subpackages of ldap.support to top level.
+ - Moved most classes in ldap.support to ldap.core or ldap.core.support.
+ - Moved classes in ldap.utils to ldap.support and removed ldap.utils.
+
+* Changed the exception hierarchy to be an unchecked mirror of the JNDI
+ NamingException hierarchy (LDAP-4).
+
+* Deprecated the userName property in AbstractContextSource and changed
+ it to the more correct userDn (LDAP-18).
+
+* Fixed bug causing PagedResultsRequestControl processing to fail against AD
+ in the case of a PartialResultsException (LDAP-32).
+
+* Fixed bug causing NullPointerException in some environments when performing
+ PagedResultsRequestControl search (LDAP-37).
+
+* Implemented client-side transaction support for Spring LDAP. See reference
+ documentation for further information (LDAP-29).
+
+* DirContextAdapter.setAttribute() now properly updates updatedAttrs in update mode
+ (resulting in ModificationItems if applicable) (LDAP-15).
+
+* Exceptions thrown by Spring LDAP are now always Serializable, regardless of whether
+ the wrapped NamingException is (which is not always the case) (LDAP-14).
+
+* LdapRdnComponent now implements Serializable (LDAP-45).
+
+* Rewrote LdapEncoder.nameDecode() to solve problem with national characters and
+ remove regular expression used in parsing, drastically improving Distinguished Name
+ parsing performance as a bonus (LDAP-30).
+
+* The DefaultDirObjectFactory.JNDI_ENV_BASE_PATH_KEY has been deprecated. If the base
+ property needs to be accessed from a subclass to AbstractContextSource, use the new
+ protected method getBase (LDAP-55).
+
+* LdapContextSource.getAnonymousEnv no longer sets a broken ResponseControlFactory in
+ the environment (LDAP-64).
+
+* Upgraded ApacheDS to 1.0.0 (LDAP-32).
+
+* Upgraded to Acegi Security 1.0.3 (LDAP-61).
+
+* Upgraded to ApacheDS 1.0.0 (LDAP-32).
+
+* Upgraded to Spring 2.0.4 internally. Spring 1.2.x is still supported (LDAP-35, LDAP-51).
+
+* Upgraded to Spring WebFlow 1.0.2 in the Person sample (LDAP-60).
+
+* Fixed a number of documentation errors and typos (LDAP-41, LDAP-40, LDAP-47, LDAP-48).
+
+* Extracted useful inner classes from LdapTemplate to top-level classes (LDAP-42).
+
+* Implemented addAttributeValue and removeAttributeValue in DirContextAdapter (LDAP-5).
+
+* Modified DirContextOperations interface so that getNameInNamespace doesn't throw NamingException.
+
+* Fixed NullPointerException when getting PagedResultsRequestControl response (LDAP-66).
+
+* Rewrote logic i DirContextAdapter.getModificationItems(). The JNDI provider's Attribute
+ comparison logic is now used internally. Also, REMOVE_ATTRIBUTE items are placed
+ first in the ModificationItem array, in order to prevent ATTRIBUTE_ALREADY_EXIST errors
+ (LDAP-13, LDAP-46).
+
+* In internal integration tests, each test now runs on a clean LDAP database (LDAP-43).
+
+* DirContextProcessor#postProcess() is now called in searches regardless of whether an
+ exception is thrown (LDAP-26).
+
+* Moved SortControlDirContextProcessor to spring-ldap from sandbox (LDAP-68).
+
+
+Changes in version 1.1.2 (1.12.2006)
+-------------------------------------------
+* Fixed problem with DirContextAdapter.getNameInNameSpace. Now it really
+ returns the full DN.
+
+* There is now a wrapper class called PagedResult, which can be used to
+ wrap the resulting list and the PagedResultsCookie after using
+ PagedResultsRequestControl.
+
+* The actual cookie in PagedResultsCookie is now immutable.
+
+* The person sample is now a Spring WebFlow application, where the user
+ can manage persons and standard LDAP access groups.
+
+* Improved javadoc for DefaultDirObjectFactory and DistinguishedName.
+
+* Upgraded Spring to 2.0.1 internally. Spring 1.2.8 is still supported.
+
+Changes in version 1.1.1 (18.11.2006)
+-------------------------------------------
+* Added capability to use server-side controls in search by leveraging
+ DirContextProcessor.
+
+* Added generic DirContextProcessor that is run before and after a search.
+
+* Added paged search result functionality in PagedResultsRequestControl,
+ which is an implementation of DirContextProcessor.
+
+* Fixed problem with DirContextAdapter, where the wrong change was applied
+ when a change was followed by a reset to the original values.
+
+* DirContextAdapter.getNameInNamespace() now returns the full DN, as per the
+ documentation for javax.naming.Context.
+
+* The parsing of DistinguishedName has been changed from using regexp to
+ a JavaCC parser, which means improved performance (5-6 times faster) and
+ better error messages.
+
+* DistinguishedName now supports multi-valued RDNs separated by a '+' sign,
+ like "cn=Rod+sn=Johnson", for example. All according to spec 2253.
+
+* LdapRdn is now Serializable.
+
+* Added lookup methods that take an array of return attribute names.
+
+* Made DistinguishedName.EMPTY_NAME an immutable DistinguishedName instance.
+
+* Separated integration tests that require OpenLDAP from the other integration
+ tests that run the in-JVM Apache DS server.
+
+* Changed the spring-ldap-person sample application to authenticate and
+ authorize against groups rather than role attributes.
+
+* Upgraded Spring to 2.0 internally. Spring 1.2.8 is still supported.
+
+Changes in version 1.1 (28.8.2006)
+-------------------------------------------
+* Changed base package from net.sf.ldaptemplate to org.springframework.ldap
+
+* Changed package ...support.acegi to ...support.authentication
+
+* Replaced SearchResultCallbackHandler with NameClassCallbackHandler
+ to enable its use in all search operations (search, list, listBindings).
+ Changed all references and implementing classes accordingly,
+ including name changes where applicable:
+ ** CollectingSearchResultCallbackHandler was replaced by CollectingNameClassPairCallbackHandler.
+ ** CountSearchResultCallbackHandler was replaced by CountNameClassPairCallbackHandler
+
+* Added NameClassPairMapper for use with list operations
+
+* Added DefaultNameClassPairCallbackHandler.
+
+* Added DefaultValuesAuthenticationSourceDecorator to enable default authentication
+ information when AuthenticationSource returns empty values.
+
+* ContextSource implementations now creates authenticated Contexts by default,
+ since the previous behaviour has proven to be confusing.
+ The authenticatedReadOnly flag was replaced by an anonymousReadOnly flag.
+
+* AbstractContextSource now defaults the dirObjectFactory property to DefaultDirObjectFactory.
+
+* Added search methods to LdapTemplate for specifying return attributes.
+
+* Added list and listBindings methods to LdapTemplate.
+
+* Fixed bug in AbstractContextSource regarding java version number and base path.
+
+* Improved javadocs.
+
+* Upgraded Spring to 2.0-rc3.
+
+* Added full reference documentation.
+
+Changes in version 1.0.2 (LdapTemplate) (26.6.2006)
+------------------------------------
+* Added methods in LdapTemplate to unbind recursively.
+
+* Added rename() method to LdapTemplate.
+
+* Fixed bug in getPrefix() of DistinguishedName.
+
+* Fixed bug in getModificationItems() of DirContextAdapter.
+ The method now correctly handles changes of individual vales in
+ multi-value attributes.
+
+* Introduced AbstractContextSource, moved the code from LdapContextSource there
+ and made LdapContextSource and DirContextSource inherit from this.
+
+* Upgraded to Acegi 1.0.0. Removed classes no longer needed:
+ LdapTemplateLdapAuthenticationProvider
+ LdapTemplateUserDetails
+ *NOTE*:
+ This means that configuration needs to be changed if using Acegi,
+ since the API and package structure has changed in Acegi between
+ versions 1.0.0-RC2 and 1.0.0 final.
+
+
+Changes in version 1.0.1 (LdapTemplate) (5.5.2006)
+-----------------------------------
+* Now checking whether the first argument to getObjectInstance in
+ DefaultDirObjectFactory is a Context, and if so, closing it properly.
+
+* Fixed reference to non-existent ContextSourceImpl in ldaptemplate-person.
+
+* Upgraded Spring to 2.0-m4.
+
+* Upgraded DDSteps to 1.1-rc1 and EasyMock to 1.2.
+
+Changes in version 1.0 (LdapTemplate) (24.4.2006)
+----------------------------------
+* Introduced the AuthenticationSource interface to enable other strategies for
+ retrieving principal and credentials than a hard-coded username/password.
+
+* Added the AcegiAuthenticationSource implementation for retrieving a previously
+ authenticated principal and credentials using Acegi.
+
+* Added a 'cacheEnvironmentProperties' property that enables the user to choose
+ whether to cache the environment HashMap or to re-create it each time a new
+ Context is created.
+
+* Added an ignorePartialResultException to LdapTemplate which causes all
+ PartialResultExceptions to be ignored during searches, for use when working
+ against Active Directory, which cannot handle referrals correctly.
+
+* Added search methods in LdapOperations (and LdapTemplate) that take a
+ parameter for SearchControls.
+
+* The methods getNamesOfModifiedAttributes, update, and getAttributeSortedStringSet
+ in DirContextOperations (and DirContextAdapter) no longer throw NamingException.
+ Instead, they throw unchecked DataAccessExceptions.
+
+* The method getModificationItems in AttributeModificationsAware no longer throws
+ NamingException. Instead, it throws unchecked DataAccessExceptions.
+
+* Removed the (unused) 'task' parameter to NamingExceptionTranslator.translate.
+
+* Removed the deprecated ContextSourceImpl class.
+
+* Integration tests now run using an in-memory version of Apache Directory Server,
+ rather than requiring a working installation of a directory server.
+
+* Integration tests now run together with pure unit tests under the 'tests' Ant target.
+
+* The ldaptemplate-person sample web application now uses an in-memory version of Apache
+ Directory Server, rather than requiring a working installation of a directory server.
+
+* Upgraded Spring to 2.0-m3.
+
+* The build now uses Ivy 1.3.1.
+
+Changes in version 1.0-RC2 (LdapTemplate) (22.2.2006)
+--------------------------------------
+* LdapV2 is now supported.
+ ContextSourceImpl has been deprecated. In stead the new
+ LdapContextSource should be used for LdapV3 and a DirContextSource
+ has been added for LdapV2 compatibility.
+
+* Ability has been added in LdapContextSource and DirContextSource
+ to specify that an authenticated context should be used for
+ read-only operations as well. Use property 'authenticatedReadOnly'
+ in LdapContextSource/DirContextSource.
+
+* The Filter classes have been cleaned up.
+
+* DirContextAdapter has been cleaned up. Most important to note is that
+ in this operation the 'setStringAttribute/setStringAttributes' methods
+ have been removed and replaced by 'setAttributeValue/setAttributeValues'.
+
+* Base DNs are now correctly URL encoded when building the connection String.
+ This means that spaces and other 'unsafe' characters in base DNs should no
+ longer be manually URL encoded.
+
+* An AttributesIntegrityViolationException has been added and is thrown when
+ an InvalidAttributesException is encountered.
+
+* More unit tests have been added.
+
+Changes in version 1.0-RC1 (LdapTemplate) (27.1.2006)
+--------------------------------------
+* First public release candidate.
diff --git a/parent/pom.xml b/parent/pom.xml
index f0c5f2f7..90df4452 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -7,6 +7,9 @@
pom
1.3.1.CI-SNAPSHOT
Spring LDAP - Parent
+
+ tiger
+
http://static.springframework.org/spring-ldap/site/downloads/releases.html
diff --git a/pom.xml b/pom.xml
index 808a0788..60fd1334 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,6 +64,12 @@
Eric Dalquist
+
+ Marius Scurtescu
+
+
+ Tim Terry
+
Keith Barlow