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

Jean-Noël Rouvignac
10.41.2016 1e53194379b3b80e4d2a026865c0dde59bbf6ed1
OPENDJ-2715 Incorrect "exclude" message when importing entries with an exclude filter

Output the exact reason why an entry was skipped from the import.
4 files modified
122 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportLDIFReader.java 25 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/LDIFImportConfig.java 61 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/util/LDIFReader.java 28 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/messages/org/opends/messages/utility.properties 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ImportLDIFReader.java
@@ -29,15 +29,16 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.forgerock.util.Pair;
import org.forgerock.util.Reject;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.AttributeBuilder;
import org.forgerock.opendj.ldap.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.LDIFImportConfig;
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.opends.server.util.LDIFException;
import org.opends.server.util.LDIFReader;
@@ -151,12 +152,13 @@
          // read and return the next entry.
          continue;
        }
        if (!importConfig.includeEntry(entryDN))
        {
          logger.trace("Skipping entry %s because the DN is not one that "
              + "should be included based on the include and exclude branches.", entryDN);
          entriesRead.incrementAndGet();
          logToSkipWriter(lines, ERR_LDIF_SKIP.get(entryDN));
        final Pair<Boolean, LocalizableMessage> includeResult = importConfig.includeEntry(entryDN);
        if (!includeResult.getFirst())
        {
          logToSkipWriter(lines, includeResult.getSecond());
          continue;
        }
        entryContainer = getEntryContainer(entryDN, suffixesMap);
@@ -164,11 +166,9 @@
        {
          logger.trace("Skipping entry %s because the DN is not one that "
              + "should be included based on a suffix match check.", entryDN);
          entriesRead.incrementAndGet();
          logToSkipWriter(lines, ERR_LDIF_SKIP.get(entryDN));
          continue;
        }
        entriesRead.incrementAndGet();
        entryID = rootContainer.getNextEntryID();
        if (!addPending(entryDN))
@@ -227,11 +227,10 @@
    final DN entryDN = entry.getName();
    try
    {
      if (!importConfig.includeEntry(entry))
      final Pair<Boolean, LocalizableMessage> includeResult = importConfig.includeEntry(entry);
      if (!includeResult.getFirst())
      {
        logger.trace("Skipping entry %s because the DN is not one that "
            + "should be included based on the include and exclude filters.", entryDN);
        logToSkipWriter(entryLines, ERR_LDIF_SKIP.get(entryDN));
        logToSkipWriter(entryLines, includeResult.getSecond());
        return false;
      }
      return true;
opendj-server-legacy/src/main/java/org/opends/server/types/LDIFImportConfig.java
@@ -16,6 +16,8 @@
 */
package org.opends.server.types;
import static java.lang.Boolean.*;
import static org.opends.messages.UtilityMessages.*;
import java.io.BufferedReader;
@@ -38,9 +40,11 @@
import java.util.Set;
import java.util.zip.GZIPInputStream;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.util.Pair;
import org.opends.server.tools.makeldif.MakeLDIFInputStream;
import org.opends.server.tools.makeldif.TemplateFile;
import org.opends.server.util.CollectionUtils;
@@ -58,7 +62,6 @@
public final class LDIFImportConfig extends OperationConfig
                                    implements Closeable
{
  /** The default buffer size that will be used when reading LDIF data. */
  private static final int DEFAULT_BUFFER_SIZE = 8192;
@@ -646,17 +649,16 @@
  }
  /**
   * Indicates whether to include the entry with the specified DN in
   * the import.
   * Indicates whether to include the entry with the specified DN in the import.
   *
   * @param  dn  The DN of the entry for which to make the
   *             determination.
   *
   * @return  <CODE>true</CODE> if the entry with the specified DN
   *          should be included in the import, or <CODE>false</CODE>
   *          if not.
   * @param dn
   *          The DN of the entry for which to make the determination.
   * @return a pair where the first element is a boolean indicating whether the entry with the
   *         specified DN should be included in the import, and the second element is a message with
   *         the reason why an entry is not included in the import (it is {@code null} when the
   *         entry is included in the import).
   */
  public boolean includeEntry(DN dn)
  public Pair<Boolean, LocalizableMessage> includeEntry(DN dn)
  {
    if (! excludeBranches.isEmpty())
    {
@@ -664,7 +666,7 @@
      {
        if (excludeBranch.isSuperiorOrEqualTo(dn))
        {
          return false;
          return Pair.of(FALSE, ERR_LDIF_SKIP_EXCLUDE_BRANCH.get(dn, excludeBranch));
        }
      }
    }
@@ -675,14 +677,14 @@
      {
        if (includeBranch.isSuperiorOrEqualTo(dn))
        {
          return true;
          return Pair.of(TRUE, null);
        }
      }
      return false;
      return Pair.of(FALSE, ERR_LDIF_SKIP_NOT_IN_INCLUDED_BRANCHES.get(dn));
    }
    return true;
    return Pair.of(TRUE, null);
  }
@@ -881,46 +883,45 @@
  /**
   * Indicates whether the specified entry should be included in the
   * import based on the configured set of include and exclude
   * filters.
   * import based on the configured set of include and exclude filters.
   *
   * @param  entry  The entry for which to make the determination.
   *
   * @return  <CODE>true</CODE> if the specified entry should be
   *          included in the import, or <CODE>false</CODE> if not.
   *
   * @return  a pair where the first element is a boolean indicating whether
   *          the entry with the specified DN should be included in the import,
   *          and the second element is a message with the reason why an entry
   *          is not included in the import (it is {@code null} when the entry
   *          is included in the import).
   * @throws  DirectoryException  If there is a problem with any of
   *                              the search filters used to make the
   *                              determination.
   */
  public boolean includeEntry(Entry entry)
         throws DirectoryException
  public Pair<Boolean, LocalizableMessage> includeEntry(Entry entry) throws DirectoryException
  {
    if (! excludeFilters.isEmpty())
    {
      for (SearchFilter filter : excludeFilters)
      for (SearchFilter excludeFilter : excludeFilters)
      {
        if (filter.matchesEntry(entry))
        if (excludeFilter.matchesEntry(entry))
        {
          return false;
          return Pair.of(FALSE, ERR_LDIF_SKIP_EXCLUDE_FILTER.get(entry.getName(), excludeFilter));
        }
      }
    }
    if (! includeFilters.isEmpty())
    {
      for (SearchFilter filter : includeFilters)
      for (SearchFilter includeFilter : includeFilters)
      {
        if (filter.matchesEntry(entry))
        if (includeFilter.matchesEntry(entry))
        {
          return true;
          return Pair.of(TRUE, null);
        }
      }
      return false;
      return Pair.of(FALSE, ERR_LDIF_SKIP_NOT_IN_INCLUDED_FILTERS.get(entry.getName()));
    }
    return true;
    return Pair.of(TRUE, null);
  }
opendj-server-legacy/src/main/java/org/opends/server/util/LDIFReader.java
@@ -46,6 +46,8 @@
import org.forgerock.opendj.ldap.RDN;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.CoreSchema;
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.forgerock.util.Pair;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.PluginConfigManager;
@@ -57,7 +59,6 @@
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
import org.opends.server.types.LDIFImportConfig;
import org.forgerock.opendj.ldap.schema.ObjectClass;
import org.opends.server.types.RawModification;
/**
@@ -200,29 +201,24 @@
        // read and return the next entry.
        continue;
      }
      else if (!importConfig.includeEntry(entryDN))
      {
        logger.trace("Skipping entry %s because the DN is not one that "
            + "should be included based on the include and exclude branches.", entryDN);
        entriesRead.incrementAndGet();
        logToSkipWriter(lines, ERR_LDIF_SKIP.get(entryDN));
      Pair<Boolean, LocalizableMessage> includeResult = importConfig.includeEntry(entryDN);
      if (!includeResult.getFirst())
      {
        logToSkipWriter(lines, includeResult.getSecond());
        continue;
      }
      else
      {
        entriesRead.incrementAndGet();
      }
      // Create the entry and see if it is one that should be included in the import.
      final Entry entry = createEntry(entryDN, lines, checkSchema);
      if (!isIncludedInImport(entry,lines)
          || !invokeImportPlugins(entry, lines))
      {
        continue;
      }
      validateAgainstSchemaIfNeeded(checkSchema, entry, lines);
      // The entry should be included in the import, so return it.
      validateAgainstSchemaIfNeeded(checkSchema, entry, lines);
      return entry;
    }
  }
@@ -247,12 +243,10 @@
  {
    try
    {
      if (!importConfig.includeEntry(entry))
      Pair<Boolean, LocalizableMessage> includeResult = importConfig.includeEntry(entry);
      if (!includeResult.getFirst())
      {
        final DN entryDN = entry.getName();
        logger.trace("Skipping entry %s because the DN is not one that "
            + "should be included based on the include and exclude filters.", entryDN);
        logToSkipWriter(lines, ERR_LDIF_SKIP.get(entryDN));
        logToSkipWriter(lines, includeResult.getSecond());
        return false;
      }
      return true;
opendj-server-legacy/src/messages/org/opends/messages/utility.properties
@@ -209,7 +209,7 @@
 the import configuration indicates that no attempt should be made to append \
 to or replace the file
ERR_LDIF_SKIP_165=Skipping entry %s because the DN is not one that \
 should be included based on the include and exclude branches
 should be included based on the include and exclude branches/filters
ERR_EMBEDUTILS_SERVER_ALREADY_RUNNING_167=The Directory Server cannot \
 be started because it is already running
INFO_EMAIL_TOOL_DESCRIPTION_171=Send an e-mail message via SMTP
@@ -259,6 +259,12 @@
ERR_BASE64_CANNOT_WRITE_RAW_DATA_199=An error occurred while \
 attempting to write the decoded data: %s
ERR_BASE64_UNKNOWN_SUBCOMMAND_200=Unknown subcommand %s
ERR_LDIF_SKIP_EXCLUDE_BRANCH_201=Skipping entry %s because the DN is excluded by the exclude branch "%s"
ERR_LDIF_SKIP_EXCLUDE_FILTER_202=Skipping entry %s because the DN is excluded by the exclude filter "%s"
ERR_LDIF_SKIP_NOT_IN_INCLUDED_BRANCHES_203=Skipping entry %s because the DN \
 is not included by any include branches
ERR_LDIF_SKIP_NOT_IN_INCLUDED_FILTERS_204=Skipping entry %s because the DN \
 is not included by any include filters
ERR_LDIF_REJECTED_BY_PLUGIN_NOMESSAGE_224=Rejecting entry %s because \
 it was rejected by a plugin
ERR_LDIF_REJECTED_BY_PLUGIN_225=Rejecting entry %s because it was \