From 75a710630a2d6271231a31eed5fa72fccfcb8723 Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Mon, 10 Jun 2013 12:46:50 +0000
Subject: [PATCH] CR-1816 OPENDJ-940 Import-ldif NPE if base entry contains invalid attribute values and skipDNValidation is set - Removed NullPointerException message and it sends now a DirectoryException.

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java |  102 ++++++++++++++++++++-------------
 opendj-sdk/opends/src/messages/messages/tools.properties                             |    4 +
 opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java                 |   15 ++++
 opendj-sdk/opends/src/messages/messages/jeb.properties                               |    1 
 opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java                 |   15 ++++-
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java         |   13 +++-
 6 files changed, 101 insertions(+), 49 deletions(-)

diff --git a/opendj-sdk/opends/src/messages/messages/jeb.properties b/opendj-sdk/opends/src/messages/messages/jeb.properties
index 27603cf..5a72d1a 100644
--- a/opendj-sdk/opends/src/messages/messages/jeb.properties
+++ b/opendj-sdk/opends/src/messages/messages/jeb.properties
@@ -453,3 +453,4 @@
  with %d total entries to process
 NOTICE_JEB_REBUILD_CLEARDEGRADEDSTATE_FINAL_STATUS_232=Degraded state of \
 index(es) %s has been cleared
+SEVERE_ERR_PARENT_ENTRY_IS_MISSING_233=Parent entry is missing
diff --git a/opendj-sdk/opends/src/messages/messages/tools.properties b/opendj-sdk/opends/src/messages/messages/tools.properties
index a35ba90..5923f7f 100644
--- a/opendj-sdk/opends/src/messages/messages/tools.properties
+++ b/opendj-sdk/opends/src/messages/messages/tools.properties
@@ -198,6 +198,10 @@
  trying to open the rejects file %s for writing:  %s
 SEVERE_ERR_LDIFIMPORT_ERROR_DURING_IMPORT_96=An error occurred while \
  attempting to process the LDIF import:  %s
+SEVERE_ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION_97=One or more DN \
+indexes could not be built due to invalid DNs or missing parent entries. \
+Please re-import the data without the --skipDNValidation option in order \
+to determine the exact cause
 INFO_PROCESSING_OPERATION_104=Processing %s request for %s
 INFO_OPERATION_FAILED_105=%s operation failed
 INFO_OPERATION_SUCCESSFUL_106=%s operation successful for DN %s
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
index 5e104a7..8f9ef2a 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/BackendImpl.java
@@ -1158,9 +1158,16 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, execEx);
       }
-      Message message = ERR_EXECUTION_ERROR.get(execEx.getMessage());
-      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
-              message);
+      if (execEx.getCause() instanceof DirectoryException)
+      {
+        throw ((DirectoryException) execEx.getCause());
+      }
+      else
+      {
+        Message message = ERR_EXECUTION_ERROR.get(execEx.getMessage());
+        throw new DirectoryException(
+            DirectoryServer.getServerErrorResultCode(), message);
+      }
     }
     catch (InterruptedException intEx)
     {
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
index 40b1459..2bf4cdc 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java
@@ -2091,7 +2091,7 @@
      * {@inheritDoc}
      */
     @Override
-    public Void call() throws Exception
+    public Void call() throws Exception, DirectoryException
     {
       ByteBuffer key = null;
       ImportIDSet insertIDSet = null;
@@ -2214,7 +2214,7 @@
     }
 
     private void addToDB(ImportIDSet insertSet, ImportIDSet deleteSet,
-        int indexID)
+        int indexID) throws DirectoryException
     {
       if (!indexMgr.isDN2ID())
       {
@@ -2249,6 +2249,7 @@
     }
 
     private void addDN2ID(ImportIDSet record, Integer indexID)
+        throws DirectoryException
     {
       DNState dnState;
       if (!dnStateMap.containsKey(indexID))
@@ -2430,22 +2431,30 @@
         return true;
       }
 
-      private void id2child(EntryID childID)
+      private void id2child(EntryID childID) throws DirectoryException
       {
         ImportIDSet idSet;
-        if (!id2childTree.containsKey(parentID.getDatabaseEntry().getData()))
+        if (parentID != null)
         {
-          idSet = new ImportIDSet(1, childLimit, childDoCount);
-          id2childTree.put(parentID.getDatabaseEntry().getData(), idSet);
+          if (!id2childTree.containsKey(parentID.getDatabaseEntry().getData()))
+          {
+            idSet = new ImportIDSet(1, childLimit, childDoCount);
+            id2childTree.put(parentID.getDatabaseEntry().getData(), idSet);
+          }
+          else
+          {
+            idSet = id2childTree.get(parentID.getDatabaseEntry().getData());
+          }
+          idSet.addEntryID(childID);
+          if (id2childTree.size() > DN_STATE_CACHE_SIZE)
+          {
+            flushMapToDB(id2childTree, entryContainer.getID2Children(), true);
+          }
         }
         else
         {
-          idSet = id2childTree.get(parentID.getDatabaseEntry().getData());
-        }
-        idSet.addEntryID(childID);
-        if (id2childTree.size() > DN_STATE_CACHE_SIZE)
-        {
-          flushMapToDB(id2childTree, entryContainer.getID2Children(), true);
+          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+              ERR_PARENT_ENTRY_IS_MISSING.get());
         }
       }
 
@@ -2479,49 +2488,60 @@
         return nodeID;
       }
 
-      private void id2SubTree(EntryID childID)
+      private void id2SubTree(EntryID childID) throws DirectoryException
       {
-        ImportIDSet idSet;
-        if (!id2subtreeTree.containsKey(parentID.getDatabaseEntry().getData()))
+        if (parentID != null)
         {
-          idSet = new ImportIDSet(1, subTreeLimit, subTreeDoCount);
-          id2subtreeTree.put(parentID.getDatabaseEntry().getData(), idSet);
-        }
-        else
-        {
-          idSet = id2subtreeTree.get(parentID.getDatabaseEntry().getData());
-        }
-        idSet.addEntryID(childID);
-        // TODO:
-        //  Instead of doing this, we can just walk to parent cache if available
-        for (ByteBuffer dn = getParent(parentDN); dn != null; dn =
-            getParent(dn))
-        {
-          EntryID nodeID = getParentID(dn);
-          if (nodeID == null)
-          {
-            // We have a missing parent. Maybe parent checking was turned off?
-            // Just ignore.
-            break;
-          }
-          if (!id2subtreeTree.containsKey(nodeID.getDatabaseEntry().getData()))
+          ImportIDSet idSet;
+          if (!id2subtreeTree
+              .containsKey(parentID.getDatabaseEntry().getData()))
           {
             idSet = new ImportIDSet(1, subTreeLimit, subTreeDoCount);
-            id2subtreeTree.put(nodeID.getDatabaseEntry().getData(), idSet);
+            id2subtreeTree.put(parentID.getDatabaseEntry().getData(), idSet);
           }
           else
           {
-            idSet = id2subtreeTree.get(nodeID.getDatabaseEntry().getData());
+            idSet = id2subtreeTree.get(parentID.getDatabaseEntry().getData());
           }
           idSet.addEntryID(childID);
+          // TODO:
+          // Instead of doing this,
+          // we can just walk to parent cache if available
+          for (ByteBuffer dn = getParent(parentDN); dn != null; dn =
+              getParent(dn))
+          {
+            EntryID nodeID = getParentID(dn);
+            if (nodeID == null)
+            {
+              // We have a missing parent. Maybe parent checking was turned off?
+              // Just ignore.
+              break;
+            }
+            if (!id2subtreeTree
+                .containsKey(nodeID.getDatabaseEntry().getData()))
+            {
+              idSet = new ImportIDSet(1, subTreeLimit, subTreeDoCount);
+              id2subtreeTree.put(nodeID.getDatabaseEntry().getData(), idSet);
+            }
+            else
+            {
+              idSet = id2subtreeTree.get(nodeID.getDatabaseEntry().getData());
+            }
+            idSet.addEntryID(childID);
+          }
+          if (id2subtreeTree.size() > DN_STATE_CACHE_SIZE)
+          {
+            flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), true);
+          }
         }
-        if (id2subtreeTree.size() > DN_STATE_CACHE_SIZE)
+        else
         {
-          flushMapToDB(id2subtreeTree, entryContainer.getID2Subtree(), true);
+          throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+              ERR_PARENT_ENTRY_IS_MISSING.get());
         }
       }
 
-      public void writeToDB()
+      public void writeToDB() throws DirectoryException
       {
         entryContainer.getDN2ID().put(null, dnKey, dnValue);
         indexMgr.addTotDNCount(1);
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java b/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
index 51e589f..7555636 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tasks/ImportTask.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2013 ForgeRock AS
  */
 package org.opends.server.tasks;
 import org.opends.messages.Message;
@@ -1023,8 +1024,18 @@
         }
 
         DirectoryServer.notifyImportEnded(backend, importConfig, false);
-        Message message =
-            ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(de.getMessageObject());
+        Message message = null;
+        if (de.getResultCode() == ResultCode.CONSTRAINT_VIOLATION)
+        {
+          message =
+              ERR_LDIFIMPORT_ERROR_DURING_IMPORT
+                  .get(ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get());
+        }
+        else
+        {
+          message = ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(
+              de.getMessageObject());
+        }
         logError(message);
         return TaskState.STOPPED_BY_ERROR;
       }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java b/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
index 45ab123..052c9f4 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/tools/ImportLDIF.java
@@ -72,6 +72,7 @@
 import org.opends.server.types.LDIFImportResult;
 import org.opends.server.types.NullOutputStream;
 import org.opends.server.types.RawAttribute;
+import org.opends.server.types.ResultCode;
 import org.opends.server.types.SearchFilter;
 import org.opends.server.util.BuildVersion;
 import org.opends.server.util.args.ArgumentException;
@@ -1540,8 +1541,17 @@
     }
     catch (DirectoryException de)
     {
-      Message message =
-          ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(de.getMessageObject());
+      Message message = null;
+      if (de.getResultCode() == ResultCode.CONSTRAINT_VIOLATION)
+      {
+        message =
+            ERR_LDIFIMPORT_ERROR_DURING_IMPORT
+                .get(ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get());
+      }
+      else
+      {
+        message = ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(de.getMessageObject());
+      }
       logError(message);
       retCode = 1;
     }
@@ -1550,7 +1560,6 @@
       Message message =
           ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(getExceptionMessage(e));
       logError(message);
-e.printStackTrace();
       retCode = 1;
     }
 

--
Gitblit v1.10.0