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

Jean-Noël Rouvignac
19.03.2016 17ec2cfa9d04e6942a694ab5c3778ac26f17bb35
opendj-server-legacy/src/main/java/org/opends/server/backends/LDIFBackend.java
@@ -22,6 +22,7 @@
import static org.opends.server.util.StaticUtils.*;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -36,12 +37,12 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.config.server.ConfigurationChangeListener;
import org.forgerock.opendj.ldap.ConditionResult;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.config.server.ConfigurationChangeListener;
import org.forgerock.opendj.server.config.server.LDIFBackendCfg;
import org.opends.server.api.AlertGenerator;
import org.opends.server.api.Backend;
@@ -84,8 +85,6 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The base DNs for this backend. */
  private Set<DN> baseDNs;
@@ -117,7 +116,6 @@
  {
  }
  /** {@inheritDoc} */
  @Override
  public void openBackend()
         throws ConfigException, InitializationException
@@ -152,8 +150,6 @@
    readLDIF();
  }
  /**
   * Reads the contents of the LDIF backing file into memory.
   *
@@ -178,7 +174,6 @@
      return;
    }
    try
    {
      importLDIF(new LDIFImportConfig(ldifFile.getAbsolutePath()), false);
@@ -189,8 +184,6 @@
    }
  }
  /**
   * Writes the current set of entries to the target LDIF file.  The new LDIF
   * will first be created as a temporary file and then renamed into place.  The
@@ -207,7 +200,6 @@
    File tempFile = new File(ldifFile.getAbsolutePath() + ".new");
    File oldFile  = new File(ldifFile.getAbsolutePath() + ".old");
    // Write the new data to a temporary file.
    LDIFWriter writer;
    try
@@ -231,7 +223,6 @@
                                   m, e);
    }
    for (Entry entry : entryMap.values())
    {
      try
@@ -332,7 +323,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void closeBackend()
  {
@@ -387,7 +377,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public boolean isIndexed(AttributeType attributeType, IndexType indexType)
  {
@@ -395,7 +384,6 @@
    return true;
  }
  /** {@inheritDoc} */
  @Override
  public ConditionResult hasSubordinates(DN entryDN)
         throws DirectoryException
@@ -430,7 +418,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public long getNumberOfChildren(DN parentDN) throws DirectoryException
  {
@@ -438,7 +425,6 @@
    return getNumberOfSubordinates(parentDN, false);
  }
  /** {@inheritDoc} */
  @Override
  public long getNumberOfEntriesInBaseDN(DN baseDN) throws DirectoryException
  {
@@ -490,7 +476,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public Entry getEntry(DN entryDN)
  {
@@ -506,7 +491,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public boolean entryExists(DN entryDN)
  {
@@ -522,7 +506,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void addEntry(Entry entry, AddOperation addOperation)
         throws DirectoryException
@@ -565,27 +548,8 @@
        }
        else
        {
          DN matchedDN = null;
          if (parentDN != null)
          {
            while (true)
            {
              parentDN = DirectoryServer.getParentDNInSuffix(parentDN);
              if (parentDN == null)
              {
                break;
              }
              if (entryMap.containsKey(parentDN))
              {
                matchedDN = parentDN;
                break;
              }
            }
          }
          LocalizableMessage m = ERR_LDIF_BACKEND_ADD_MISSING_PARENT.get(entryDN);
          throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, m, matchedDN, null);
          throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, m, findMatchedDN(parentDN), null);
        }
      }
    }
@@ -595,7 +559,26 @@
    }
  }
  /** {@inheritDoc} */
  private DN findMatchedDN(DN parentDN)
  {
    if (parentDN != null)
    {
      while (true)
      {
        parentDN = DirectoryServer.getParentDNInSuffix(parentDN);
        if (parentDN == null)
        {
          return null;
        }
        else if (entryMap.containsKey(parentDN))
        {
          return parentDN;
        }
      }
    }
    return null;
  }
  @Override
  public void deleteEntry(DN entryDN, DeleteOperation deleteOperation)
         throws DirectoryException
@@ -628,7 +611,6 @@
        throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, m, matchedDN, null);
      }
      // See if the target entry has any children.  If so, then we'll only
      // delete it if the request contains the subtree delete control (in
      // which case we'll delete the entire subtree).
@@ -693,8 +675,6 @@
    }
  }
  /**
   * Removes the specified entry and any subordinates that it may have from
   * the backend.  This method assumes that the caller holds the backend write
@@ -716,7 +696,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void replaceEntry(Entry oldEntry, Entry newEntry,
      ModifyOperation modifyOperation) throws DirectoryException
@@ -756,7 +735,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void renameEntry(DN currentDN, Entry entry,
                          ModifyDNOperation modifyDNOperation)
@@ -823,7 +801,6 @@
      }
      parentChildDNs.add(newDN);
      // If the entry has children, then we'll need to work on the whole
      // subtree.  Otherwise, just work on the target entry.
      Set<DN> childDNSet = childDNs.remove(currentDN);
@@ -844,8 +821,6 @@
    }
  }
  /**
   * Moves the specified entry and all of its children so that they are
   * appropriately placed below the given new parent DN.  This method assumes
@@ -893,7 +868,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void search(SearchOperation searchOperation)
         throws DirectoryException
@@ -907,7 +881,6 @@
      SearchScope  scope  = searchOperation.getScope();
      SearchFilter filter = searchOperation.getFilter();
      // Make sure the base entry exists if it's supposed to be in this backend.
      Entry baseEntry = entryMap.get(baseDN);
      if (baseEntry == null && handlesEntry(baseDN))
@@ -961,21 +934,18 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public Set<String> getSupportedControls()
  {
    return supportedControls;
  }
  /** {@inheritDoc} */
  @Override
  public Set<String> getSupportedFeatures()
  {
    return Collections.emptySet();
  }
  /** {@inheritDoc} */
  @Override
  public boolean supports(BackendOperation backendOperation)
  {
@@ -990,53 +960,33 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public void exportLDIF(LDIFExportConfig exportConfig)
         throws DirectoryException
  {
    backendLock.readLock().lock();
    try
    try (LDIFWriter ldifWriter = newLDIFWriter(exportConfig))
    {
      // Create the LDIF writer.
      LDIFWriter ldifWriter;
      try
      {
        ldifWriter = new LDIFWriter(exportConfig);
      }
      catch (Exception e)
      {
        logger.traceException(e);
        LocalizableMessage m = ERR_LDIF_BACKEND_CANNOT_CREATE_LDIF_WRITER.get(
                         stackTraceToSingleLineString(e));
        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                     m, e);
      }
      // Walk through all the entries and write them to LDIF.
      DN entryDN = null;
      try
      for (Entry entry : entryMap.values())
      {
        for (Entry entry : entryMap.values())
        DN entryDN = entry.getName();
        try
        {
          entryDN = entry.getName();
          ldifWriter.writeEntry(entry);
        }
        catch (Exception e)
        {
          LocalizableMessage m =
              ERR_LDIF_BACKEND_CANNOT_WRITE_ENTRY_TO_LDIF.get(entryDN, stackTraceToSingleLineString(e));
          throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), m, e);
        }
      }
      catch (Exception e)
      {
        LocalizableMessage m = ERR_LDIF_BACKEND_CANNOT_WRITE_ENTRY_TO_LDIF.get(
            entryDN, stackTraceToSingleLineString(e));
        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                     m, e);
      }
      finally
      {
        StaticUtils.close(ldifWriter);
      }
    }
    catch (IOException ignoreOnClose)
    {
      logger.traceException(ignoreOnClose);
    }
    finally
    {
@@ -1044,7 +994,20 @@
    }
  }
  /** {@inheritDoc} */
  private LDIFWriter newLDIFWriter(LDIFExportConfig exportConfig) throws DirectoryException
  {
    try
    {
      return new LDIFWriter(exportConfig);
    }
    catch (Exception e)
    {
      logger.traceException(e);
      LocalizableMessage m = ERR_LDIF_BACKEND_CANNOT_CREATE_LDIF_WRITER.get(stackTraceToSingleLineString(e));
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), m, e);
    }
  }
  @Override
  public LDIFImportResult importLDIF(LDIFImportConfig importConfig, ServerContext serverContext)
      throws DirectoryException
@@ -1068,25 +1031,11 @@
  {
    backendLock.writeLock().lock();
    try
    try (LDIFReader reader = newLDIFReader(importConfig))
    {
      LDIFReader reader;
      try
      {
        reader = new LDIFReader(importConfig);
      }
      catch (Exception e)
      {
        LocalizableMessage m = ERR_LDIF_BACKEND_CANNOT_CREATE_LDIF_READER.get(
                         stackTraceToSingleLineString(e));
        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                     m, e);
      }
      entryMap.clear();
      childDNs.clear();
      try
      {
        while (true)
@@ -1109,10 +1058,7 @@
              throw new DirectoryException(
                             DirectoryServer.getServerErrorResultCode(), m, le);
            }
            else
            {
              continue;
            }
            continue;
          }
          // Make sure that we don't already have an entry with the same DN.  If
@@ -1127,7 +1073,6 @@
            continue;
          }
          // If the entry DN is a base DN, then add it with no more processing.
          if (baseDNs.contains(entryDN))
          {
@@ -1135,19 +1080,8 @@
            continue;
          }
          // Make sure that the parent exists.  If not, then reject the entry.
          boolean isBelowBaseDN = false;
          for (DN baseDN : baseDNs)
          {
            if (baseDN.isSuperiorOrEqualTo(entryDN))
            {
              isBelowBaseDN = true;
              break;
            }
          }
          if (! isBelowBaseDN)
          if (!isBelowBaseDN(entryDN))
          {
            LocalizableMessage m = ERR_LDIF_BACKEND_ENTRY_OUT_OF_SCOPE.get(
                ldifFilePath, currentConfig.dn(), entryDN);
@@ -1166,7 +1100,6 @@
            continue;
          }
          // The entry does not exist but its parent does, so add it and update
          // the set of children for the parent.
          entryMap.put(entryDN, e);
@@ -1181,7 +1114,6 @@
          childDNSet.add(entryDN);
        }
        if (writeLDIF)
        {
          writeLDIF();
@@ -1197,14 +1129,8 @@
      }
      catch (Exception e)
      {
        LocalizableMessage m = ERR_LDIF_BACKEND_ERROR_READING_LDIF.get(
                         stackTraceToSingleLineString(e));
        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(),
                                     m, e);
      }
      finally
      {
        StaticUtils.close(reader);
        LocalizableMessage m = ERR_LDIF_BACKEND_ERROR_READING_LDIF.get(stackTraceToSingleLineString(e));
        throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), m, e);
      }
    }
    finally
@@ -1213,7 +1139,31 @@
    }
  }
  /** {@inheritDoc} */
  private boolean isBelowBaseDN(DN entryDN)
  {
    for (DN baseDN : baseDNs)
    {
      if (baseDN.isSuperiorOrEqualTo(entryDN))
      {
        return true;
      }
    }
    return false;
  }
  private LDIFReader newLDIFReader(LDIFImportConfig importConfig) throws DirectoryException
  {
    try
    {
      return new LDIFReader(importConfig);
    }
    catch (Exception e)
    {
      LocalizableMessage m = ERR_LDIF_BACKEND_CANNOT_CREATE_LDIF_READER.get(stackTraceToSingleLineString(e));
      throw new DirectoryException(DirectoryServer.getServerErrorResultCode(), m, e);
    }
  }
  @Override
  public void createBackup(BackupConfig backupConfig)
         throws DirectoryException
@@ -1222,7 +1172,6 @@
    throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
  }
  /** {@inheritDoc} */
  @Override
  public void removeBackup(BackupDirectory backupDirectory, String backupID)
         throws DirectoryException
@@ -1231,7 +1180,6 @@
    throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
  }
  /** {@inheritDoc} */
  @Override
  public void restoreBackup(RestoreConfig restoreConfig)
         throws DirectoryException
@@ -1240,7 +1188,6 @@
    throw new DirectoryException(ResultCode.UNWILLING_TO_PERFORM, message);
  }
  /** {@inheritDoc} */
  @Override
  public void configureBackend(LDIFBackendCfg config, ServerContext serverContext) throws ConfigException
  {
@@ -1259,7 +1206,6 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public boolean isConfigurationChangeAcceptable(LDIFBackendCfg configuration,
                      List<LocalizableMessage> unacceptableReasons)
@@ -1276,7 +1222,6 @@
    return configAcceptable;
  }
  /** {@inheritDoc} */
  @Override
  public ConfigChangeResult applyConfigurationChange(
                                 LDIFBackendCfg configuration)
@@ -1307,21 +1252,18 @@
    return ccr;
  }
  /** {@inheritDoc} */
  @Override
  public DN getComponentEntryDN()
  {
    return currentConfig.dn();
  }
  /** {@inheritDoc} */
  @Override
  public String getClassName()
  {
    return LDIFBackend.class.getName();
  }
  /** {@inheritDoc} */
  @Override
  public Map<String,String> getAlerts()
  {