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