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

Jean-Noel Rouvignac
12.12.2014 63f1d4c2e9787e9abf49b7026f4f46dfdba7c972
Code cleanups
2 files modified
621 ■■■■■ changed files
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/DBTest.java 391 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ReferentialIntegrityPluginTestCase.java 230 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/DBTest.java
@@ -26,27 +26,28 @@
 */
package org.opends.server.tools;
import static org.opends.messages.ToolMessages.*;
import static com.forgerock.opendj.cli.ArgumentConstants.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
import static com.forgerock.opendj.cli.Utils.wrapText;
import static com.forgerock.opendj.cli.Utils.filterExitCode;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.*;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
import org.opends.server.admin.std.server.BackendCfg;
import org.opends.server.admin.std.server.LocalDBBackendCfg;
import org.opends.server.api.Backend;
import org.opends.server.backends.jeb.*;
import org.forgerock.opendj.config.server.ConfigException;
import org.opends.server.core.CoreConfigManager;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.LockFileManager;
import org.opends.server.extensions.ConfigFileHandler;
import org.opends.server.loggers.JDKLogging;
import org.opends.server.types.*;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.InitializationException;
import org.opends.server.types.NullOutputStream;
import org.opends.server.types.SortKey;
import org.opends.server.util.BuildVersion;
import org.opends.server.util.StaticUtils;
@@ -60,13 +61,18 @@
import com.forgerock.opendj.cli.SubCommandArgumentParser;
import com.forgerock.opendj.cli.TableBuilder;
import com.forgerock.opendj.cli.TextTablePrinter;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import static com.forgerock.opendj.cli.ArgumentConstants.*;
import static com.forgerock.opendj.cli.Utils.*;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.*;
import com.sleepycat.je.*;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.util.StaticUtils.*;
/**
 * This program provides a utility that may be used to debug a JE backend. This
@@ -87,7 +93,7 @@
   * Flag indicating whether or not the global arguments have already been
   * initialized.
   */
  private boolean globalArgumentsInitialized = false;
  private boolean globalArgumentsInitialized;
  /** The command-line argument parser. */
  private final SubCommandArgumentParser parser;
@@ -105,7 +111,7 @@
   * Flag indicating whether or not the sub-commands have already been
   * initialized.
   */
  private boolean subCommandsInitialized = false;
  private boolean subCommandsInitialized;
@@ -170,7 +176,7 @@
                                               toolDescription, false);
  }
  // Displays the provided message followed by a help usage reference.
  /** Displays the provided message followed by a help usage reference. */
  private void displayMessageAndUsageReference(LocalizableMessage message) {
    printMessage(message);
    printMessage(LocalizableMessage.EMPTY);
@@ -529,20 +535,20 @@
    // Retrieve the sub-command implementation and run it.
    SubCommand subCommand = parser.getSubCommand();
    try {
      if(subCommand.getName().equals("list-root-containers"))
      if("list-root-containers".equals(subCommand.getName()))
      {
        return listRootContainers();
      }
      else if(subCommand.getName().equals("list-entry-containers"))
      else if("list-entry-containers".equals(subCommand.getName()))
      {
        return listEntryContainers(subCommand.getArgument("backendid"));
      }
      else if(subCommand.getName().equals("list-database-containers"))
      else if("list-database-containers".equals(subCommand.getName()))
      {
        return listDatabaseContainers(subCommand.getArgument("backendid"),
                                      subCommand.getArgument("basedn"));
      }
      else if(subCommand.getName().equals("dump-database-container"))
      else if("dump-database-container".equals(subCommand.getName()))
      {
        return dumpDatabaseContainer(subCommand.getArgument("backendid"),
                                     subCommand.getArgument("basedn"),
@@ -554,14 +560,12 @@
                                     subCommand.getArgument("maxdatasize"),
                                     subCommand.getArgument("mindatasize"));
      }
      else if(subCommand.getName().equals("list-index-status"))
      else if("list-index-status".equals(subCommand.getName()))
      {
        return listIndexStatus(subCommand.getArgument("backendid"),
                                      subCommand.getArgument("basedn"));
      }
      {
        return 0;
      }
      return 0;
    } catch (Exception e) {
      printMessage(LocalizableMessage.raw(StaticUtils.stackTraceToString(e)));
      return 1;
@@ -597,18 +601,7 @@
  private int listEntryContainers(Argument backendID)
  {
    Map<LocalDBBackendCfg, BackendImpl> jeBackends = getJEBackends();
    BackendImpl backend = null;
    for(BackendImpl b : jeBackends.values())
    {
      if(b.getBackendID().equalsIgnoreCase(backendID.getValue()))
      {
        backend = b;
        break;
      }
    }
    BackendImpl backend = getBackendById(backendID);
    if(backend == null)
    {
      printMessage(ERR_DBTEST_NO_BACKENDS_FOR_ID.get(backendID.getValue()));
@@ -669,8 +662,6 @@
      out.format("%nTotal: %d%n", count);
      return 0;
    }
    catch(DatabaseException de)
    {
@@ -680,55 +671,21 @@
    }
    finally
    {
      try
      {
        // Close the root container
        rc.close();
      }
      catch(DatabaseException de)
      {
        // Ignore.
      }
      // Release the shared lock on the backend.
      try
      {
        String lockFile = LockFileManager.getBackendLockFileName(backend);
        StringBuilder failureReason = new StringBuilder();
        if (! LockFileManager.releaseLock(lockFile, failureReason))
        {
          printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
        }
      }
      catch (Exception e)
      {
        printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
      }
      close(rc);
      releaseSharedLock(backend);
    }
  }
  private int listDatabaseContainers(Argument backendID,
                                     Argument baseDN)
  private int listDatabaseContainers(Argument backendID, Argument baseDN)
  {
    Map<LocalDBBackendCfg, BackendImpl> jeBackends = getJEBackends();
    BackendImpl backend = null;
    DN base = null;
    for(BackendImpl b : jeBackends.values())
    {
      if(b.getBackendID().equalsIgnoreCase(backendID.getValue()))
      {
        backend = b;
        break;
      }
    }
    BackendImpl backend = getBackendById(backendID);
    if(backend == null)
    {
      printMessage(ERR_DBTEST_NO_BACKENDS_FOR_ID.get(backendID.getValue()));
      return 1;
    }
    DN base = null;
    if(baseDN.isPresent())
    {
      try
@@ -788,7 +745,6 @@
      if(base != null)
      {
        EntryContainer ec = rc.getEntryContainer(base);
        if(ec == null)
        {
          printMessage(ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(
@@ -796,48 +752,23 @@
          return 1;
        }
        ArrayList<DatabaseContainer> databaseContainers =
            new ArrayList<DatabaseContainer>();
        ec.listDatabases(databaseContainers);
        for(DatabaseContainer dc : databaseContainers)
        {
          builder.startRow();
          builder.appendCell(dc.getName().replace(ec.getDatabasePrefix()+"_",
                                                  ""));
          builder.appendCell(dc.getClass().getSimpleName());
          builder.appendCell(dc.getName());
          builder.appendCell(dc.getRecordCount());
          count++;
        }
        count = appendDatabaseContainerRows(builder, ec, count);
      }
      else
      {
        for(EntryContainer ec : rc.getEntryContainers())
        {
          builder.startRow();
          ArrayList<DatabaseContainer> databaseContainers =
              new ArrayList<DatabaseContainer>();
          ec.listDatabases(databaseContainers);
          builder.appendCell("Base DN: " +
              ec.getBaseDN().toNormalizedString());
          for(DatabaseContainer dc : databaseContainers)
          {
            builder.startRow();
            builder.appendCell(dc.getName().replace(
                ec.getDatabasePrefix()+"_",""));
            builder.appendCell(dc.getClass().getSimpleName());
            builder.appendCell(dc.getName());
            builder.appendCell(dc.getRecordCount());
            count++;
          }
          builder.appendCell("Base DN: " + ec.getBaseDN().toNormalizedString());
          count = appendDatabaseContainerRows(builder, ec, count);
        }
      }
      TextTablePrinter printer = new TextTablePrinter(out);
      builder.print(printer);
      out.format("%nTotal: %d%n", count);
      return 0;
      return 0;
    }
    catch(DatabaseException de)
    {
@@ -847,55 +778,81 @@
    }
    finally
    {
      try
      {
        // Close the root container
        rc.close();
      }
      catch(DatabaseException de)
      {
        // Ignore.
      }
      // Release the shared lock on the backend.
      try
      {
        String lockFile = LockFileManager.getBackendLockFileName(backend);
        StringBuilder failureReason = new StringBuilder();
        if (! LockFileManager.releaseLock(lockFile, failureReason))
        {
          printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
        }
      }
      catch (Exception e)
      {
        printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
      }
      close(rc);
      releaseSharedLock(backend);
    }
  }
  private int listIndexStatus(Argument backendID,
                              Argument baseDN)
  private int appendDatabaseContainerRows(TableBuilder builder, EntryContainer ec, int count)
  {
    Map<LocalDBBackendCfg, BackendImpl> jeBackends = getJEBackends();
    BackendImpl backend = null;
    DN base = null;
    for(BackendImpl b : jeBackends.values())
    ArrayList<DatabaseContainer> databaseContainers = new ArrayList<DatabaseContainer>();
    ec.listDatabases(databaseContainers);
    String toReplace = ec.getDatabasePrefix() + "_";
    for(DatabaseContainer dc : databaseContainers)
    {
      if(b.getBackendID().equalsIgnoreCase(backendID.getValue()))
      builder.startRow();
      builder.appendCell(dc.getName().replace(toReplace, ""));
      builder.appendCell(dc.getClass().getSimpleName());
      builder.appendCell(dc.getName());
      builder.appendCell(dc.getRecordCount());
      count++;
    }
    return count;
  }
  private void close(RootContainer rc)
  {
    try
    {
      rc.close();
    }
    catch(DatabaseException ignored)
    {
      // Ignore.
    }
  }
  private void releaseSharedLock(BackendImpl backend)
  {
    try
    {
      String lockFile = LockFileManager.getBackendLockFileName(backend);
      StringBuilder failureReason = new StringBuilder();
      if (!LockFileManager.releaseLock(lockFile, failureReason))
      {
        backend = b;
        break;
        printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
      }
    }
    catch (Exception e)
    {
      printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
    }
  }
  private BackendImpl getBackendById(Argument backendId)
  {
    Collection<BackendImpl> backends = getJEBackends().values();
    String backendID = backendId.getValue();
    for (BackendImpl b : backends)
    {
      if (b.getBackendID().equalsIgnoreCase(backendID))
      {
        return b;
      }
    }
    return null;
  }
  private int listIndexStatus(Argument backendID, Argument baseDN)
  {
    BackendImpl backend = getBackendById(backendID);
    if(backend == null)
    {
      printMessage(ERR_DBTEST_NO_BACKENDS_FOR_ID.get(backendID.getValue()));
      return 1;
    }
    DN base = null;
    if(baseDN.isPresent())
    {
      try
@@ -960,7 +917,6 @@
      EntryContainer ec = rc.getEntryContainer(base);
      if(ec == null)
      {
        printMessage(ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(
@@ -973,24 +929,22 @@
      Map<Index, StringBuilder> undefinedKeys =
          new HashMap<Index, StringBuilder>();
      ec.listDatabases(databaseContainers);
      String toReplace = ec.getDatabasePrefix() + "_";
      for(DatabaseContainer dc : databaseContainers)
      {
        if(dc instanceof Index || dc instanceof VLVIndex)
        {
          builder.startRow();
          builder.appendCell(dc.getName().replace(ec.getDatabasePrefix()+"_",
                                                  ""));
          builder.appendCell(dc.getName().replace(toReplace, ""));
          builder.appendCell(dc.getClass().getSimpleName());
          builder.appendCell(dc.getName());
          if(dc instanceof Index)
          {
            builder.appendCell(ec.getState().getIndexTrustState(null,
                                                                (dc)));
            builder.appendCell(ec.getState().getIndexTrustState(null, dc));
          }
          else if(dc instanceof VLVIndex)
          {
            builder.appendCell(ec.getState().getIndexTrustState(null,
                                                               (dc)));
            builder.appendCell(ec.getState().getIndexTrustState(null, dc));
          }
          builder.appendCell(dc.getRecordCount());
@@ -1008,7 +962,7 @@
            while(status == OperationStatus.SUCCESS)
            {
              byte[] bytes = data.getData();
              if (bytes.length == 0 || ((bytes[0] & 0x80) == 0x80))
              if (bytes.length == 0 || (bytes[0] & 0x80) == 0x80)
              {
                // Entry limit has exceeded and there is no encoded
                //  undefined set size.
@@ -1081,8 +1035,7 @@
      out.format("%nTotal: %d%n", count);
      for(Map.Entry<Index, StringBuilder> e : undefinedKeys.entrySet())
      {
        out.format("%nIndex: %s%n",
            e.getKey().getName().replace(ec.getDatabasePrefix()+"_", ""));
        out.format("%nIndex: %s%n", e.getKey().getName().replace(toReplace, ""));
        out.format("Undefined keys: %s%n", e.getValue().toString());
      }
      return 0;
@@ -1095,30 +1048,8 @@
    }
    finally
    {
      try
      {
        // Close the root container
        rc.close();
      }
      catch(DatabaseException de)
      {
        // Ignore.
      }
      // Release the shared lock on the backend.
      try
      {
        String lockFile = LockFileManager.getBackendLockFileName(backend);
        StringBuilder failureReason = new StringBuilder();
        if (! LockFileManager.releaseLock(lockFile, failureReason))
        {
          printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
        }
      }
      catch (Exception e)
      {
        printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
      }
      close(rc);
      releaseSharedLock(backend);
    }
  }
@@ -1128,25 +1059,14 @@
                                    Argument maxKeyValue, Argument minKeyValue,
                                    Argument maxDataSize, Argument minDataSize)
  {
    Map<LocalDBBackendCfg, BackendImpl> jeBackends = getJEBackends();
    BackendImpl backend = null;
    DN base = null;
    for(BackendImpl b : jeBackends.values())
    {
      if(b.getBackendID().equalsIgnoreCase(backendID.getValue()))
      {
        backend = b;
        break;
      }
    }
    BackendImpl backend = getBackendById(backendID);
    if(backend == null)
    {
      printMessage(ERR_DBTEST_NO_BACKENDS_FOR_ID.get(backendID.getValue()));
      return 1;
    }
    DN base = null;
    try
    {
      base = DN.valueOf(baseDN.getValue());
@@ -1191,7 +1111,6 @@
    try
    {
      EntryContainer ec = rc.getEntryContainer(base);
      if(ec == null)
      {
        printMessage(ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(
@@ -1203,10 +1122,10 @@
      ArrayList<DatabaseContainer> databaseContainers =
          new ArrayList<DatabaseContainer>();
      ec.listDatabases(databaseContainers);
      String toReplace = ec.getDatabasePrefix() + "_";
      for(DatabaseContainer dc : databaseContainers)
      {
        if(dc.getName().replace(ec.getDatabasePrefix()+"_","").
            equalsIgnoreCase(databaseName.getValue()))
        if(dc.getName().replace(toReplace, "").equalsIgnoreCase(databaseName.getValue()))
        {
          databaseContainer = dc;
          break;
@@ -1226,9 +1145,7 @@
      long totalDataSize = 0;
      int indent = 4;
      Cursor cursor =
          databaseContainer.openCursor(null, CursorConfig.DEFAULT);
      Cursor cursor = databaseContainer.openCursor(null, CursorConfig.DEFAULT);
      try
      {
        DatabaseEntry key = new DatabaseEntry();
@@ -1277,9 +1194,7 @@
          {
            if(minKeyValue.getValue().startsWith("0x"))
            {
              start =
                  StaticUtils.hexStringToByteArray(minKeyValue.getValue().
                      substring(2));
              start = hexStringToByteArray(minKeyValue.getValue().substring(2));
            }
            else
            {
@@ -1326,9 +1241,7 @@
          {
            if(maxKeyValue.getValue().startsWith("0x"))
            {
              end =
                  StaticUtils.hexStringToByteArray(maxKeyValue.getValue().
                      substring(2));
              end = hexStringToByteArray(maxKeyValue.getValue().substring(2));
            }
            else
            {
@@ -1379,6 +1292,7 @@
          status = cursor.getFirst(key, data, lockMode);
        }
        final String lineSep = System.getProperty("line.separator");
        while(status == OperationStatus.SUCCESS)
        {
          // Make sure this record is within the value size params
@@ -1424,8 +1338,7 @@
            }
            else
            {
              if(defaultComparator.compare(key.getData(),
                                           end) > 0)
              if (defaultComparator.compare(key.getData(), end) > 0)
              {
                break;
              }
@@ -1468,11 +1381,10 @@
                keyLabel = INFO_LABEL_DBTEST_ENTRY_ID.get();
                try
                {
                  formatedData = System.getProperty("line.separator") +
                  formatedData = lineSep +
                      ID2Entry.entryFromDatabase(
                        ByteString.wrap(data.getData()),
                        ec.getRootContainer().getCompressedSchema()).
                              toLDIFString();
                        ec.getRootContainer().getCompressedSchema()).toLDIFString();
                  dataLabel = INFO_LABEL_DBTEST_ENTRY.get();
                }
                catch(Exception e)
@@ -1503,20 +1415,18 @@
                formatedKey = new String(key.getData());
                keyLabel = INFO_LABEL_DBTEST_INDEX_VALUE.get();
                EntryIDSet idSet = new EntryIDSet(key.getData(),
                                                data.getData());
                EntryIDSet idSet = new EntryIDSet(key.getData(), data.getData());
                if(idSet.isDefined())
                {
                  int lineCount = 0;
                  StringBuilder builder = new StringBuilder();
                  Iterator<EntryID> i = idSet.iterator();
                  while(i.hasNext())
                  for (EntryID entryID : idSet)
                  {
                    builder.append(i.next());
                    builder.append(entryID);
                    if(lineCount == 10)
                    {
                      builder.append(System.getProperty("line.separator"));
                      builder.append(lineSep);
                      lineCount = 0;
                    }
                    else
@@ -1581,8 +1491,7 @@
                                   entryIDBytes.length);
                  long entryID = JebFormat.entryIDFromDatabase(entryIDBytes);
                  formatedKey = System.getProperty("line.separator") +
                      String.valueOf(entryID) + ": " + builder.toString();
                  formatedKey = lineSep + entryID + ": " + builder;
                }
                else
                {
@@ -1599,7 +1508,7 @@
                  long[] entryIDs = svs.getEntryIDs();
                  for(int i = 0; i < entryIDs.length; i++)
                  {
                    builder.append(String.valueOf(entryIDs[i]));
                    builder.append(entryIDs[i]);
                    builder.append(": ");
                    for(int j = 0; j < sortKeys.length; j++)
                    {
@@ -1617,14 +1526,13 @@
                      }
                      else
                      {
                        builder.append(value.toString());
                        builder.append(value);
                      }
                      builder.append(" ");
                    }
                    builder.append(System.getProperty("line.separator"));
                    builder.append(lineSep);
                  }
                  formatedData = System.getProperty("line.separator") +
                        builder.toString();
                  formatedData = lineSep + builder;
                  dataLabel = INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST.get();
                }
                catch(Exception e)
@@ -1639,18 +1547,14 @@
            if(formatedKey == null)
            {
              StringBuilder keyBuilder = new StringBuilder();
              StaticUtils.byteArrayToHexPlusAscii(keyBuilder, key.getData(),
                                                  indent);
              formatedKey = System.getProperty("line.separator") +
                  keyBuilder.toString();
              StaticUtils.byteArrayToHexPlusAscii(keyBuilder, key.getData(), indent);
              formatedKey = lineSep + keyBuilder;
            }
            if(formatedData == null)
            {
              StringBuilder dataBuilder = new StringBuilder();
              StaticUtils.byteArrayToHexPlusAscii(dataBuilder, data.getData(),
                                                  indent);
              formatedData = System.getProperty("line.separator") +
                  dataBuilder.toString();
              StaticUtils.byteArrayToHexPlusAscii(dataBuilder, data.getData(), indent);
              formatedData = lineSep + dataBuilder;
            }
            out.format("%s (%d bytes): %s%n", keyLabel,
@@ -1686,37 +1590,15 @@
    }
    finally
    {
      try
      {
        // Close the root container
        rc.close();
      }
      catch(DatabaseException de)
      {
        // Ignore.
      }
      // Release the shared lock on the backend.
      try
      {
        String lockFile = LockFileManager.getBackendLockFileName(backend);
        StringBuilder failureReason = new StringBuilder();
        if (! LockFileManager.releaseLock(lockFile, failureReason))
        {
          printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
        }
      }
      catch (Exception e)
      {
        printMessage(WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
      }
      close(rc);
      releaseSharedLock(backend);
    }
  }
  private Map<LocalDBBackendCfg, BackendImpl> getJEBackends()
  {
    ArrayList<Backend> backendList = new ArrayList<Backend>();
    ArrayList<BackendCfg>  entryList   = new ArrayList<BackendCfg>();
    ArrayList<BackendCfg> entryList = new ArrayList<BackendCfg>();
    ArrayList<List<DN>> dnList = new ArrayList<List<DN>>();
    BackendToolUtils.getBackends(backendList, entryList, dnList);
@@ -1724,14 +1606,13 @@
        new LinkedHashMap<LocalDBBackendCfg, BackendImpl>();
    for(int i = 0; i < backendList.size(); i++)
    {
      Backend backend = backendList.get(i);
      Backend<?> backend = backendList.get(i);
      if(backend instanceof BackendImpl)
      {
        jeBackends.put((LocalDBBackendCfg)entryList.get(i),
                       (BackendImpl)backend);
      }
    }
    return jeBackends;
  }
opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/plugins/ReferentialIntegrityPluginTestCase.java
@@ -48,16 +48,20 @@
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.internal.SearchRequest;
import static org.opends.server.protocols.internal.Requests.*;
import org.opends.server.types.*;
import org.opends.server.types.Attributes;
import org.opends.server.types.DN;
import org.opends.server.types.Entry;
import org.opends.server.types.Modification;
import org.opends.server.types.RDN;
import org.testng.annotations.*;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.opends.server.protocols.internal.InternalClientConnection.*;
import static org.opends.server.protocols.internal.Requests.*;
import static org.testng.Assert.*;
/**
@@ -66,7 +70,7 @@
@SuppressWarnings("javadoc")
public class ReferentialIntegrityPluginTestCase extends PluginTestCase  {
  //Config DNs and attributes.
  /** Config DNs and attributes. */
  private DN configDN;
  private String dsConfigAttrType="ds-cfg-attribute-type";
  private String dsConfigBaseDN="ds-cfg-base-dn";
@@ -77,46 +81,45 @@
    "ds-cfg-check-references-filter-criteria";
  private String dsConfigPluginType = "ds-cfg-plugin-type";
  //Suffixes to use for non-public naming context tests.
  /** Suffixes to use for non-public naming context tests. */
  private String exSuffix="dc=example,dc=com";
  private String testSuffix="o=test";
  //dc=example,dc=com entries.
  /** Dc=example,dc=com entries. */
  private String user1="uid=user.1, ou=People, ou=dept," + exSuffix;
  private String user2="uid=user.2, ou=People, ou=dept," + exSuffix;
  private String user3="uid=user.3, ou=People, ou=dept," + exSuffix;
  //Test entry to use for rename tests.
  /** Test entry to use for rename tests. */
  private String tuser1="uid=user.1, ou=People, ou=dept," + testSuffix;
  //Old superior, new superior and new RDN for move tree tests.
  /** Old superior, new superior and new RDN for move tree tests. */
  private String newSuperior="ou=moved dept," + exSuffix;
  private String oldSuperior="ou=people, ou=dept," + exSuffix;
  private String newRdn="ou=moved people";
  //DNs to verfiy that the moved tree test worked.
  /** DNs to verfiy that the moved tree test worked. */
  private String user1_moved= "uid=user.1," + newRdn + ',' +newSuperior;
  private String user2_moved= "uid=user.2," + newRdn + ',' + newSuperior;
  private String user3_moved= "uid=user.3," + newRdn + ',' + newSuperior;
  //DN to test that the rename test worked.
  /** DN to test that the rename test worked. */
  private String tuser1_rename=
                              "cn=new user.1, ou=People, ou=dept," + testSuffix;
  private String tuser1_rdn="cn=new user.1";
  //Test DNs to add to various groups.
  /** Test DNs to add to various groups. */
  private String tuser2="uid=user.2, ou=People, ou=dept," + testSuffix;
  private String tuser3="uid=user.3, ou=People, ou=dept," + testSuffix;
  //Groups to use for member and uniquemember attrbutes in dc=example, dc=com
  //suffix.
  /** Groups to use for member and uniquemember attributes in dc=example, dc=com suffix. */
  private String group = "cn=group, ou=groups," + exSuffix;
  private String ugroup = "cn=group, ou=unique groups," + exSuffix;
  //DN to use for seeAlso attrbutes.
  /** DN to use for seeAlso attributes. */
  private String spPerson = "cn=special person, ou=Special People," + exSuffix;
  //Same as above but for o=test suffix.
  /** Same as above but for o=test suffix. */
  private String tgroup = "cn=group, ou=groups," + testSuffix;
  private String tugroup = "cn=group, ou=unique groups," + testSuffix;
  private String tspPerson =
@@ -128,9 +131,8 @@
   * the correct suffixes.
   *
   * @throws Exception If an unexpected result is returned.
   *
   */
  @Test()
  @Test
  public void testModDNMoveTree() throws Exception {
    //Add attributes interested in: member, uniquemember, seealso.
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
@@ -165,9 +167,8 @@
   * under the correct suffixes.
   *
   * @throws Exception If an unexpected result is returned.
   *
   */
  @Test()
  @Test
  public void testReferentialDeleteTree() throws Exception {
    // Add attributes interested in: member, uniquemember, seealso.
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
@@ -208,15 +209,13 @@
    isAttributeValueEntry(spPerson, true, "seealso", user1, user2, user3);
  }
   /**
  /**
   * Test that a rename  changes the correct entries under
   * the correct suffixes.
   *
   * @throws Exception If an unexpected result is returned.
    *
   */
  @Test()
  @Test
  public void testModDNMoveEntry() throws Exception {
    //Add attributes interested in: member, uniquemember, seealso.
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
@@ -247,9 +246,8 @@
   * Test a delete using public naming contexts as base DNs.
   *
   * @throws Exception If an unexpected result is returned.
   *
   */
  @Test()
  @Test
  public void testReferentialDelete() throws Exception {
   replaceAttrEntry(configDN, dsConfigAttrType,"member");
   addAttrEntry(DN.valueOf(tgroup), "member", tuser1, tuser2, tuser3);
@@ -260,13 +258,12 @@
  /**
   * Test that delete using public naming context works in both background
   * processing (set interval to 1 and wait 2 seconds) and forground. The
   * changes are made without restarting the server.
   * processing (set interval to 1 and wait 2 seconds) and foreground.
   * The changes are made without restarting the server.
   *
   * @throws Exception If an unexpected result happens.
   *
   */
  @Test()
  @Test
   public void testReferentialDeleteBackGround() throws Exception {
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
    //Set interval to 1 second, this should start the background thread
@@ -277,8 +274,7 @@
    //Wait two seconds and then check the group.
    Thread.sleep(2000);
    isMember(tgroup, false, tuser1, tuser2, tuser3);
    //Change the interval to zero seconds, this should stop the background
    //thread.
    //Change the interval to zero seconds, this should stop the background thread
    replaceAttrEntry(configDN, dsConfigUpdateInterval,"0 seconds");
    addEntries(tuser1, tuser2, tuser3);
    addAttrEntry(DN.valueOf(tgroup), "member", tuser1, tuser2, tuser3);
@@ -291,9 +287,8 @@
   * Test delete using multiple attribute types and public naming contexts.
   *
   * @throws Exception If an unexpected result happened.
   *
   */
  @Test()
  @Test
   public void testReferentialDeleteAttrs() throws Exception {
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
    addAttrEntry(configDN, dsConfigAttrType,"uniquemember", "seealso");
@@ -302,19 +297,16 @@
    addAttrEntry(DN.valueOf(tspPerson), "seealso", tuser1, tuser2, tuser3);
    deleteEntries(tuser1, tuser2, tuser3);
    isMember(tgroup, false, tuser1, tuser2, tuser3);
    isAttributeValueEntry(tugroup, false, "uniquemember",
                          tuser1, tuser2, tuser3);
    isAttributeValueEntry(tspPerson, false,"seealso",
                          tuser1, tuser2, tuser3);
    isAttributeValueEntry(tugroup, false, "uniquemember", tuser1, tuser2, tuser3);
    isAttributeValueEntry(tspPerson, false,"seealso", tuser1, tuser2, tuser3);
   }
  /**
   * Check delete with multiple attribute types and multiple suffixes.
   *
   * @throws Exception If an unexpected result happened.
   *
   */
  @Test()
  @Test
   public void testReferentialDeleteAttrsSuffix() throws Exception {
    replaceAttrEntry(configDN, dsConfigAttrType,"member");
    addAttrEntry(configDN, dsConfigAttrType,"uniquemember", "seealso");
@@ -810,9 +802,8 @@
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  @BeforeClass()
  public void startServer()
          throws Exception
  @BeforeClass
  public void startServer() throws Exception
  {
    TestCaseUtils.startServer();
    configDN= DN.valueOf("cn=Referential Integrity ,cn=Plugins,cn=config");
@@ -823,7 +814,6 @@
   * entries.
   *
   * @throws Exception If an unexpected problem occurs.
   *
   */
  @BeforeMethod
  public void clearConfigEntries() throws Exception {
@@ -1106,18 +1096,19 @@
   *
   */
  private AttributeType getAttrType(String attrTypeString) {
    AttributeType attrType =
            DirectoryServer.getAttributeType(attrTypeString);
    AttributeType attrType = DirectoryServer.getAttributeType(attrTypeString);
    if (attrType == null)
    {
      attrType = DirectoryServer.getDefaultAttributeType(attrTypeString);
    }
    return attrType;
  }
  private void deleteEntries(String... dns) throws Exception{
    InternalClientConnection conn = getRootConnection();
    for(String dn : dns) {
         DeleteOperation op=conn.processDelete(DN.valueOf(dn));
       assertEquals(op.getResultCode(), ResultCode.SUCCESS);
      DeleteOperation op = conn.processDelete(DN.valueOf(dn));
      assertEquals(op.getResultCode(), ResultCode.SUCCESS);
    }
  }
@@ -1153,12 +1144,13 @@
   * @throws Exception If an unexpected membership occurs.
   *
   */
  private void isMember(String group, boolean expected, String... dns)
  throws Exception {
  private void isMember(String group, boolean expected, String... dns) throws Exception {
   GroupManager groupManager=DirectoryServer.getGroupManager();
   Group<?> instance=groupManager.getGroupInstance(DN.valueOf(group));
   for(String dn : dns)
   {
     assertEquals(instance.isMember(DN.valueOf(dn)), expected);
   }
  }
  private void isAttributeValueEntry(String entryDN, boolean expected,
@@ -1214,29 +1206,29 @@
  /**
   * Perform modify DN operation.
   *
   * @param dn  The DN to renmame or move.
   *
   * @param dn  The DN to rename or move.
   * @param rdn RDN value.
   *
   * @param newSuperior New superior to move to.
   *
   * @throws Exception If the operation can't be performed.
   *
   */
  private void
  doModDN(String dn, String rdn, String newSuperior) throws Exception {
  private void doModDN(String dn, String rdn, String newSuperior) throws Exception
  {
    InternalClientConnection conn = getRootConnection();
    ModifyDNOperation modDNop;
    if(newSuperior != null)
    {
        modDNop = conn.processModifyDN(DN.valueOf(dn), RDN.decode(rdn), true,
                                       DN.valueOf(newSuperior));
    }
    else
    {
        modDNop = conn.processModifyDN(DN.valueOf(dn), RDN.decode(rdn),
                                       false, null);
    }
    assertEquals(modDNop.getResultCode(), ResultCode.SUCCESS);
  }
    /**
  /**
   * Test case:
   * - integrity is enforced on the attribute 'manager'
   * - value of the 'manager' attribute should match the filter:
@@ -1247,9 +1239,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddUserWitManagerFilterNoNC()
    throws Exception
  @Test
  public void testEnforceIntegrityAddUserWitManagerFilterNoNC() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1292,9 +1283,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddUserWitManagerFilter()
    throws Exception
  @Test
  public void testEnforceIntegrityAddUserWitManagerFilter() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1326,7 +1316,7 @@
      "manager: uid=manager,ou=people,ou=dept,dc=example,dc=com");
  }
    /**
  /**
   * Test case:
   * - integrity is enforced on the attribute 'manager'
   * - value of the 'manager' attribute should match the filter:
@@ -1336,9 +1326,8 @@
   * - CONSTRAINT VIOLATION
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddUserWithMissingManagerEntry()
    throws Exception
  @Test
  public void testEnforceIntegrityAddUserWithMissingManagerEntry() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1368,11 +1357,10 @@
      "manager: uid=bad,ou=people,ou=dept,dc=example,dc=com");
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(addOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
    /**
  /**
   * Test case:
   * - integrity is enforced on the attribute 'manager'
   * - value of the 'manager' attribute should match the filter:
@@ -1384,9 +1372,8 @@
   * - CONSTRAINT VIOLATION
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddUserWitManagerFilterMismatch()
    throws Exception
  @Test
  public void testEnforceIntegrityAddUserWitManagerFilterMismatch() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1418,11 +1405,10 @@
      "manager: uid=manager,ou=people,ou=dept,dc=example,dc=com");
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(addOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
    /**
  /**
   * Test case:
   * - integrity is enforced on the attribute 'manager'
   * - value of the 'manager' attribute should match the filter:
@@ -1433,9 +1419,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddUserWithManagerNC()
    throws Exception
  @Test
  public void testEnforceIntegrityAddUserWithManagerNC() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1479,9 +1464,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddGroupWithFilter()
    throws Exception
  @Test
  public void testEnforceIntegrityAddGroupWithFilter() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1521,9 +1505,8 @@
   * - CONSTRAINT VIOLATION
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddGroupWithMissingMember()
    throws Exception
  @Test
  public void testEnforceIntegrityAddGroupWithMissingMember() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1553,8 +1536,7 @@
      );
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(addOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  /**
@@ -1568,9 +1550,8 @@
   * - CONSTRAINT VIOLATION
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddGroupMemberFilterMismatch()
    throws Exception
  @Test
  public void testEnforceIntegrityAddGroupMemberFilterMismatch() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1600,8 +1581,7 @@
      );
    AddOperation addOperation = getRootConnection().processAdd(entry);
    assertEquals(addOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(addOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  /**
@@ -1615,9 +1595,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityAddGroupMemberNC()
    throws Exception
  @Test
  public void testEnforceIntegrityAddGroupMemberNC() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1656,9 +1635,8 @@
   * - add 'manager' attribute to the manager entry
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityModifyUserAddManagerFilter()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyUserAddManagerFilter() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1691,9 +1669,8 @@
   * - modify 'manager' attribute to the 'user.2' entry
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityModifyUserModifyManagerFilter()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyUserModifyManagerFilter() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1730,9 +1707,8 @@
   * - constraint violation
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityModifyUserAddManagerFilterMismatch()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyUserAddManagerFilterMismatch() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1753,8 +1729,7 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(user1),
     "manager", "uid=manager,ou=people,ou=dept,dc=example,dc=com");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(modOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  /**
@@ -1766,9 +1741,8 @@
   * - SUCCESS
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityModifyUserAddManagerNC()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyUserAddManagerNC() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1791,8 +1765,7 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(user1),
     "manager", "uid=manager,ou=people,ou=dept,o=test");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.SUCCESS);
    assertEquals(modOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
@@ -1803,9 +1776,8 @@
   * - constraint violation
   * @throws Exception
   */
  @Test()
  public void testEnforceIntegrityModifyUserAddManagerMissing()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyUserAddManagerMissing() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1824,13 +1796,11 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(user1),
     "manager", "uid=manager,ou=people,ou=dept,dc=example,dc=com");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(modOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  @Test()
  public void testEnforceIntegrityModifyGroupAddMember()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyGroupAddMember() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1853,9 +1823,8 @@
    assertEquals(modOperation.getResultCode(), ResultCode.SUCCESS);
  }
  @Test()
  public void testEnforceIntegrityModifyGroupAddMissingMember()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyGroupAddMissingMember() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1874,13 +1843,11 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(group),
      "member", "uid=user.100,ou=people,ou=dept,dc=example,dc=com");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(modOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  @Test()
  public void testEnforceIntegrityModifyGroupAddMemberFilterMismatch()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyGroupAddMemberFilterMismatch() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1899,13 +1866,11 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(group),
      "member", "uid=user.100,ou=people,ou=dept,dc=example,dc=com");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.CONSTRAINT_VIOLATION);
    assertEquals(modOperation.getResultCode(), ResultCode.CONSTRAINT_VIOLATION);
  }
  @Test()
  public void testEnforceIntegrityModifyGroupAddMemberNC()
    throws Exception
  @Test
  public void testEnforceIntegrityModifyGroupAddMemberNC() throws Exception
  {
    replaceAttrEntry(configDN, "ds-cfg-enabled", "false");
    replaceAttrEntry(configDN, dsConfigPluginType,
@@ -1926,7 +1891,6 @@
    ModifyOperation modOperation = addAttrEntry(DN.valueOf(group),
      "member", "uid=user.1,ou=people,ou=dept,o=test");
    assertEquals(modOperation.getResultCode(),
                 ResultCode.SUCCESS);
    assertEquals(modOperation.getResultCode(), ResultCode.SUCCESS);
  }
}