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;
}
}