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

Jean-Noel Rouvignac
27.00.2015 061cfa8f64566b1a8661fd4bc2df87dfcaa41866
OPENDJ-1716 Various PluggableBackend/Storage refactorings
Code review: Nicolas Capponi


Reenabled checkstyle for the pluggable package.
Fixed checkstyle errors + added javadocs.

EntryContainer.java:
Removed unneeded getStorage().
In deleteAttributeIndex(), removed unused ConfigChangeResult parameter.

build.xml:
Enabled checkstyle for pluggable package.
13 files modified
227 ■■■■ changed files
opendj3-server-dev/build.xml 2 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java 18 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DatabaseContainer.java 5 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java 19 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSetSorter.java 5 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java 4 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/JECompressedSchema.java 4 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java 29 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/SortValuesSet.java 8 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java 54 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java 26 ●●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java 47 ●●●● patch | view | raw | blame | history
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java 6 ●●●● patch | view | raw | blame | history
opendj3-server-dev/build.xml
@@ -42,7 +42,6 @@
  <!-- General server-wide properties                                 -->
  <property name="src.dir"          location="src/server"              />
  <property name="pluggablebackend.pkg" value="org/opends/server/backends/pluggable" />
  <property name="build.dir"        location="build"                   />
  <property name="classes.dir"      location="${build.dir}/classes"    />
  <property name="build.lib.dir"    location="${build.dir}/lib"        />
@@ -679,7 +678,6 @@
      <fileset dir="${src.dir}">
        <include name="**/*.java"/>
        <exclude name="**/PublicAPI.java" />
        <exclude name="${pluggablebackend.pkg}/**/*.java" />
      </fileset>
      <formatter type="plain" />
    </checkstyle>
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -27,6 +27,10 @@
 */
package org.opends.server.backends.pluggable;
import static org.opends.messages.JebMessages.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
import java.io.Closeable;
import java.util.*;
@@ -53,10 +57,6 @@
import org.opends.server.types.*;
import org.opends.server.util.StaticUtils;
import static org.opends.messages.JebMessages.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
/**
 * Class representing an attribute index.
 * We have a separate database for each type of indexing, which makes it easy
@@ -131,9 +131,11 @@
   *
   * @param indexConfig The attribute index configuration.
   * @param entryContainer The entryContainer of this attribute index.
   * @param txn The database transaction
   * @throws ConfigException if a configuration related error occurs.
   */
  public AttributeIndex(BackendIndexCfg indexConfig, EntryContainer entryContainer, WriteableStorage txn) throws ConfigException
  public AttributeIndex(BackendIndexCfg indexConfig, EntryContainer entryContainer, WriteableStorage txn)
      throws ConfigException
  {
    this.entryContainer = entryContainer;
    this.indexConfig = indexConfig;
@@ -258,6 +260,7 @@
  /**
   * Open the attribute index.
   *
   * @param txn The database transaction
   * @throws StorageRuntimeException if a JE database error occurs while
   * opening the index.
   */
@@ -643,7 +646,7 @@
    final ConfigChangeResult ccr = new ConfigChangeResult();
    try
    {
      entryContainer.getStorage().write(new WriteOperation()
      entryContainer.getRootContainer().getStorage().write(new WriteOperation()
      {
        @Override
        public void run(WriteableStorage txn) throws Exception
@@ -776,7 +779,8 @@
    return rules;
  }
  private void applyChangeToIndex(WriteableStorage txn, IndexType indexType, BackendIndexCfg cfg, ConfigChangeResult ccr)
  private void applyChangeToIndex(final WriteableStorage txn, final IndexType indexType, final BackendIndexCfg cfg,
      final ConfigChangeResult ccr)
  {
    String indexId = indexType.toString();
    Index index = nameToIndexes.get(indexId);
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/DatabaseContainer.java
@@ -156,7 +156,8 @@
   * @param txn The JE transaction handle, or null if none.
   * @param key The record key.
   * @param value The record value.
   * @return <code>true</code> if the key-value mapping could be inserted, <code>false</code> if the key was already mapped to another value
   * @return {@code true} if the key-value mapping could be inserted,
   *         {@code false} if the key was already mapped to another value
   * @throws StorageRuntimeException If an error occurs in the JE operation.
   */
  boolean insert(WriteableStorage txn, ByteString key, ByteString value) throws StorageRuntimeException
@@ -174,7 +175,7 @@
   * simple wrapper around the JE Database.delete method.
   * @param txn The JE transaction handle, or null if none.
   * @param key The key of the record to be read.
   * @return <code>true</code> if the key mapping was removed, <code>false</code> otherwise
   * @return {@code true} if the key mapping was removed, {@code false} otherwise
   * @throws StorageRuntimeException If an error occurs in the JE operation.
   */
  boolean delete(WriteableStorage txn, ByteSequence key) throws StorageRuntimeException
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
@@ -47,6 +47,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.ByteString;
@@ -88,7 +89,6 @@
import org.opends.server.types.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.CanceledOperationException;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
@@ -260,7 +260,7 @@
          public void run(WriteableStorage txn) throws Exception
          {
            AttributeIndex index = attrIndexMap.get(cfg.getAttribute());
            deleteAttributeIndex(txn, index, ccr);
            deleteAttributeIndex(txn, index);
            attrIndexMap.remove(cfg.getAttribute());
          }
        });
@@ -471,6 +471,7 @@
  /**
   * Opens the entryContainer for reading and writing.
   *
   * @param txn The database transaction
   * @throws StorageRuntimeException If an error occurs in the JE database.
   * @throws ConfigException if a configuration related error occurs.
   */
@@ -595,11 +596,6 @@
    return rootContainer;
  }
  public Storage getStorage()
  {
    return storage;
  }
  /**
   * Get the DN database used by this entry container.
   * The entryContainer must have been opened.
@@ -721,6 +717,7 @@
   * Determine the highest entryID in the entryContainer.
   * The entryContainer must already be open.
   *
   * @param txn The database transaction
   * @return The highest entry ID.
   * @throws StorageRuntimeException If an error occurs in the JE database.
   */
@@ -1312,6 +1309,7 @@
  /**
   * Returns the entry corresponding to the provided entryID.
   *
   * @param txn The database transaction
   * @param entryID
   *          the id of the entry to retrieve
   * @return the entry corresponding to the provided entryID
@@ -2743,6 +2741,7 @@
  /**
   * Get a count of the number of entries stored in this entry container.
   *
   * @param txn The database transaction
   * @return The number of entries stored in this entry container.
   * @throws StorageRuntimeException If an error occurs in the JE database.
   */
@@ -2844,6 +2843,7 @@
   * Delete this entry container from disk. The entry container should be
   * closed before calling this method.
   *
   * @param txn The database transaction
   * @throws StorageRuntimeException If an error occurs while removing the entry
   *                           container.
   */
@@ -2861,6 +2861,7 @@
  /**
   * Remove a database from disk.
   *
   * @param txn The database transaction
   * @param database The database container to remove.
   * @throws StorageRuntimeException If an error occurs while attempting to delete the
   * database.
@@ -2888,8 +2889,7 @@
   * @throws StorageRuntimeException If an JE database error occurs while attempting
   * to delete the index.
   */
  private void deleteAttributeIndex(WriteableStorage txn, AttributeIndex attributeIndex, ConfigChangeResult ccr)
      throws StorageRuntimeException
  private void deleteAttributeIndex(WriteableStorage txn, AttributeIndex attributeIndex) throws StorageRuntimeException
  {
    attributeIndex.close();
    for (Index index : attributeIndex.getAllIndexes())
@@ -3247,6 +3247,7 @@
  /**
   * Creates a new index for an attribute.
   *
   * @param txn The database transaction
   * @param indexName the name to give to the new index
   * @param indexer the indexer to use when inserting data into the index
   * @param indexEntryLimit the index entry limit
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryIDSetSorter.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2014 ForgeRock AS
 *      Portions Copyright 2011-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable;
@@ -57,15 +57,14 @@
   * set using the given sort order.
   *
   * @param  entryContainer   The entry container with which the ID list is associated.
   * @param txn The database transaction
   * @param  entryIDSet       The entry ID set to be sorted.
   * @param  searchOperation  The search operation being processed.
   * @param  sortOrder        The sort order to use for the entry ID set.
   * @param  vlvRequest       The VLV request control included in the search
   *                          request, or {@code null} if there was none.
   *
   * @return  A new entry ID set which is a sorted representation of the
   *          provided set using the given sort order.
   *
   * @throws  DirectoryException  If an error occurs while performing the sort.
   */
  public static EntryIDSet sort(EntryContainer entryContainer,
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java
@@ -22,8 +22,7 @@
 *
 *
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions copyright 2011-2014 ForgeRock AS
 *
 *      Portions copyright 2011-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable;
@@ -73,6 +72,7 @@
   * Construct an index filter for a search operation.
   *
   * @param entryContainer The entry entryContainer.
   * @param txn The database transaction
   * @param searchOp       The search operation to be evaluated.
   * @param monitor        The monitor to gather filter usage stats.
   * @param debugBuilder If not null, a diagnostic string will be written
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/JECompressedSchema.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Portions Copyright 2013-2014 ForgeRock AS.
 *      Portions Copyright 2013-2015 ForgeRock AS.
 */
package org.opends.server.backends.pluggable;
@@ -85,7 +85,7 @@
   * @param storage
   *          A reference to the database environment in which the databases
   *          will be held.
   * @param txn
   * @param txn The database transaction
   * @throws StorageRuntimeException
   *           If a database problem occurs while loading the compressed schema
   *           definitions from the database.
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/RootContainer.java
@@ -42,6 +42,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.PersistitBackendCfg;
@@ -54,7 +55,6 @@
import org.opends.server.backends.pluggable.spi.WriteOperation;
import org.opends.server.backends.pluggable.spi.WriteableStorage;
import org.opends.server.core.DirectoryServer;
import org.forgerock.opendj.config.server.ConfigChangeResult;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
@@ -75,6 +75,7 @@
public class RootContainer
     implements ConfigurationChangeListener<PersistitBackendCfg>
{
  /** Logs the progress of the import. */
  private static final class ImportProgress implements Runnable
  {
    private final LDIFReader reader;
@@ -155,11 +156,25 @@
    config.addPersistitChangeListener(this);
  }
  /**
   * Returns the underlying storage engine.
   *
   * @return the underlying storage engine
   */
  PersistItStorage getStorage()
  {
    return storage;
  }
  /**
   * Imports information from an LDIF file into this backend.
   * This method should only be called if {@code supportsLDIFImport} returns {@code true}.
   * Note that the server will not explicitly initialize this backend before calling this method.
   *
   * @param importConfig The configuration to use when performing the import.
   * @return information about the result of the import processing.
   * @throws DirectoryException If a problem occurs while performing the LDIF import.
   */
  LDIFImportResult importLDIF(LDIFImportConfig importConfig) throws DirectoryException
  {
    RuntimeInformation.logInfo();
@@ -187,7 +202,8 @@
        long importCount = 0;
        final long startTime = System.currentTimeMillis();
        timerService.scheduleAtFixedRate(new ImportProgress(reader), IMPORT_PROGRESS_INTERVAL, IMPORT_PROGRESS_INTERVAL, TimeUnit.MILLISECONDS);
        timerService.scheduleAtFixedRate(new ImportProgress(reader),
            IMPORT_PROGRESS_INTERVAL, IMPORT_PROGRESS_INTERVAL, TimeUnit.MILLISECONDS);
        while (true)
        {
          final Entry entry;
@@ -318,6 +334,14 @@
    }
  }
  /**
   * Opens the root container.
   *
   * @throws StorageRuntimeException
   *           If a database error occurs when creating the environment.
   * @throws ConfigException
   *           If an configuration error occurs while creating the environment.
   */
  void open() throws StorageRuntimeException, ConfigException
  {
    // Create the directory if it doesn't exist.
@@ -407,6 +431,7 @@
   * @param baseDN The base DN of the entry container to open.
   * @param name The name of the entry container or <CODE>NULL</CODE> to open
   * the default entry container for the given base DN.
   * @param txn The database transaction
   * @return The opened entry container.
   * @throws StorageRuntimeException If an error occurs while opening the entry
   *                           container.
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/SortValuesSet.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2006-2008 Sun Microsystems, Inc.
 *      Portions Copyright 2014 ForgeRock AS
 *      Portions Copyright 2014-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable;
@@ -98,7 +98,6 @@
   * Add the given entryID and values from these sort values.
   *
   * @param sv The sort values to add.
   * @param types The types of the values to add.
   * @throws DirectoryException If a Directory Server error occurs.
   * @throws StorageRuntimeException If an error occurs in the JE database.
   */
@@ -232,7 +231,6 @@
   *
   * @param sv The sort values to remove.
   * @throws DirectoryException If a Directory Server error occurs.
   * @throws StorageRuntimeException If an error occurs in the JE database.
   */
  void remove(SortValues sv) throws DirectoryException
  {
@@ -354,9 +352,9 @@
    final ByteStringBuilder builder = new ByteStringBuilder(4 + entryIDs.length
        * 8 + valuesBytes.length);
    builder.append(entryIDs.length);
    for (int i = 0; i < entryIDs.length; i++)
    for (long entryID : entryIDs)
    {
      builder.append(entryIDs[i]);
      builder.append(entryID);
    }
    builder.append(valuesBytes);
    return builder.toByteString();
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Cursor.java
@@ -21,9 +21,8 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2014 ForgeRock AS
 *      Copyright 2014-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable.spi;
import java.io.Closeable;
@@ -31,22 +30,73 @@
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.ByteString;
/**
 * Cursor that iterates through records in a tree.
 */
public interface Cursor extends Closeable
{
  /**
   * Positions the cursor to the provided key if it exists in the tree.
   *
   * @param key
   *          the key where to position the cursor
   * @return {@code true} if the cursor could be positioned to the key,
   *         {@code false} otherwise
   */
  boolean positionToKey(ByteSequence key);
  /**
   * Positions the cursor to the provided key if it exists in the tree,
   * or else the lesser key greater than the provided key in the tree.
   *
   * @param key
   *          the key where to position the cursor
   * @return {@code true} if the cursor could be positioned to the key,
   *         {@code false} otherwise
   */
  boolean positionToKeyOrNext(ByteSequence key);
  /**
   * Positions the cursor to the last key in the tree.
   *
   * @return {@code true} if the cursor could be positioned to the last key,
   *         {@code false} otherwise
   */
  boolean positionToLastKey();
  /**
   * Moves this cursor to the next record in the tree.
   *
   * @return {@code true} if the cursor could move to the next record,
   *         {@code false} if no next record exists
   */
  boolean next();
  /**
   * Moves this cursor to the previous record in the tree.
   *
   * @return {@code true} if the cursor could move to the previous record,
   *         {@code false} if no previous record exists
   */
  boolean previous();
  /**
   * Returns the key of the record on which this cursor is currently positioned.
   *
   * @return the current record's key,
   *         or {@code null} if this cursor is not positioned on any record.
   */
  ByteString getKey();
  /**
   * Returns the value of the record on which this cursor is currently positioned.
   *
   * @return the current record's value,
   *         or {@code null} if this cursor is not positioned on any record.
   */
  ByteString getValue();
  /** {@inheritDoc} */
  @Override
  public void close();
}
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/StorageRuntimeException.java
@@ -21,25 +21,47 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2014 ForgeRock AS
 *      Copyright 2014-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable.spi;
/**
 * Runtime exception for problems happening in the storage engine.
 */
@SuppressWarnings("serial")
public final class StorageRuntimeException extends RuntimeException
{
  /**
   * Constructor with a message.
   *
   * @param message
   *          the exception message
   */
  public StorageRuntimeException(final String message)
  {
    super(message);
  }
  /**
   * Constructor with a message and a cause.
   *
   * @param message
   *          the exception message
   * @param cause
   *          the cause of the exception
   */
  public StorageRuntimeException(final String message, final Throwable cause)
  {
    super(message, cause);
  }
  /**
   * Constructor with a cause.
   *
   * @param cause
   *          the cause of the exception
   */
  public StorageRuntimeException(final Throwable cause)
  {
    super(cause);
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/TreeName.java
@@ -21,17 +21,30 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2014 ForgeRock AS
 *      Copyright 2014-2015 ForgeRock AS
 */
package org.opends.server.backends.pluggable.spi;
/** Assumes name components don't contain a '/'. */
/**
 * Represents the name of a tree (key-value store) in a database.
 * A tree name is made of the baseDN it is part of, and the identifier of the index it represents.
 * <p>
 * Note: This class assumes name components don't contain a '/'.
 */
public final class TreeName
{
  private final String baseDN;
  private final String indexId;
  private final String s;
  /**
   * Builds a tree name.
   *
   * @param baseDN
   *          the base DN
   * @param indexId
   *          the index identifier
   */
  public TreeName(String baseDN, String indexId)
  {
    this.baseDN = baseDN;
@@ -39,21 +52,39 @@
    this.s = '/' + baseDN + '/' + indexId;
  }
  /**
   * Returns the base DN.
   *
   * @return a {@code String} representing the base DN
   */
  public String getBaseDN()
  {
    return baseDN;
  }
  public TreeName replaceBaseDN(String newBaseDN)
  {
    return new TreeName(newBaseDN, indexId);
  }
  /**
   * Returns the index identifier.
   *
   * @return a {@code String} representing the base DN
   */
  public String getIndexId()
  {
    return indexId;
  }
  /**
   * Returns a new tree name object created by replacing the baseDN of the current object.
   *
   * @param newBaseDN
   *          the new base DN that replaces the existing base DN
   * @return a new tree name object with the provided the base DN
   */
  public TreeName replaceBaseDN(String newBaseDN)
  {
    return new TreeName(newBaseDN, indexId);
  }
  /** {@inheritDoc} */
  @Override
  public boolean equals(final Object obj)
  {
@@ -71,12 +102,14 @@
    }
  }
  /** {@inheritDoc} */
  @Override
  public int hashCode()
  {
    return s.hashCode();
  }
  /** {@inheritDoc} */
  @Override
  public String toString()
  {
opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/WriteableStorage.java
@@ -33,7 +33,7 @@
public interface WriteableStorage extends ReadableStorage
{
  /**
   * Opens the tree having the provided name. The tree is created if does not already exist.
   * Opens the tree identified by the provided name. The tree is created if it does not already exist.
   *
   * @param name
   *          the tree name
@@ -41,7 +41,7 @@
  void openTree(TreeName name);
  /**
   * Truncates the tree having the provided name. It removes all the records in the tree.
   * Truncates the tree identified by the provided name. It removes all the records in the tree.
   *
   * @param name
   *          the tree name
@@ -59,7 +59,7 @@
  void renameTree(TreeName oldName, TreeName newName);
  /**
   * Deletes the tree having the provided name.
   * Deletes the tree identified by the provided name.
   *
   * @param name
   *          the tree name