From 4aa16886ef9ceb87b62417688829638d53004415 Mon Sep 17 00:00:00 2001
From: Peter Major <peter.major@forgerock.com>
Date: Mon, 16 Dec 2013 18:21:41 +0000
Subject: [PATCH] Backporting fix for OPENDJ-1203 MemoryBackend does not raise an error when trying to delete non-existent attribute
---
opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Entries.java | 64 ++++++++++++++++----------------
1 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Entries.java b/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Entries.java
index 7511b6b..b54e641 100644
--- a/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Entries.java
+++ b/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/Entries.java
@@ -28,12 +28,7 @@
package org.forgerock.opendj.ldap;
import static org.forgerock.opendj.ldap.AttributeDescription.objectClass;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_DUPLICATE_VALUES;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_INCREMENT_CANNOT_PARSE_AS_INT;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_INCREMENT_INVALID_VALUE_COUNT;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_INCREMENT_NO_SUCH_ATTRIBUTE;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_NO_SUCH_VALUE;
-import static org.forgerock.opendj.ldap.CoreMessages.ERR_ENTRY_UNKNOWN_MODIFICATION_TYPE;
+import static org.forgerock.opendj.ldap.CoreMessages.*;
import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
import java.util.ArrayList;
@@ -629,20 +624,7 @@
*/
public static Entry modifyEntry(final Entry entry, final Modification change,
final Collection<? super ByteString> conflictingValues) throws ErrorResultException {
- final ModificationType modType = change.getModificationType();
- if (modType.equals(ModificationType.ADD)) {
- entry.addAttribute(change.getAttribute(), conflictingValues);
- } else if (modType.equals(ModificationType.DELETE)) {
- entry.removeAttribute(change.getAttribute(), conflictingValues);
- } else if (modType.equals(ModificationType.REPLACE)) {
- entry.replaceAttribute(change.getAttribute());
- } else if (modType.equals(ModificationType.INCREMENT)) {
- incrementAttribute(entry, change.getAttribute());
- } else {
- throw newErrorResult(ResultCode.UNWILLING_TO_PERFORM,
- ERR_ENTRY_UNKNOWN_MODIFICATION_TYPE.get(String.valueOf(modType)).toString());
- }
- return entry;
+ return modifyEntry0(entry, change, conflictingValues, true);
}
/**
@@ -769,20 +751,38 @@
final Collection<ByteString> conflictingValues =
isPermissive ? null : new ArrayList<ByteString>(0);
for (final Modification change : changes) {
- modifyEntry(entry, change, conflictingValues);
+ modifyEntry0(entry, change, conflictingValues, isPermissive);
+ }
+ return entry;
+ }
+
+ private static Entry modifyEntry0(final Entry entry, final Modification change,
+ final Collection<? super ByteString> conflictingValues, final boolean isPermissive)
+ throws ErrorResultException {
+ final ModificationType modType = change.getModificationType();
+ if (modType.equals(ModificationType.ADD)) {
+ entry.addAttribute(change.getAttribute(), conflictingValues);
if (!isPermissive && !conflictingValues.isEmpty()) {
- if (change.getModificationType().equals(ModificationType.ADD)) {
- // Duplicate values.
- throw newErrorResult(ResultCode.ATTRIBUTE_OR_VALUE_EXISTS,
- ERR_ENTRY_DUPLICATE_VALUES.get(
- change.getAttribute().getAttributeDescriptionAsString())
- .toString());
- } else {
- // Missing values.
- throw newErrorResult(ResultCode.NO_SUCH_ATTRIBUTE, ERR_ENTRY_NO_SUCH_VALUE.get(
- change.getAttribute().getAttributeDescriptionAsString()).toString());
- }
+ // Duplicate values.
+ throw newErrorResult(ResultCode.ATTRIBUTE_OR_VALUE_EXISTS,
+ ERR_ENTRY_DUPLICATE_VALUES.get(
+ change.getAttribute().getAttributeDescriptionAsString()).toString());
}
+ } else if (modType.equals(ModificationType.DELETE)) {
+ final boolean hasChanged =
+ entry.removeAttribute(change.getAttribute(), conflictingValues);
+ if (!isPermissive && (!hasChanged || !conflictingValues.isEmpty())) {
+ // Missing attribute or values.
+ throw newErrorResult(ResultCode.NO_SUCH_ATTRIBUTE, ERR_ENTRY_NO_SUCH_VALUE.get(
+ change.getAttribute().getAttributeDescriptionAsString()).toString());
+ }
+ } else if (modType.equals(ModificationType.REPLACE)) {
+ entry.replaceAttribute(change.getAttribute());
+ } else if (modType.equals(ModificationType.INCREMENT)) {
+ incrementAttribute(entry, change.getAttribute());
+ } else {
+ throw newErrorResult(ResultCode.UNWILLING_TO_PERFORM,
+ ERR_ENTRY_UNKNOWN_MODIFICATION_TYPE.get(String.valueOf(modType)).toString());
}
return entry;
}
--
Gitblit v1.10.0