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

Jean-Noel Rouvignac
27.20.2015 6b47d8afcb80c74e8c29d2702a38e8948056b462
Code cleanup:
Used Sets instead of Lists where it makes sense.
6 files modified
852 ■■■■ changed files
opendj3-server-dev/src/server/org/opends/server/api/Backend.java 5 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java 9 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/tasks/ImportTask.java 68 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/tools/ImportLDIF.java 286 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/types/LDIFImportConfig.java 473 ●●●● patch | view | raw | blame | history
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestImportJob.java 11 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/api/Backend.java
@@ -29,6 +29,7 @@
import static org.opends.messages.BackendMessages.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Queue;
@@ -1066,7 +1067,7 @@
   * @return  {@code true} if the backend should handle operations for
   *          the provided entry, or {@code false} if it does not.
   */
  public static final boolean handlesEntry(DN entryDN, List<DN> baseDNs, List<DN> excludeDNs)
  public static final boolean handlesEntry(DN entryDN, Collection<DN> baseDNs, Collection<DN> excludeDNs)
  {
    for (DN baseDN : baseDNs)
    {
@@ -1078,7 +1079,7 @@
    return false;
  }
  private static boolean isExcluded(List<DN> excludeDNs, DN entryDN)
  private static boolean isExcluded(Collection<DN> excludeDNs, DN entryDN)
  {
    if (excludeDNs == null || excludeDNs.isEmpty())
    {
opendj3-server-dev/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -1272,13 +1272,10 @@
    return list;
  }
  private static <T> Set<T> newSet(T... elems)
  private static <T> Set<T> newSet(T elem)
  {
    final Set<T> list = new LinkedHashSet<T>(elems.length);
    for (T elem : elems)
    {
    final Set<T> list = new LinkedHashSet<T>(1);
      list.add(elem);
    }
    return list;
  }
@@ -3578,7 +3575,7 @@
      }
      importConfig = new LDIFImportConfig(input);
      importConfig.setIncludeBranches(newList(getBaseDN()));
      importConfig.setIncludeBranches(newSet(getBaseDN()));
      importConfig.setAppendToExistingData(false);
      importConfig.setSkipDNValidation(true);
      // We should not validate schema for replication
opendj3-server-dev/src/server/org/opends/server/tasks/ImportTask.java
@@ -239,10 +239,8 @@
    Backend<?> backend = null;
    ArrayList<DN> defaultIncludeBranches;
    ArrayList<DN> excludeBranches =
        new ArrayList<DN>(excludeBranchStrings.size());
    ArrayList<DN> includeBranches =
        new ArrayList<DN>(includeBranchStrings.size());
    HashSet<DN> excludeBranches = new HashSet<DN>(excludeBranchStrings.size());
    HashSet<DN> includeBranches = new HashSet<DN>(includeBranchStrings.size());
    for (String s : includeBranchStrings)
    {
@@ -264,11 +262,8 @@
        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
      }
      if(! includeBranches.contains(includeBranch))
      {
        includeBranches.add(includeBranch);
      }
    }
    for (String s : excludeBranchStrings)
    {
      DN excludeBranch;
@@ -289,11 +284,8 @@
        throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
      }
      if (! excludeBranches.contains(excludeBranch))
      {
        excludeBranches.add(excludeBranch);
      }
    }
    for (String filterString : excludeFilterStrings)
    {
@@ -487,11 +479,9 @@
    // Get the backend into which the LDIF should be imported.
    Backend<?> backend = null;
    ArrayList<DN> defaultIncludeBranches;
    ArrayList<DN> excludeBranches =
        new ArrayList<DN>(excludeBranchStrings.size());
    ArrayList<DN> includeBranches =
        new ArrayList<DN>(includeBranchStrings.size());
    HashSet<DN> defaultIncludeBranches;
    HashSet<DN> excludeBranches = new HashSet<DN>(excludeBranchStrings.size());
    HashSet<DN> includeBranches = new HashSet<DN>(includeBranchStrings.size());
    for (String s : includeBranchStrings)
    {
@@ -511,11 +501,8 @@
        return TaskState.STOPPED_BY_ERROR;
      }
      if(! includeBranches.contains(includeBranch))
      {
        includeBranches.add(includeBranch);
      }
    }
    if(backendID != null)
    {
@@ -574,7 +561,7 @@
    // Find backends with subordinate base DNs that should be excluded from the
    // import.
    defaultIncludeBranches = new ArrayList<DN>(backend.getBaseDNs().length);
    defaultIncludeBranches = new HashSet<DN>(backend.getBaseDNs().length);
    for (DN dn : backend.getBaseDNs())
    {
      defaultIncludeBranches.add(dn);
@@ -588,14 +575,9 @@
        {
          for (DN importBase : defaultIncludeBranches)
          {
            if (baseDN.isDescendantOf(importBase)
                && !baseDN.equals(importBase))
            {
              if (! excludeBranches.contains(baseDN))
            if (!baseDN.equals(importBase) && baseDN.isDescendantOf(importBase))
              {
                excludeBranches.add(baseDN);
              }
              break;
            }
          }
@@ -621,11 +603,8 @@
        return TaskState.STOPPED_BY_ERROR;
      }
      if (! excludeBranches.contains(excludeBranch))
      {
        excludeBranches.add(excludeBranch);
      }
    }
    if (includeBranchStrings.isEmpty())
    {
@@ -707,15 +686,8 @@
    {
      try
      {
        ExistingFileBehavior existingBehavior;
        if (overwrite)
        {
          existingBehavior = ExistingFileBehavior.OVERWRITE;
        }
        else
        {
          existingBehavior = ExistingFileBehavior.APPEND;
        }
        ExistingFileBehavior existingBehavior =
            overwrite ? ExistingFileBehavior.OVERWRITE : ExistingFileBehavior.APPEND;
        importConfig.writeRejectedEntries(rejectFile, existingBehavior);
      }
@@ -730,15 +702,8 @@
    {
      try
      {
        ExistingFileBehavior existingBehavior;
        if (overwrite)
        {
          existingBehavior = ExistingFileBehavior.OVERWRITE;
        }
        else
        {
          existingBehavior = ExistingFileBehavior.APPEND;
        }
        ExistingFileBehavior existingBehavior =
            overwrite ? ExistingFileBehavior.OVERWRITE : ExistingFileBehavior.APPEND;
        importConfig.writeSkippedEntries(skipFile, existingBehavior);
      }
      catch (Exception e)
@@ -804,19 +769,16 @@
        logger.traceException(de);
        DirectoryServer.notifyImportEnded(backend, importConfig, false);
        LocalizableMessage message = null;
        LocalizableMessage msg;
        if (de.getResultCode() == ResultCode.CONSTRAINT_VIOLATION)
        {
          message =
              ERR_LDIFIMPORT_ERROR_DURING_IMPORT
                  .get(ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get());
          msg = ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get();
        }
        else
        {
          message = ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(
              de.getMessageObject());
          msg = de.getMessageObject();
        }
        logger.error(message);
        logger.error(ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(msg));
        return TaskState.STOPPED_BY_ERROR;
      }
      catch (Exception e)
opendj3-server-dev/src/server/org/opends/server/tools/ImportLDIF.java
@@ -40,6 +40,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -119,7 +120,6 @@
   * Processes the command-line arguments and invokes the import process.
   *
   * @param  args  The command-line arguments provided to thisprogram.
   *
   * @return The error code.
   */
  public static int mainImportLDIF(String[] args)
@@ -549,9 +549,10 @@
  private void addAttribute2(List<RawAttribute> attributes, String attrName, Argument arg)
  {
    if (arg.getValue() != null && !arg.getValue().equals(arg.getDefaultValue()))
    final String value = arg.getValue();
    if (value != null && !value.equals(arg.getDefaultValue()))
    {
      attributes.add(new LDAPAttribute(attrName, toByteStrings(arg.getValue())));
      attributes.add(new LDAPAttribute(attrName, toByteStrings(value)));
    }
  }
@@ -642,21 +643,9 @@
      {
        directoryServer.initializeSchema();
      }
      catch (ConfigException ce)
      {
        LocalizableMessage message = ERR_CANNOT_LOAD_SCHEMA.get(ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_CANNOT_LOAD_SCHEMA.get(ie.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (Exception e)
      {
        LocalizableMessage message = ERR_CANNOT_LOAD_SCHEMA.get(getExceptionMessage(e));
        LocalizableMessage message = ERR_CANNOT_LOAD_SCHEMA.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -668,24 +657,9 @@
        CoreConfigManager coreConfigManager = new CoreConfigManager(directoryServer.getServerContext());
        coreConfigManager.initializeCoreConfig();
      }
      catch (ConfigException ce)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(
                ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(
                ie.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (Exception e)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(
                getExceptionMessage(e));
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -696,24 +670,9 @@
      {
        directoryServer.initializeCryptoManager();
      }
      catch (ConfigException ce)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(
                ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(
                ie.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (Exception e)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(
                getExceptionMessage(e));
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -740,17 +699,9 @@
      {
        directoryServer.initializeRootDNConfigManager();
      }
      catch (ConfigException ce)
      catch (Exception e)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER.get(
                ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER.get(
                ie.getMessage());
        LocalizableMessage message = ERR_CANNOT_INITIALIZE_ROOTDN_MANAGER.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -761,24 +712,9 @@
        HashSet<PluginType> pluginTypes = new HashSet<PluginType>(1);
        directoryServer.initializePlugins(pluginTypes);
      }
      catch (ConfigException ce)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
                ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
                ie.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (Exception e)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
                getExceptionMessage(e));
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -801,24 +737,9 @@
      {
        directoryServer.initializeAuthenticationPolicyComponents();
      }
      catch (ConfigException ce)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PWPOLICY.get(
                ce.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (InitializationException ie)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PWPOLICY.get(
                ie.getMessage());
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
      catch (Exception e)
      {
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PWPOLICY.get(
                getExceptionMessage(e));
        LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PWPOLICY.get(getMessage(e));
        err.println(wrapText(message, MAX_LINE_WIDTH));
        return 1;
      }
@@ -833,24 +754,9 @@
              DirectoryServer.getPluginConfigManager();
      pluginConfigManager.initializeUserPlugins(pluginTypes);
    }
    catch (ConfigException ce)
    {
      LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
              ce.getMessage());
      err.println(wrapText(message, MAX_LINE_WIDTH));
      return 1;
    }
    catch (InitializationException ie)
    {
      LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
              ie.getMessage());
      err.println(wrapText(message, MAX_LINE_WIDTH));
      return 1;
    }
    catch (Exception e)
    {
      LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(
              getExceptionMessage(e));
      LocalizableMessage message = ERR_LDIFIMPORT_CANNOT_INITIALIZE_PLUGINS.get(getMessage(e));
      err.println(wrapText(message, MAX_LINE_WIDTH));
      return 1;
    }
@@ -985,13 +891,12 @@
    // imported and finding backends with subordinate base DNs that should be
    // excluded from the import.
    Backend<?> backend = null;
    List<DN> defaultIncludeBranches = null;
    List<DN> excludeBranches        = new ArrayList<DN>();
    List<DN> includeBranches        = new ArrayList<DN>();
    Set<DN> defaultIncludeBranches = null;
    Set<DN> excludeBranches = new HashSet<DN>();
    Set<DN> includeBranches = new HashSet<DN>();
    if (includeBranchStrings.isPresent())
    {
      includeBranches = new ArrayList<DN>();
      for (String s : includeBranchStrings.getValues())
      {
        DN includeBranch;
@@ -1037,23 +942,7 @@
      }
      else
      {
        boolean useBackend = false;
        for(DN baseDN : dnList.get(i))
        {
          for(DN includeDN : includeBranches)
          {
            if(baseDN.isAncestorOf(includeDN))
            {
              useBackend = true;
              break;
            }
          }
          if(useBackend)
          {
            break;
          }
        }
        if(!useBackend)
        if (!useBackend(includeBranches, dnList.get(i)))
        {
          continue;
        }
@@ -1062,7 +951,7 @@
      if (backend == null)
      {
        backend                = b;
        defaultIncludeBranches = dnList.get(i);
        defaultIncludeBranches = new HashSet<DN>(dnList.get(i));
      }
      else
      {
@@ -1088,14 +977,9 @@
      {
        for (DN importBase : defaultIncludeBranches)
        {
          if (baseDN.isDescendantOf(importBase) &&
              (! baseDN.equals(importBase)))
          {
            if (! excludeBranches.contains(baseDN))
          if (!baseDN.equals(importBase) && baseDN.isDescendantOf(importBase))
            {
              excludeBranches.add(baseDN);
            }
            break;
          }
        }
@@ -1112,13 +996,7 @@
        defaultIncludeBranches.size() > 1 &&
        !clearBackend.isPresent())
    {
      StringBuilder builder = new StringBuilder();
      builder.append(backend.getBaseDNs()[0].toString());
      for(int i = 1; i < backend.getBaseDNs().length; i++)
      {
        builder.append(" / ");
        builder.append(backend.getBaseDNs()[i].toString());
      }
      StringBuilder builder = join(backend.getBaseDNs(), " / ");
      LocalizableMessage message = ERR_LDIFIMPORT_MISSING_CLEAR_BACKEND.get(
              builder, clearBackend.getLongIdentifier());
      err.println(wrapText(message, MAX_LINE_WIDTH));
@@ -1143,11 +1021,8 @@
        return 1;
      }
      if (! excludeBranches.contains(excludeBranch))
      {
        excludeBranches.add(excludeBranch);
      }
    }
    if (! includeBranchStrings.isPresent())
    {
@@ -1188,22 +1063,7 @@
    }
    else
    {
      Random random;
      if (randomSeed.isPresent())
      {
        try
        {
          random = new Random(randomSeed.getIntValue());
        }
        catch (Exception e)
        {
          random = new Random();
        }
      }
      else
      {
        random = new Random();
      }
      Random random = newRandom();
      String resourcePath = DirectoryServer.getInstanceRoot() + File.separator +
                            PATH_MAKELDIF_RESOURCE_DIR;
@@ -1252,12 +1112,9 @@
      }
    importConfig.setBufferSize(LDIF_BUFFER_SIZE);
    importConfig.setExcludeAllUserAttributes(
                                     excludeAllUserAttributes);
    importConfig.setExcludeAllOperationalAttributes(
                                     excludeAllOperationalAttributes);
    importConfig.setIncludeAllOpAttributes(
                                      includeAllOperationalAttributes);
    importConfig.setExcludeAllUserAttributes(excludeAllUserAttributes);
    importConfig.setExcludeAllOperationalAttributes(excludeAllOperationalAttributes);
    importConfig.setIncludeAllOpAttributes(includeAllOperationalAttributes);
    importConfig.setIncludeAllUserAttributes(includeAllUserAttributes);
    // FIXME -- Should this be conditional?
@@ -1267,15 +1124,9 @@
    {
      try
      {
        ExistingFileBehavior existingBehavior;
        if (overwrite.isPresent())
        {
          existingBehavior = ExistingFileBehavior.OVERWRITE;
        }
        else
        {
          existingBehavior = ExistingFileBehavior.APPEND;
        }
        ExistingFileBehavior existingBehavior = overwrite.isPresent()
            ? ExistingFileBehavior.OVERWRITE
            : ExistingFileBehavior.APPEND;
        importConfig.writeRejectedEntries(rejectFile.getValue(),
                                          existingBehavior);
@@ -1291,15 +1142,9 @@
    {
      try
      {
        ExistingFileBehavior existingBehavior;
        if (overwrite.isPresent())
        {
          existingBehavior = ExistingFileBehavior.OVERWRITE;
        }
        else
        {
          existingBehavior = ExistingFileBehavior.APPEND;
        }
        ExistingFileBehavior existingBehavior = overwrite.isPresent()
            ? ExistingFileBehavior.OVERWRITE
            : ExistingFileBehavior.APPEND;
        importConfig.writeSkippedEntries(skipFile.getValue(),
                                          existingBehavior);
@@ -1353,18 +1198,16 @@
    }
    catch (DirectoryException de)
    {
      LocalizableMessage message = null;
      LocalizableMessage msg;
      if (de.getResultCode() == ResultCode.CONSTRAINT_VIOLATION)
      {
        message =
            ERR_LDIFIMPORT_ERROR_DURING_IMPORT
                .get(ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get());
        msg = ERR_LDIFIMPORT_ERROR_CONSTRAINT_VIOLATION.get();
      }
      else
      {
        message = ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(de.getMessageObject());
        msg = de.getMessageObject();
      }
      logger.error(message);
      logger.error(ERR_LDIFIMPORT_ERROR_DURING_IMPORT.get(msg));
      retCode = 1;
    }
    catch (Exception e)
@@ -1397,6 +1240,69 @@
    return retCode;
  }
  private Object getMessage(Exception e)
  {
    try
    {
      throw e;
    }
    catch (ConfigException e2)
    {
      return e2.getMessage();
    }
    catch (InitializationException e2)
    {
      return e2.getMessage();
    }
    catch (Exception e2)
    {
      return getExceptionMessage(e2);
    }
  }
  private boolean useBackend(Set<DN> includeBranches, List<DN> dnlist)
  {
    for (DN baseDN : dnlist)
    {
      for (DN includeDN : includeBranches)
      {
        if (baseDN.isAncestorOf(includeDN))
        {
          return true;
        }
      }
    }
    return false;
  }
  private StringBuilder join(final DN[] baseDNs, final String separator)
  {
    final StringBuilder builder = new StringBuilder();
    builder.append(baseDNs[0].toString());
    for (int i = 1; i < baseDNs.length; i++)
    {
      builder.append(separator);
      builder.append(baseDNs[i].toString());
    }
    return builder;
  }
  private Random newRandom()
  {
    if (randomSeed.isPresent())
    {
      try
      {
        return new Random(randomSeed.getIntValue());
      }
      catch (Exception ignored)
      {
        // ignore
      }
    }
    return new Random();
  }
  /** {@inheritDoc} */
  @Override
  public String getTaskId() {
opendj3-server-dev/src/server/org/opends/server/types/LDIFImportConfig.java
@@ -22,20 +22,21 @@
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 *      Portions Copyright 2012-2014 ForgeRock AS
 *      Portions Copyright 2012-2015 ForgeRock AS
 */
package org.opends.server.types;
import static org.opends.messages.UtilityMessages.*;
import java.io.*;
import java.util.*;
import java.util.zip.GZIPInputStream;
import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1;
import org.opends.server.tools.makeldif.MakeLDIFInputStream;
import org.opends.server.tools.makeldif.TemplateFile;
import org.opends.server.util.StaticUtils;
import static org.opends.messages.UtilityMessages.*;
/**
 * This class defines a data structure for holding configuration
 * information to use when performing an LDIF import.
@@ -49,99 +50,79 @@
                                    implements Closeable
{
  /**
   * The default buffer size that will be used when reading LDIF data.
   */
  /** The default buffer size that will be used when reading LDIF data. */
  private static final int DEFAULT_BUFFER_SIZE = 8192;
  // Indicates whether to append to the existing data set rather than
  // replacing it.
  /**
   * Indicates whether to append to the existing data set rather than
   * replacing it.
   */
  private boolean appendToExistingData;
  // Indicates whether to include the objectclasses in the entries
  // read from the import.
  private boolean includeObjectClasses;
  /**
   * Indicates whether to include the objectclasses in the entries
   * read from the import.
   */
  private boolean includeObjectClasses = true;
  // Indicates whether to invoke LDIF import plugins whenever an entry
  // is read.
  /** Indicates whether to invoke LDIF import plugins whenever an entry is read. */
  private boolean invokeImportPlugins;
  // Indicates whether the import is compressed.
  /** Indicates whether the import is compressed. */
  private boolean isCompressed;
  // Indicates whether the import is encrypted.
  /** Indicates whether the import is encrypted. */
  private boolean isEncrypted;
  // Indicates whether to clear all base DNs in a backend.
  /** Indicates whether to clear all base DNs in a backend. */
  private boolean clearBackend;
  // Indicates whether to replace existing entries when appending
  // data.
  /** Indicates whether to replace existing entries when appending data. */
  private boolean replaceExistingEntries;
  /** Indicates whether to perform schema validation on the entries read. */
  private boolean validateSchema = true;
  // Indicates whether to perform schema validation on the entries
  // read.
  private boolean validateSchema;
  // The buffered reader from which the LDIF data should be read.
  /** The buffered reader from which the LDIF data should be read. */
  private BufferedReader reader;
  // The buffered writer to which rejected entries should be written.
  /** The buffered writer to which rejected entries should be written. */
  private BufferedWriter rejectWriter;
  // The buffered writer to which rejected entries should be written.
  /** The buffered writer to which rejected entries should be written. */
  private BufferedWriter skipWriter;
  // The input stream to use to read the data to import.
  /** The input stream to use to read the data to import. */
  private InputStream ldifInputStream;
  // The buffer size to use when reading data from the LDIF file.
  private int bufferSize;
  /** The buffer size to use when reading data from the LDIF file. */
  private int bufferSize = DEFAULT_BUFFER_SIZE;
  // The iterator used to read through the set of LDIF files.
  /** The iterator used to read through the set of LDIF files. */
  private Iterator<String> ldifFileIterator;
  // The set of base DNs to exclude from the import.
  private List<DN> excludeBranches;
  /** The set of base DNs to exclude from the import. */
  private Set<DN> excludeBranches = new HashSet<DN>(0);
  /** The set of base DNs to include from the import. */
  private Set<DN> includeBranches = new HashSet<DN>(0);
  // The set of base DNs to include from the import.
  private List<DN> includeBranches;
  /** The set of search filters for entries to exclude from the import. */
  private List<SearchFilter> excludeFilters = new ArrayList<SearchFilter>(0);
  /** The set of search filters for entries to include in the import. */
  private List<SearchFilter> includeFilters = new ArrayList<SearchFilter>(0);
  // The set of search filters for entries to exclude from the import.
  private List<SearchFilter> excludeFilters;
  // The set of search filters for entries to include in the import.
  private List<SearchFilter> includeFilters;
  // The set of LDIF files to be imported.
  /** The set of LDIF files to be imported. */
  private List<String> ldifFiles;
  // The set of attribute types that should be excluded from the
  // import.
  private Set<AttributeType> excludeAttributes;
  /** The set of attribute types that should be excluded from the import. */
  private Set<AttributeType> excludeAttributes = new HashSet<AttributeType>(0);
  /** The set of attribute types that should be included in the import. */
  private Set<AttributeType> includeAttributes = new HashSet<AttributeType>(0);
  // The set of attribute types that should be included in the import.
  private Set<AttributeType> includeAttributes;
  // Indicates whether all the user attributes should be included.
  /** Indicates whether all the user attributes should be included. */
  private boolean includeAllUserAttrs;
  //Indicates whether all the operational attributes should be
  // included.
  /** Indicates whether all the operational attributes should be included. */
  private boolean includeAllOpAttrs;
  //Indicates whether all the user attributes should be excluded.
  /** Indicates whether all the user attributes should be excluded. */
  private boolean excludeAllUserAttrs;
  //Indicates whether all the operational attributes should be
  // excluded.
  /** Indicates whether all the operational attributes should be excluded. */
  private boolean excludeAllOpAttrs;
  private String tmpDirectory;
  private boolean skipDNValidation = false;
  private int threadCount = 0;
  private boolean skipDNValidation;
  private int threadCount;
  /**
@@ -156,35 +137,8 @@
    ldifFiles = new ArrayList<String>(1);
    ldifFiles.add(ldifFile);
    ldifFileIterator = ldifFiles.iterator();
    ldifInputStream        = null;
    bufferSize             = DEFAULT_BUFFER_SIZE;
    excludeBranches        = new ArrayList<DN>();
    includeBranches        = new ArrayList<DN>();
    excludeFilters         = new ArrayList<SearchFilter>();
    includeFilters         = new ArrayList<SearchFilter>();
    appendToExistingData   = false;
    replaceExistingEntries = false;
    includeObjectClasses   = true;
    invokeImportPlugins    = false;
    isCompressed           = false;
    isEncrypted            = false;
    clearBackend           = false;
    validateSchema         = true;
    reader                 = null;
    rejectWriter           = null;
    skipWriter             = null;
    excludeAttributes      = new HashSet<AttributeType>();
    includeAttributes      = new HashSet<AttributeType>();
    includeAllUserAttrs    = false;
    includeAllOpAttrs      = false;
    excludeAllUserAttrs    = false;
    excludeAllOpAttrs      = false;
  }
  /**
   * Creates a new LDIF import configuration that will read from the
   * specified LDIF files.  The files will be imported in the order
@@ -197,34 +151,8 @@
  {
    this.ldifFiles = ldifFiles;
    ldifFileIterator = ldifFiles.iterator();
    ldifInputStream        = null;
    bufferSize             = DEFAULT_BUFFER_SIZE;
    excludeBranches        = new ArrayList<DN>();
    includeBranches        = new ArrayList<DN>();
    excludeFilters         = new ArrayList<SearchFilter>();
    includeFilters         = new ArrayList<SearchFilter>();
    appendToExistingData   = false;
    replaceExistingEntries = false;
    includeObjectClasses   = true;
    invokeImportPlugins    = false;
    isCompressed           = false;
    isEncrypted            = false;
    validateSchema         = true;
    reader                 = null;
    rejectWriter           = null;
    skipWriter             = null;
    excludeAttributes      = new HashSet<AttributeType>();
    includeAttributes      = new HashSet<AttributeType>();
    includeAllUserAttrs    = false;
    includeAllOpAttrs      = false;
    excludeAllUserAttrs    = false;
    excludeAllOpAttrs      = false;
  }
  /**
   * Creates a new LDIF import configuration that will read from the
   * provided input stream.
@@ -235,31 +163,6 @@
  public LDIFImportConfig(InputStream ldifInputStream)
  {
    this.ldifInputStream   = ldifInputStream;
    bufferSize             = DEFAULT_BUFFER_SIZE;
    ldifFiles              = null;
    ldifFileIterator       = null;
    excludeBranches        = new ArrayList<DN>();
    includeBranches        = new ArrayList<DN>();
    excludeFilters         = new ArrayList<SearchFilter>();
    includeFilters         = new ArrayList<SearchFilter>();
    appendToExistingData   = false;
    replaceExistingEntries = false;
    includeObjectClasses   = true;
    invokeImportPlugins    = false;
    isCompressed           = false;
    isEncrypted            = false;
    validateSchema         = true;
    reader                 = null;
    rejectWriter           = null;
    skipWriter             = null;
    excludeAttributes      = new HashSet<AttributeType>();
    includeAttributes      = new HashSet<AttributeType>();
    includeAllUserAttrs    = false;
    includeAllOpAttrs      = false;
    excludeAllUserAttrs    = false;
    excludeAllOpAttrs      = false;
  }
  /**
@@ -271,32 +174,7 @@
   */
  public LDIFImportConfig(Reader ldifInputReader)
  {
    ldifInputStream        = null;
    bufferSize             = DEFAULT_BUFFER_SIZE;
    ldifFiles              = null;
    ldifFileIterator       = null;
    excludeBranches        = new ArrayList<DN>();
    includeBranches        = new ArrayList<DN>();
    excludeFilters         = new ArrayList<SearchFilter>();
    includeFilters         = new ArrayList<SearchFilter>();
    appendToExistingData   = false;
    replaceExistingEntries = false;
    includeObjectClasses   = true;
    invokeImportPlugins    = false;
    isCompressed           = false;
    isEncrypted            = false;
    validateSchema         = true;
    reader                 = getBufferedReader(ldifInputReader);
    rejectWriter           = null;
    skipWriter             = null;
    excludeAttributes      = new HashSet<AttributeType>();
    includeAttributes      = new HashSet<AttributeType>();
    includeAllUserAttrs    = false;
    includeAllOpAttrs      = false;
    excludeAllUserAttrs    = false;
    excludeAllOpAttrs      = false;
  }
  /**
@@ -324,8 +202,6 @@
  public LDIFImportConfig(TemplateFile templateFile)
  {
    this(new MakeLDIFInputStream(templateFile));
  }
@@ -347,14 +223,14 @@
    if (reader == null)
    {
      InputStream inputStream;
      if (ldifInputStream == null)
      if (ldifInputStream != null)
      {
        inputStream = ldifInputStream =
             new FileInputStream(ldifFileIterator.next());
        inputStream = ldifInputStream;
      }
      else
      {
        inputStream = ldifInputStream;
        inputStream = ldifInputStream =
             new FileInputStream(ldifFileIterator.next());
      }
      if (isEncrypted)
@@ -384,13 +260,12 @@
   * @return  The reader that should be used to read the LDIF data, or
   *          <CODE>null</CODE> if there are no more files to read.
   *
   * @throws  IOException  If a problem occurs while obtaining the
   *                       reader.
   * @throws  IOException  If a problem occurs while obtaining the reader.
   */
  public BufferedReader nextReader()
         throws IOException
  {
    if ((ldifFileIterator == null) || (! ldifFileIterator.hasNext()))
    if (ldifFileIterator == null || !ldifFileIterator.hasNext())
    {
      return null;
    }
@@ -420,8 +295,7 @@
   * Retrieves the writer that should be used to write entries that
   * are rejected rather than imported for some reason.
   *
   * @return  The reject writer, or <CODE>null</CODE> if none is to be
   *          used.
   * @return  The reject writer, or <CODE>null</CODE> if none is to be used.
   */
  public BufferedWriter getRejectWriter()
  {
@@ -430,10 +304,9 @@
  /**
   * Retrieves the writer that should be used to write entries that
   * are skipped because they don't match the criteri.
   * are skipped because they don't match the criteria.
   *
   * @return  The skip writer, or <CODE>null</CODE> if none is to be
   *          used.
   * @return  The skip writer, or <CODE>null</CODE> if none is to be used.
   */
  public BufferedWriter getSkipWriter()
  {
@@ -448,10 +321,8 @@
   * rejected because they matched exclude criteria.
   *
   * @param  rejectFile            The path to the file to which
   *                               reject information should be
   *                               written.
   * @param  existingFileBehavior  Indicates how to treat an existing
   *                               file.
   *                               reject information should be written.
   * @param  existingFileBehavior  Indicates how to treat an existing file.
   *
   * @throws  IOException  If a problem occurs while opening the
   *                       reject file for writing.
@@ -462,43 +333,38 @@
  {
    if (rejectFile == null)
    {
      if (rejectWriter != null)
      {
        StaticUtils.close(rejectWriter);
        rejectWriter = null;
      }
      closeRejectWriter();
      return;
    }
    final BufferedWriter writer = newBufferedWriter(rejectFile, existingFileBehavior, ERR_REJECT_FILE_EXISTS);
    if (writer != null)
    {
      rejectWriter = writer;
    }
  }
  private BufferedWriter newBufferedWriter(String file, ExistingFileBehavior existingFileBehavior,
      Arg1<Object> fileExistsErrorMsg) throws IOException
  {
    switch (existingFileBehavior)
    {
      case APPEND:
        rejectWriter =
             new BufferedWriter(new FileWriter(rejectFile, true));
        break;
      return new BufferedWriter(new FileWriter(file, true));
      case OVERWRITE:
        rejectWriter =
             new BufferedWriter(new FileWriter(rejectFile, false));
        break;
      return new BufferedWriter(new FileWriter(file, false));
      case FAIL:
        File f = new File(rejectFile);
      File f = new File(file);
        if (f.exists())
        {
          throw new IOException(
                  ERR_REJECT_FILE_EXISTS.get(rejectFile).toString());
        throw new IOException(fileExistsErrorMsg.get(file).toString());
        }
        else
        {
          rejectWriter =
               new BufferedWriter(new FileWriter(rejectFile));
        }
        break;
      return new BufferedWriter(new FileWriter(file));
    default:
      return null;
    }
  }
  /**
   * Indicates that rejected entries should be written to the provided
   * output stream.  Note that this applies only to entries that are
@@ -513,12 +379,7 @@
  {
    if (outputStream == null)
    {
      if (rejectWriter != null)
      {
        StaticUtils.close(rejectWriter);
        rejectWriter = null;
      }
      closeRejectWriter();
      return;
    }
@@ -526,16 +387,23 @@
         new BufferedWriter(new OutputStreamWriter(outputStream));
  }
  private void closeRejectWriter()
  {
    if (rejectWriter != null)
    {
      StaticUtils.close(rejectWriter);
      rejectWriter = null;
    }
  }
  /**
   * Indicates that skipped entries should be written to the
   * specified file.  Note that this applies only to entries that are
   * skipped because they matched exclude criteria.
   *
   * @param  skipFile              The path to the file to which
   *                               skipped information should be
   *                               written.
   * @param  existingFileBehavior  Indicates how to treat an existing
   *                               file.
   *                               skipped information should be written.
   * @param  existingFileBehavior  Indicates how to treat an existing file.
   *
   * @throws  IOException  If a problem occurs while opening the
   *                       skip file for writing.
@@ -546,43 +414,26 @@
  {
    if (skipFile == null)
    {
      closeSkipWriter();
      return;
    }
    final BufferedWriter writer = newBufferedWriter(skipFile, existingFileBehavior, ERR_SKIP_FILE_EXISTS);
    if (writer != null)
    {
      skipWriter = writer;
    }
  }
  private void closeSkipWriter()
  {
      if (skipWriter != null)
      {
        StaticUtils.close(skipWriter);
        skipWriter = null;
      }
      return;
    }
    switch (existingFileBehavior)
    {
      case APPEND:
        skipWriter =
             new BufferedWriter(new FileWriter(skipFile, true));
        break;
      case OVERWRITE:
        skipWriter =
             new BufferedWriter(new FileWriter(skipFile, false));
        break;
      case FAIL:
        File f = new File(skipFile);
        if (f.exists())
        {
          throw new IOException(
                  ERR_SKIP_FILE_EXISTS.get(skipFile).toString());
        }
        else
        {
          skipWriter =
               new BufferedWriter(new FileWriter(skipFile));
        }
        break;
    }
  }
  /**
   * Indicates that skipped entries should be written to the provided
   * output stream.  Note that this does not apply to entries that are
@@ -597,12 +448,7 @@
  {
    if (outputStream == null)
    {
      if (skipWriter != null)
      {
        StaticUtils.close(skipWriter);
        skipWriter = null;
      }
      closeSkipWriter();
      return;
    }
    skipWriter =
@@ -664,8 +510,7 @@
   *                                 existing entry if a duplicate is
   *                                 found or to reject the new entry.
   */
  public void setReplaceExistingEntries(
                   boolean replaceExistingEntries)
  public void setReplaceExistingEntries(boolean replaceExistingEntries)
  {
    this.replaceExistingEntries = replaceExistingEntries;
  }
@@ -826,7 +671,7 @@
   * @return  The set of base DNs that specify the set of entries to
   *          exclude from the import.
   */
  public List<DN> getExcludeBranches()
  public Set<DN> getExcludeBranches()
  {
    return excludeBranches;
  }
@@ -840,18 +685,15 @@
   * @param  excludeBranches  The set of base DNs that specify the set
   *                          of entries to exclude from the import.
   */
  public void setExcludeBranches(List<DN> excludeBranches)
  public void setExcludeBranches(Set<DN> excludeBranches)
  {
    if (excludeBranches == null)
    {
      this.excludeBranches = new ArrayList<DN>(0);
    }
    else
    {
      this.excludeBranches = excludeBranches;
    }
    this.excludeBranches = getSet(excludeBranches);
  }
  private <T> Set<T> getSet(Set<T> set)
  {
    return set != null ? set : new HashSet<T>(0);
  }
  /**
@@ -862,7 +704,7 @@
   * @return  The set of base DNs that specify the set of entries to
   *          include in the import.
   */
  public List<DN> getIncludeBranches()
  public Set<DN> getIncludeBranches()
  {
    return includeBranches;
  }
@@ -876,19 +718,10 @@
   * @param  includeBranches  The set of base DNs that specify the set
   *                          of entries to include in the import.
   */
  public void setIncludeBranches(List<DN> includeBranches)
  public void setIncludeBranches(Set<DN> includeBranches)
  {
    if (includeBranches == null)
    {
      this.includeBranches = new ArrayList<DN>(0);
    this.includeBranches = getSet(includeBranches);
    }
    else
    {
      this.includeBranches = includeBranches;
    }
  }
  /**
   * Indicates whether to include the entry with the specified DN in
@@ -985,20 +818,10 @@
   *                            excluded from the entries read from
   *                            the LDIF.
   */
  public void setExcludeAttributes(
                   Set<AttributeType> excludeAttributes)
  public void setExcludeAttributes(Set<AttributeType> excludeAttributes)
  {
    if (excludeAttributes == null)
    {
      this.excludeAttributes = new HashSet<AttributeType>(0);
    this.excludeAttributes = getSet(excludeAttributes);
    }
    else
    {
      this.excludeAttributes = excludeAttributes;
    }
  }
  /**
   * Retrieves the set of attributes that should be included in the
@@ -1023,20 +846,10 @@
   *                            included in the entries read from the
   *                            LDIF.
   */
  public void setIncludeAttributes(
                   Set<AttributeType> includeAttributes)
  public void setIncludeAttributes(Set<AttributeType> includeAttributes)
  {
    if (includeAttributes == null)
    {
      this.includeAttributes = new HashSet<AttributeType>(0);
    this.includeAttributes = getSet(includeAttributes);
    }
    else
    {
      this.includeAttributes = includeAttributes;
    }
  }
  /**
   * Indicates whether the specified attribute should be included in
@@ -1051,20 +864,20 @@
   */
  public boolean includeAttribute(AttributeType attributeType)
  {
    if ((! excludeAttributes.isEmpty()) &&
        excludeAttributes.contains(attributeType))
    if (!excludeAttributes.isEmpty()
        && excludeAttributes.contains(attributeType))
    {
      return false;
    }
     if(excludeAllOpAttrs && attributeType.isOperational() ||
      excludeAllUserAttrs && !attributeType.isOperational())
     if((excludeAllOpAttrs && attributeType.isOperational())
         || (excludeAllUserAttrs && !attributeType.isOperational()))
    {
      return false;
    }
    if(includeAllUserAttrs && !attributeType.isOperational() ||
           includeAllOpAttrs && attributeType.isOperational())
    if((includeAllUserAttrs && !attributeType.isOperational())
        || (includeAllOpAttrs && attributeType.isOperational()))
    {
      return true;
    }
@@ -1073,14 +886,11 @@
    {
      return includeAttributes.contains(attributeType);
    }
    else
    {
       if(includeAllUserAttrs && attributeType.isOperational() ||
               includeAllOpAttrs && !attributeType.isOperational())
    else if((includeAllUserAttrs && attributeType.isOperational())
        || (includeAllOpAttrs && !attributeType.isOperational()))
       {
         return false;
       }
    }
    return true;
  }
@@ -1111,17 +921,8 @@
   */
  public void setExcludeFilters(List<SearchFilter> excludeFilters)
  {
    if (excludeFilters == null)
    {
      this.excludeFilters = new ArrayList<SearchFilter>(0);
    this.excludeFilters = getList(excludeFilters);
    }
    else
    {
      this.excludeFilters = excludeFilters;
    }
  }
  /**
   * Retrieves the set of search filters that should be used to
@@ -1148,17 +949,13 @@
   */
  public void setIncludeFilters(List<SearchFilter> includeFilters)
  {
    if (includeFilters == null)
    {
      this.includeFilters = new ArrayList<SearchFilter>(0);
    }
    else
    {
      this.includeFilters = includeFilters;
    }
    this.includeFilters = getList(includeFilters);
  }
  private <T> List<T> getList(List<T> list)
  {
    return list != null ? list : new ArrayList<T>(0);
  }
  /**
   * Indicates whether the specified entry should be included in the
@@ -1255,8 +1052,7 @@
   *                            operational attributes
   *                            should be excluded.
   */
  public void setExcludeAllOperationalAttributes(
                                    boolean excludeAllOpAttrs)
  public void setExcludeAllOperationalAttributes(boolean excludeAllOpAttrs)
  {
    this.excludeAllOpAttrs = excludeAllOpAttrs;
  }
@@ -1292,9 +1088,7 @@
  /**
   * Closes any resources that this import config might have open.
   */
  /** Closes any resources that this import config might have open. */
  @Override
  public void close()
  {
@@ -1362,4 +1156,3 @@
    return this.threadCount;
  }
}
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/backends/jeb/TestImportJob.java
@@ -33,6 +33,8 @@
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Set;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.TestCaseUtils;
@@ -375,10 +377,8 @@
    fileList.add(homeDirName + File.separator + "top.ldif");
    fileList.add(homeDirName + File.separator + "entries1.ldif");
    ArrayList<DN> includeBranches = new ArrayList<DN>();
    includeBranches.add(DN.valueOf("ou=People,dc=importtest,dc=com"));
    ArrayList<DN> excludeBranches = new ArrayList<DN>();
    excludeBranches.add(DN.valueOf("ou=Others,ou=People,dc=importtest,dc=com"));
    Set<DN> includeBranches = Collections.singleton(DN.valueOf("ou=People,dc=importtest,dc=com"));
    Set<DN> excludeBranches = Collections.singleton(DN.valueOf("ou=Others,ou=People,dc=importtest,dc=com"));
    ByteArrayOutputStream rejectedEntries = new ByteArrayOutputStream();
    ByteArrayOutputStream skippedEntries = new ByteArrayOutputStream();
@@ -601,8 +601,7 @@
  @Test(dependsOnMethods = "testImportPartial")
  public void testImportSkip() throws Exception
  {
    ArrayList<DN> excludeBranches = new ArrayList<DN>();
    excludeBranches.add(DN.valueOf("dc=skipped,dc=importtest1,dc=com"));
    Set<DN> excludeBranches = Collections.singleton(DN.valueOf("dc=skipped,dc=importtest1,dc=com"));
    ByteArrayOutputStream skippedEntries = new ByteArrayOutputStream();
    LDIFImportConfig importConfig = new LDIFImportConfig(homeDirName
        + File.separator + "skipped.ldif");