Hi Emmanuel, please review this change.
There was a failing test in Studio, it was not possible to delete a complex DN in member attribute because the server respondes withe "non existing value". The problem was in the Value.equals() method, where an already normalized value was normalized a 2nd time. For complex DNs this 2nd normalizing fails. I added a test ModifyMemberIT to demonstrate the problem. Kind Regards, Stefan On 05/20/2018 10:51 PM, seelm...@apache.org wrote: > This is an automated email from the ASF dual-hosted git repository. > > seelmann pushed a commit to branch master > in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git > > > The following commit(s) were added to refs/heads/master by this push: > new 1b54c95 Fix value equals. Don't normalize already normalized value > which fails e.g. for DN > 1b54c95 is described below > > commit 1b54c95aa4bf59099205e8fac1dfc2fce543209a > Author: Stefan Seelmann <m...@stefan-seelmann.de> > AuthorDate: Sun May 20 22:51:41 2018 +0200 > > Fix value equals. Don't normalize already normalized value which fails > e.g. for DN > --- > .../directory/api/ldap/model/entry/Value.java | 19 +---- > .../api/ldap/model/entry/DnValueTest.java | 87 > ++++++++++++++++++++++ > 2 files changed, 89 insertions(+), 17 deletions(-) > > diff --git > a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/Value.java > > b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/Value.java > index 0e731a2..ecf46cb 100644 > --- > a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/Value.java > +++ > b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/entry/Value.java > @@ -1382,30 +1382,15 @@ public class Value implements Cloneable, > Externalizable, Comparable<Value> > return stringComparator.compare( normValue, > other.normValue ) == 0; > } > > - Normalizer normalizer = > other.attributeType.getEquality().getNormalizer(); > - > - if ( normalizer == null ) > - { > - if ( comparator == null ) > - { > - return normValue.equals( other.normValue ); > - } > - else > - { > - return comparator.compare( normValue, > other.normValue ) == 0; > - } > - } > > - String thisNormValue = normalizer.normalize( normValue ); > - > // Compare normalized values > if ( comparator == null ) > { > - return thisNormValue.equals( other.normValue ); > + return normValue.equals( other.normValue ); > } > else > { > - return comparator.compare( thisNormValue, > other.normValue ) == 0; > + return comparator.compare( normValue, > other.normValue ) == 0; > } > } > catch ( LdapException ne ) > diff --git > a/ldap/model/src/test/java/org/apache/directory/api/ldap/model/entry/DnValueTest.java > > b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/entry/DnValueTest.java > new file mode 100644 > index 0000000..031aaea > --- /dev/null > +++ > b/ldap/model/src/test/java/org/apache/directory/api/ldap/model/entry/DnValueTest.java > @@ -0,0 +1,87 @@ > +/* > + * Licensed to the Apache Software Foundation (ASF) under one > + * or more contributor license agreements. See the NOTICE file > + * distributed with this work for additional information > + * regarding copyright ownership. The ASF licenses this file > + * to you 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.apache.directory.api.ldap.model.entry; > + > + > +import static org.junit.Assert.assertEquals; > + > +import org.apache.directory.api.ldap.model.exception.LdapException; > +import org.apache.directory.api.ldap.model.schema.comparators.DnComparator; > +import org.apache.directory.api.ldap.model.schema.normalizers.DnNormalizer; > +import > org.apache.directory.api.ldap.model.schema.syntaxCheckers.DnSyntaxChecker; > +import org.junit.BeforeClass; > +import org.junit.Test; > +import org.junit.runner.RunWith; > + > +import com.mycila.junit.concurrent.Concurrency; > +import com.mycila.junit.concurrent.ConcurrentJunitRunner; > + > + > +/** > + * Test the Value class with Dn values > + * > + * @author <a href="mailto:dev@directory.apache.org">Apache Directory > Project</a> > + */ > +@RunWith(ConcurrentJunitRunner.class) > +@Concurrency() > +public class DnValueTest > +{ > + private static EntryUtils.S s; > + private static EntryUtils.AT at; > + private static EntryUtils.MR mr; > + > + > + /** > + * Initialize an AttributeType and the associated MatchingRule > + * and Syntax > + */ > + @BeforeClass > + public static void initAT() > + { > + s = new EntryUtils.S( "1.1.1.1", true ); > + s.setSyntaxChecker( DnSyntaxChecker.INSTANCE ); > + mr = new EntryUtils.MR( "1.1.2.1" ); > + mr.setSyntax( s ); > + mr.setLdapComparator( new DnComparator( "1.1.2.1" ) ); > + mr.setNormalizer( new DnNormalizer() ); > + at = new EntryUtils.AT( "1.1.3.1" ); > + at.setEquality( mr ); > + at.setOrdering( mr ); > + at.setSubstring( mr ); > + at.setSyntax( s ); > + } > + > + > + @Test > + public void testEqualsSimpleDn() throws LdapException > + { > + Value sv1 = new Value( at, "cn=user2,ou=system" ); > + Value sv2 = new Value( at, " cn = user2 , ou = system " ); > + assertEquals( sv1, sv2 ); > + } > + > + > + @Test > + public void testEqualsComplexDn() throws LdapException > + { > + Value sv1 = new Value( at, "cn=\\#\\\\\\+\\, > \\\"\u00F6\u00E9\\\",ou=system" ); > + Value sv2 = new Value( at, " cn = \\#\\\\\\+\\, \\\"\u00F6\u00E9\\\" > , ou = system " ); > + assertEquals( sv1, sv2 ); > + } > +} >