From b8e0c2f59c913da9258ce01a14b631730e554c96 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 04 Apr 2016 08:10:10 +0000
Subject: [PATCH] OPENDJ-2817 Online import-ldif no longer working (NPE)

---
 opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java |   44 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java
index a45495d..66a5185 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/tasks/TaskEntry.java
@@ -16,6 +16,7 @@
  */
 package org.opends.server.tools.tasks;
 
+import static org.opends.server.util.CollectionUtils.*;
 import static org.opends.server.util.ServerConstants.*;
 
 import java.text.DateFormat;
@@ -27,6 +28,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TimeZone;
 
 import org.forgerock.i18n.LocalizableMessage;
@@ -36,10 +38,8 @@
 import org.opends.server.backends.task.FailedDependencyAction;
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.core.DirectoryServer;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.Entry;
-import org.opends.server.types.ObjectClass;
 import org.opends.server.util.StaticUtils;
 
 /**
@@ -54,6 +54,27 @@
 
   private int hashCode;
 
+  /**
+   * These attributes associated with the ds-task object
+   * class are all handled explicitly below in the constructor.
+   */
+  private static final Set<String> supAttrNames = newHashSet(
+    // @formatter:off
+    "ds-task-id",
+    "ds-task-class-name",
+    "ds-task-state",
+    "ds-task-scheduled-start-time",
+    "ds-task-actual-start-time",
+    "ds-task-completion-time",
+    "ds-task-dependency-id",
+    "ds-task-failed-dependency-action",
+    "ds-task-log-message",
+    "ds-task-notify-on-completion",
+    "ds-task-notify-on-error",
+    "ds-recurring-task-id",
+    "ds-recurring-task-schedule");
+    // @formatter:on
+
   private String id;
   private String className;
   private String state;
@@ -98,10 +119,10 @@
     notifyComp = getMultiStringValue(entry,  p + "notify-on-completion");
     schedTab =   getSingleStringValue(entry, "ds-recurring-task-schedule");
 
-    final ObjectClass dsTask = DirectoryServer.getObjectClass("ds-task");
-    final ObjectClass dsRecurringTask = DirectoryServer.getObjectClass("ds-recurring-task");
+    // Build a map of non-superior attribute value pairs for display
     for (AttributeType attrType : entry.getUserAttributes().keySet()) {
-      if (!dsTask.isRequiredOrOptional(attrType) && !dsRecurringTask.isRequiredOrOptional(attrType)) {
+      // See if we've handled it already above
+      if (!hasAnyNameOrOID(attrType, supAttrNames)) {
         LocalizableMessage attrTypeName = getAttributeDisplayName(attrType);
         for (Attribute attr : entry.getUserAttribute(attrType)) {
           for (ByteString av : attr) {
@@ -115,6 +136,7 @@
         }
       }
     }
+
     hashCode += id.hashCode();
     hashCode += className.hashCode();
     hashCode += state.hashCode();
@@ -130,6 +152,18 @@
     hashCode += taskSpecificAttrValues.hashCode();
   }
 
+  private boolean hasAnyNameOrOID(AttributeType attrType, Set<String> attrNames)
+  {
+    for (String attrName : attrNames)
+    {
+      if (attrType.hasNameOrOID(attrName))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
   @Override
   public int hashCode()
   {

--
Gitblit v1.10.0