From 0cdc4f67dfc0e2fb8b83d5f0de8188ec3686d04c Mon Sep 17 00:00:00 2001
From: floblanc <floblanc@localhost>
Date: Tue, 10 Nov 2009 13:59:02 +0000
Subject: [PATCH] Fix Issue 4344 CompareOperation API does not support attribute options and Issue CompareOperationBasis does not properly handle get/setAttributeType.

---
 opends/src/server/org/opends/server/core/CompareOperation.java                                     |   20 ++++++
 opends/src/server/org/opends/server/core/CompareOperationBasis.java                                |   59 +++++++++++++++++++
 opends/src/server/org/opends/server/workflowelement/ndb/NDBCompareOperation.java                   |   32 +---------
 opends/src/server/org/opends/server/core/CompareOperationWrapper.java                              |   22 ++++++
 opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java |   39 ++-----------
 5 files changed, 108 insertions(+), 64 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/CompareOperation.java b/opends/src/server/org/opends/server/core/CompareOperation.java
index 27269bf..fed9ea0 100644
--- a/opends/src/server/org/opends/server/core/CompareOperation.java
+++ b/opends/src/server/org/opends/server/core/CompareOperation.java
@@ -22,10 +22,12 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2006-2008 Sun Microsystems, Inc.
+ *      Copyright 2006-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.core;
 
+import java.util.Set;
+
 import org.opends.server.types.*;
 
 
@@ -104,6 +106,22 @@
 
 
   /**
+   * Retrieves the attribute options for this compare operation. This should
+   * not be called by the pre-parse plugins because the processed attribute
+   * options will not be available yet.
+   *
+   * @return  The attribute options for this compare operation.
+   */
+  public Set<String> getAttributeOptions();
+
+  /**
+   * Specifies the attribute options for this compare operation.
+   *
+   * @param attributeOptions The attribute options for this compare operation.
+   */
+  public void setAttributeOptions(Set<String> attributeOptions);
+
+  /**
    * Retrieves the assertion value for this compare operation.
    *
    * @return  The assertion value for this compare operation.
diff --git a/opends/src/server/org/opends/server/core/CompareOperationBasis.java b/opends/src/server/org/opends/server/core/CompareOperationBasis.java
index 2d6e54f..b038e85 100644
--- a/opends/src/server/org/opends/server/core/CompareOperationBasis.java
+++ b/opends/src/server/org/opends/server/core/CompareOperationBasis.java
@@ -32,9 +32,12 @@
 import static org.opends.server.loggers.AccessLogger.logCompareResponse;
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
 import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.plugin.PluginResult;
@@ -69,6 +72,9 @@
   // The assertion value for the compare operation.
   private ByteString assertionValue;
 
+  // The set of attribute options
+  private Set<String> attributeOptions;
+
   // The raw, unprocessed entry DN as included in the client request.
   private ByteString rawEntryDN;
 
@@ -117,6 +123,7 @@
     responseControls       = new ArrayList<Control>();
     entryDN                = null;
     attributeType          = null;
+    attributeOptions       = null;
     cancelRequest          = null;
     proxiedAuthorizationDN = null;
   }
@@ -154,6 +161,7 @@
     rawAttributeType       = attributeType.getNameOrOID();
     cancelRequest          = null;
     proxiedAuthorizationDN = null;
+    attributeOptions       = new HashSet<String>();
   }
 
 
@@ -224,15 +232,45 @@
     this.rawAttributeType = rawAttributeType;
 
     attributeType = null;
+    attributeOptions = null;
   }
 
 
 
+  private void getAttributeTypeAndOptions() {
+    String baseName;
+    int semicolonPos = rawAttributeType.indexOf(';');
+    if (semicolonPos > 0) {
+      baseName = toLowerCase(rawAttributeType.substring(0, semicolonPos));
+
+      attributeOptions = new HashSet<String>();
+      int nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
+      while (nextPos > 0)
+      {
+        attributeOptions.add(
+            rawAttributeType.substring(semicolonPos+1, nextPos));
+        semicolonPos = nextPos;
+        nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
+      }
+
+      attributeOptions.add(rawAttributeType.substring(semicolonPos+1));
+    }
+    else
+    {
+      baseName = toLowerCase(rawAttributeType);
+      attributeOptions  = null;
+    }
+    attributeType = DirectoryServer.getAttributeType(baseName, true);
+  }
+
   /**
    * {@inheritDoc}
    */
   public final AttributeType getAttributeType()
   {
+    if (attributeType == null) {
+      getAttributeTypeAndOptions();
+    }
     return attributeType;
   }
 
@@ -251,6 +289,27 @@
   /**
    * {@inheritDoc}
    */
+  public Set<String> getAttributeOptions()
+  {
+    if (attributeOptions == null) {
+      getAttributeTypeAndOptions();
+    }
+    return attributeOptions;
+  }
+
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public void setAttributeOptions(Set<String> attributeOptions)
+  {
+    this.attributeOptions = attributeOptions;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
   public final ByteString getAssertionValue()
   {
     return assertionValue;
diff --git a/opends/src/server/org/opends/server/core/CompareOperationWrapper.java b/opends/src/server/org/opends/server/core/CompareOperationWrapper.java
index b1ae975..fc2f142 100644
--- a/opends/src/server/org/opends/server/core/CompareOperationWrapper.java
+++ b/opends/src/server/org/opends/server/core/CompareOperationWrapper.java
@@ -22,7 +22,7 @@
  * CDDL HEADER END
  *
  *
- *      Copyright 2008 Sun Microsystems, Inc.
+ *      Copyright 2008-2009 Sun Microsystems, Inc.
  */
 package org.opends.server.core;
 
@@ -30,7 +30,7 @@
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.DN;
-
+import java.util.Set;
 
 /**
  * This abstract class wraps/decorates a given compare operation.
@@ -123,6 +123,24 @@
   /**
    * {@inheritDoc}
    */
+  public Set<String> getAttributeOptions()
+  {
+    return compare.getAttributeOptions();
+  }
+
+
+  /**
+   * {@inheritDoc}
+   */
+  public void setAttributeOptions(Set<String> attributeOptions)
+  {
+    compare.setAttributeOptions(attributeOptions);
+  }
+
+
+  /**
+   * {@inheritDoc}
+   */
   public ByteString getAssertionValue()
   {
     return compare.getAssertionValue();
diff --git a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java
index a1c8031..1c42ff6 100644
--- a/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendCompareOperation.java
@@ -28,8 +28,8 @@
 
 
 
-import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.locks.Lock;
 
 import org.opends.server.api.Backend;
@@ -315,39 +315,10 @@
 
 
         // Get the base attribute type and set of options.
-        String          baseName;
-        HashSet<String> options;
-        String rawAttributeType = getRawAttributeType();
-        int             semicolonPos = rawAttributeType.indexOf(';');
-        if (semicolonPos > 0)
-        {
-          baseName = toLowerCase(rawAttributeType.substring(0, semicolonPos));
-
-          options = new HashSet<String>();
-          int nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
-          while (nextPos > 0)
-          {
-            options.add(rawAttributeType.substring(semicolonPos+1, nextPos));
-            semicolonPos = nextPos;
-            nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
-          }
-
-          options.add(rawAttributeType.substring(semicolonPos+1));
-        }
-        else
-        {
-          baseName = toLowerCase(rawAttributeType);
-          options  = null;
-        }
-
+        Set<String> options = getAttributeOptions();
 
         // Actually perform the compare operation.
         AttributeType attrType = getAttributeType();
-        if (attrType == null)
-        {
-          attrType = DirectoryServer.getAttributeType(baseName, true);
-          setAttributeType(attrType);
-        }
 
         List<Attribute> attrList = entry.getAttribute(attrType, options);
         if ((attrList == null) || attrList.isEmpty())
@@ -356,12 +327,14 @@
           if (options == null)
           {
             appendErrorMessage(WARN_COMPARE_OP_NO_SUCH_ATTR.get(
-                                    String.valueOf(entryDN), baseName));
+                                    String.valueOf(entryDN),
+                                    getRawAttributeType()));
           }
           else
           {
             appendErrorMessage(WARN_COMPARE_OP_NO_SUCH_ATTR_WITH_OPTIONS.get(
-                                    String.valueOf(entryDN), baseName));
+                                    String.valueOf(entryDN),
+                                    getRawAttributeType()));
           }
         }
         else
diff --git a/opends/src/server/org/opends/server/workflowelement/ndb/NDBCompareOperation.java b/opends/src/server/org/opends/server/workflowelement/ndb/NDBCompareOperation.java
index ce1dc22..97bf4ae 100644
--- a/opends/src/server/org/opends/server/workflowelement/ndb/NDBCompareOperation.java
+++ b/opends/src/server/org/opends/server/workflowelement/ndb/NDBCompareOperation.java
@@ -28,8 +28,8 @@
 
 
 
-import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.plugin.PluginResult;
@@ -238,44 +238,20 @@
 
 
       // Get the base attribute type and set of options.
-      String baseName;
-      HashSet<String> options;
-      String rawAttributeType = getRawAttributeType();
-      int semicolonPos = rawAttributeType.indexOf(';');
-      if (semicolonPos > 0) {
-        baseName = toLowerCase(rawAttributeType.substring(0, semicolonPos));
-
-        options = new HashSet<String>();
-        int nextPos = rawAttributeType.indexOf(';', semicolonPos + 1);
-        while (nextPos > 0) {
-          options.add(rawAttributeType.substring(semicolonPos + 1, nextPos));
-          semicolonPos = nextPos;
-          nextPos = rawAttributeType.indexOf(';', semicolonPos + 1);
-        }
-
-        options.add(rawAttributeType.substring(semicolonPos + 1));
-      } else {
-        baseName = toLowerCase(rawAttributeType);
-        options = null;
-      }
-
+      Set<String> options = getAttributeOptions();
 
       // Actually perform the compare operation.
       AttributeType attrType = getAttributeType();
-      if (attrType == null) {
-        attrType = DirectoryServer.getAttributeType(baseName, true);
-        setAttributeType(attrType);
-      }
 
       List<Attribute> attrList = entry.getAttribute(attrType, options);
       if ((attrList == null) || attrList.isEmpty()) {
         setResultCode(ResultCode.NO_SUCH_ATTRIBUTE);
         if (options == null) {
           appendErrorMessage(WARN_COMPARE_OP_NO_SUCH_ATTR.get(
-            String.valueOf(entryDN), baseName));
+            String.valueOf(entryDN), getRawAttributeType()));
         } else {
           appendErrorMessage(WARN_COMPARE_OP_NO_SUCH_ATTR_WITH_OPTIONS.get(
-            String.valueOf(entryDN), baseName));
+            String.valueOf(entryDN), getRawAttributeType()));
         }
       } else {
         AttributeValue value = AttributeValues.create(attrType,

--
Gitblit v1.10.0