From 8d673dd2b125d0b974eb1e8376e053731c628354 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Wed, 19 Sep 2012 22:52:22 +0000
Subject: [PATCH] Fix OPENDJ-157: Make methods like Entry.getAttribute(String) more user friendly

---
 opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractMapEntry.java |   41 ++++++++++++++++++++++++++++-------------
 1 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractMapEntry.java b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractMapEntry.java
index 9825e45..e6d23e1 100644
--- a/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractMapEntry.java
+++ b/opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/AbstractMapEntry.java
@@ -37,7 +37,6 @@
  */
 abstract class AbstractMapEntry extends AbstractEntry {
     private final Map<AttributeDescription, Attribute> attributes;
-
     private DN name;
 
     /**
@@ -57,12 +56,11 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final boolean addAttribute(final Attribute attribute,
             final Collection<ByteString> duplicateValues) {
-        Validator.ensureNotNull(attribute);
-
         final AttributeDescription attributeDescription = attribute.getAttributeDescription();
-        final Attribute oldAttribute = attributes.get(attributeDescription);
+        final Attribute oldAttribute = getAttribute(attributeDescription);
         if (oldAttribute != null) {
             return oldAttribute.addAll(attribute, duplicateValues);
         } else {
@@ -74,6 +72,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final Entry clearAttributes() {
         attributes.clear();
         return this;
@@ -82,6 +81,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final Iterable<Attribute> getAllAttributes() {
         return attributes.values();
     }
@@ -89,15 +89,21 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final Attribute getAttribute(final AttributeDescription attributeDescription) {
-        Validator.ensureNotNull(attributeDescription);
-
-        return attributes.get(attributeDescription);
+        final Attribute attribute = attributes.get(attributeDescription);
+        if (attribute == null && attributeDescription.isPlaceHolder()) {
+            // Fall-back to inefficient search using place-holder.
+            return super.getAttribute(attributeDescription);
+        } else {
+            return attribute;
+        }
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public final int getAttributeCount() {
         return attributes.size();
     }
@@ -105,6 +111,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final DN getName() {
         return name;
     }
@@ -112,20 +119,27 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final boolean removeAttribute(final Attribute attribute,
             final Collection<ByteString> missingValues) {
-        Validator.ensureNotNull(attribute);
-
         final AttributeDescription attributeDescription = attribute.getAttributeDescription();
-
         if (attribute.isEmpty()) {
-            return attributes.remove(attributeDescription) != null;
+            if (attributes.remove(attributeDescription) != null) {
+                return true;
+            } else if (attributeDescription.isPlaceHolder()) {
+                // Fall-back to inefficient remove using place-holder.
+                return super.removeAttribute(attribute, missingValues);
+            } else {
+                return false;
+            }
         } else {
-            final Attribute oldAttribute = attributes.get(attributeDescription);
+            final Attribute oldAttribute = getAttribute(attributeDescription);
             if (oldAttribute != null) {
                 final boolean modified = oldAttribute.removeAll(attribute, missingValues);
                 if (oldAttribute.isEmpty()) {
-                    attributes.remove(attributeDescription);
+                    // Use old attribute's description in case it is different
+                    // (e.g. this may be the case when using place-holders).
+                    attributes.remove(oldAttribute.getAttributeDescription());
                     return true;
                 }
                 return modified;
@@ -141,6 +155,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public final Entry setName(final DN dn) {
         Validator.ensureNotNull(dn);
         this.name = dn;

--
Gitblit v1.10.0