You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2019/04/30 16:54:12 UTC

[directory-ldap-api] branch 1.0 updated: Fixed the UniqueMemberComparator.compare method (DIRAPI-340)

This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch 1.0
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git


The following commit(s) were added to refs/heads/1.0 by this push:
     new f995af7  Fixed the UniqueMemberComparator.compare method (DIRAPI-340)
f995af7 is described below

commit f995af78cca156071ab30f00a6615bd82911c4a1
Author: emmanuel lecharny <el...@apache.org>
AuthorDate: Tue Apr 30 18:54:01 2019 +0200

    Fixed the UniqueMemberComparator.compare method (DIRAPI-340)
---
 .../java/org/apache/directory/api/i18n/I18n.java   |   2 +
 .../apache/directory/api/i18n/errors.properties    |   1 +
 .../schema/comparators/ParsedDnComparator.java     | 138 +++++++++++++++++++++
 .../schema/comparators/UniqueMemberComparator.java |  18 ++-
 4 files changed, 149 insertions(+), 10 deletions(-)

diff --git a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
index 0275864..ca0cbc6 100644
--- a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
+++ b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
@@ -778,6 +778,8 @@ public enum I18n
     ERR_12085("ERR_12085"),
     ERR_12086("ERR_12086"),
     ERR_12087("ERR_12087"),
+    ERR_13720_CANNOT_HANDLE_DN_COMPARISONS( "ERR_13720_CANNOT_HANDLE_DN_COMPARISONS" ),
+
 
     // The messages
     MSG_04489_SYNTAX_VALID( "MSG_04489_SYNTAX_VALID" );
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index 0d6e620..7848792 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -762,3 +762,4 @@ ERR_12084=The length of each line must be at least 2 chars long
 ERR_12085=The Attribute ID #{0} must be a String
 ERR_12086=The Attribute value #{0} must be a String or a byte[]
 ERR_12087=A value is missing at the end
+ERR_13720_CANNOT_HANDLE_DN_COMPARISONS=I do not know how to handle dn comparisons with objects of class: {0}
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/ParsedDnComparator.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/ParsedDnComparator.java
new file mode 100644
index 0000000..0f6fd77
--- /dev/null
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/ParsedDnComparator.java
@@ -0,0 +1,138 @@
+/*
+ *  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.schema.comparators;
+
+
+import org.apache.directory.api.i18n.I18n;
+import org.apache.directory.api.ldap.model.exception.LdapException;
+import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
+import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.api.ldap.model.schema.LdapComparator;
+import org.apache.directory.api.ldap.model.schema.SchemaManager;
+
+/**
+ * Compare two DNs
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ParsedDnComparator extends LdapComparator<Object>
+{
+    /** The serial version UID */
+    private static final long serialVersionUID = 2L;
+
+    /** A reference to the schema manager */
+    private transient SchemaManager schemaManager;
+
+    /**
+     * The ParsedDnComparator constructor.
+     * 
+     * @param oid The Comparator's OID
+     */
+    public ParsedDnComparator( String oid )
+    {
+        super( oid );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int compare( Object obj0, Object obj1 )
+    {
+        Dn dn0 = null;
+        Dn dn1 = null;
+
+        try
+        {
+            dn0 = getDn( obj0 );
+            dn1 = getDn( obj1 );
+        }
+        catch ( LdapException e )
+        {
+            // -- what do we do here ?
+            return -1;
+        }
+
+        int dn0Size = dn0.getRdns().size();
+        int dn1Size = dn1.getRdns().size();
+        
+        // check the equality first, cause
+        // when both DNs are equal checking isAncestorOf() returns true
+        if ( dn0.equals( dn1 ) )
+        {
+            return 0;
+        }
+        else if ( dn0Size > dn1Size )
+        {
+            return -1;
+        }
+        else if ( dn1Size > dn0Size )
+        {
+            return 1;
+        }
+
+        for ( int i = dn0Size - 1; i >= 0; i-- )
+        {
+            int comp = dn0.getRdn( i ).compareTo( dn1.getRdn( i ) );
+            
+            if ( comp != 0 )
+            {
+                return comp;
+            }
+        }
+        
+        return 0;
+    }
+
+
+    private Dn getDn( Object obj ) throws LdapInvalidDnException
+    {
+        Dn dn;
+
+        if ( obj instanceof Dn )
+        {
+            dn = ( Dn ) obj;
+
+            dn = dn.isSchemaAware() ? dn : dn.apply( schemaManager );
+        }
+        else if ( obj instanceof String )
+        {
+            dn = new Dn( schemaManager, ( String ) obj );
+        }
+        else
+        {
+            throw new IllegalStateException( I18n.err( I18n.ERR_13720_CANNOT_HANDLE_DN_COMPARISONS, obj == null ? null : obj.getClass() ) );
+        }
+
+        return dn;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setSchemaManager( SchemaManager schemaManager )
+    {
+        this.schemaManager = schemaManager;
+    }
+}
+
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/UniqueMemberComparator.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/UniqueMemberComparator.java
index c6ad312..df8fdc0 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/UniqueMemberComparator.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/schema/comparators/UniqueMemberComparator.java
@@ -21,6 +21,7 @@ package org.apache.directory.api.ldap.model.schema.comparators;
 
 
 import org.apache.directory.api.i18n.I18n;
+import org.apache.directory.api.ldap.model.constants.SchemaConstants;
 import org.apache.directory.api.ldap.model.exception.LdapException;
 import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
 import org.apache.directory.api.ldap.model.name.Dn;
@@ -43,6 +44,8 @@ public class UniqueMemberComparator extends LdapComparator<String>
     /** A reference to the schema manager */
     private SchemaManager schemaManager;
 
+    private transient ParsedDnComparator dnComparator = new ParsedDnComparator( SchemaConstants.ENTRY_DN_AT_OID );
+
 
     /**
      * The IntegerComparator constructor. Its OID is the IntegerOrderingMatch matching
@@ -72,14 +75,7 @@ public class UniqueMemberComparator extends LdapComparator<String>
                 Dn dn1 = getDn( dnstr1 );
                 Dn dn2 = getDn( dnstr2 );
 
-                if ( dn1.equals( dn2 ) )
-                {
-                    return 0;
-                }
-                else
-                {
-                    return -1;
-                }
+                return dnComparator.compare( dn1, dn2 );
             }
             catch ( LdapInvalidDnException ne )
             {
@@ -148,12 +144,14 @@ public class UniqueMemberComparator extends LdapComparator<String>
                 return 1;
             }
 
-            if ( dn1.equals( dn2 ) )
+            int dnResult = dnComparator.compare( dn1, dn2 );
+
+            if ( dnResult == 0 )
             {
                 return uid1.compareTo( uid2 );
             }
 
-            return -1;
+            return dnResult;
         }
     }