mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Violette Roche-Montane
10.46.2013 1862a6ff9b98782d8444f673c1c75a893074c7ea
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.
6 files modified
150 ■■■■■ changed files
opends/src/messages/messages/jeb.properties 1 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/tools.properties 4 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/backends/jeb/BackendImpl.java 13 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/backends/jeb/importLDIF/Importer.java 102 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/tasks/ImportTask.java 15 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/tools/ImportLDIF.java 15 ●●●● patch | view | raw | blame | history
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
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
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)
    {
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);
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;
      }
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;
    }