From d782e4facdae0897de52f560e4ebbf30bd800318 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Tue, 15 Jun 2010 14:39:37 +0000
Subject: [PATCH] DN normalization enhancements:
---
sdk/src/org/opends/sdk/DN.java | 224 ++++++++++++++++++++++++++-----------------------------
1 files changed, 105 insertions(+), 119 deletions(-)
diff --git a/sdk/src/org/opends/sdk/DN.java b/sdk/src/org/opends/sdk/DN.java
index 7d4dd30..9631c20 100644
--- a/sdk/src/org/opends/sdk/DN.java
+++ b/sdk/src/org/opends/sdk/DN.java
@@ -154,6 +154,88 @@
+ /**
+ * Compares the provided DN values to determine their relative order in a
+ * sorted list.
+ *
+ * @param dn1
+ * The first DN to be compared. It must not be {@code null}.
+ * @param dn2
+ * The second DN to be compared. It must not be {@code null}.
+ * @return A negative integer if the first DN should come before the second DN
+ * in a sorted list, a positive integer if the first DN should come
+ * after the second DN in a sorted list, or zero if the two DN values
+ * can be considered equal.
+ */
+ private static int compareTo(final DN dn1, final DN dn2)
+ {
+ // Quickly check if we are comparing against root dse.
+ if (dn1.isRootDN())
+ {
+ if (dn2.isRootDN())
+ {
+ // both are equal.
+ return 0;
+ }
+ else
+ {
+ // dn1 comes before dn2.
+ return -1;
+ }
+ }
+
+ if (dn2.isRootDN())
+ {
+ // dn1 comes after dn2.
+ return 1;
+ }
+
+ int dn1Size = dn1.size - 1;
+ int dn2Size = dn2.size - 1;
+ while (dn1Size >= 0 && dn2Size >= 0)
+ {
+ final DN dn1Parent = dn1.parent(dn1Size--);
+ final DN dn2Parent = dn2.parent(dn2Size--);
+ if (dn1Parent.isRootDN())
+ {
+ if (dn2Parent.isRootDN())
+ {
+ break;
+ }
+ return -1;
+ }
+
+ if (dn2Parent.isRootDN())
+ {
+ return 1;
+ }
+
+ final int result = dn1Parent.rdn.compareTo(dn2Parent.rdn);
+ if (result > 0)
+ {
+ return 1;
+ }
+ else if (result < 0)
+ {
+ return -1;
+ }
+ }
+
+ // What do we have here?
+ if (dn1Size > dn2Size)
+ {
+ return 1;
+ }
+ else if (dn1Size < dn2Size)
+ {
+ return -1;
+ }
+
+ return 0;
+ }
+
+
+
// Decodes a DN using the provided reader and schema.
private static DN decode(final String dnString, final SubstringReader reader,
final Schema schema, final Map<String, DN> cache)
@@ -237,8 +319,6 @@
// preserve the original whitespace.
private String stringValue;
- private String normalizedStringValue = null;
-
// Private constructor.
@@ -343,87 +423,6 @@
/**
- * Compares the provided DN values to determine their relative order in a
- * sorted list.
- *
- * @param dn1
- * The first DN to be compared. It must not be {@code null}.
- * @param dn2
- * The second DN to be compared. It must not be {@code null}.
- * @return A negative integer if the first DN should come before the second DN
- * in a sorted list, a positive integer if the first DN should come
- * after the second DN in a sorted list, or zero if the two DN values
- * can be considered equal.
- */
- public int compareTo(final DN dn1, final DN dn2)
- {
- // Quicly check if we are comparing against root dse.
- if (dn1.isRootDN())
- {
- if (dn2.isRootDN())
- {
- // both are equal.
- return 0;
- }
- else
- {
- // dn1 comes before dn2.
- return -1;
- }
- }
-
- if (dn2.isRootDN())
- {
- // dn1 comes after dn2.
- return 1;
- }
-
- int dn1Size = dn1.size - 1;
- int dn2Size = dn2.size - 1;
- while (dn1Size >= 0 && dn2Size >= 0)
- {
- final DN dn1Parent = dn1.parent(dn1Size--);
- final DN dn2Parent = dn2.parent(dn2Size--);
- if (dn1Parent.isRootDN())
- {
- if (dn2Parent.isRootDN())
- {
- break;
- }
- return -1;
- }
-
- if (dn2Parent.isRootDN())
- {
- return 1;
- }
-
- final int result = dn1Parent.rdn.compareTo(dn2Parent.rdn);
- if (result > 0)
- {
- return 1;
- }
- else if (result < 0)
- {
- return -1;
- }
- }
- // What do we have here?
- if (dn1Size > dn2Size)
- {
- return 1;
- }
- else if (dn1Size < dn2Size)
- {
- return -1;
- }
-
- return 0;
- }
-
-
-
- /**
* {@inheritDoc}
*/
@Override
@@ -435,14 +434,22 @@
}
else if (obj instanceof DN)
{
- final String s1 = toNormalizedString();
- final String s2 = ((DN) obj).toNormalizedString();
- return s1.equals(s2);
+ DN other = (DN)obj;
+ if(size == other.size())
+ {
+ if(size == 0)
+ {
+ return true;
+ }
+
+ if(rdn.equals(other.rdn))
+ {
+ return parent.equals(other.parent);
+ }
+ }
}
- else
- {
- return false;
- }
+
+ return false;
}
@@ -453,8 +460,14 @@
@Override
public int hashCode()
{
- final String s = toNormalizedString();
- return s.hashCode();
+ if (size == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return 31 * parent.hashCode() + rdn.hashCode();
+ }
}
@@ -773,33 +786,6 @@
/**
- * Returns the normalized string representation of this DN.
- *
- * @return The normalized string representation of this DN.
- */
- public String toNormalizedString()
- {
- if (rdn == null)
- {
- return "".intern();
- }
- if (normalizedStringValue == null)
- {
- final StringBuilder builder = new StringBuilder();
- rdn.toNormalizedString(builder);
- if (!parent.isRootDN())
- {
- builder.append(',');
- builder.append(parent.toNormalizedString());
- }
- normalizedStringValue = builder.toString();
- }
- return normalizedStringValue;
- }
-
-
-
- /**
* Returns the RFC 4514 string representation of this DN.
*
* @return The RFC 4514 string representation of this DN.
--
Gitblit v1.10.0