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