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

Jean-Noël Rouvignac
04.38.2016 c6772b9cf6b2cb14b1b8127dcf4ec22f9ec9513c
OPENDJ-3203 Control-panel: creating a new base dn does not complete

This problem exists since we added support for the pluggable backend in the control-panel.
The problem is that when the server is running, the control-panel should issue commands to the running server.
Instead it executed the logic to create the backend when the server is offline.

NewBaseDNPanel.java:
In createBackendOnline(), call the newly added BackendCreationHelper.createBackendOnline().
Removed addBackendDefaultIndexes() (duplicate of BackendCreationHelper.addBackendDefaultIndexes())
(it was trying to create the indexes twice)
Remove displayCreateAdditionalIndexesDone() (duplicate of printTaskDone())
Moved the code printing the equivalent commands from updateConfiguration(On|Off)line()
directly inside performTask() to avoid duplication.

BackendCreationHelper.java:
Added createBackendOnline().
Renamed DefaultIndex to CreateIndex.
Added toString()
2 files modified
163 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java 76 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/BackendCreationHelper.java 87 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/NewBaseDNPanel.java
@@ -32,7 +32,6 @@
import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
@@ -62,11 +61,9 @@
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.LdapException;
import org.forgerock.opendj.server.config.client.BackendCfgClient;
import org.forgerock.opendj.server.config.client.BackendIndexCfgClient;
import org.forgerock.opendj.server.config.client.PluggableBackendCfgClient;
import org.forgerock.opendj.server.config.client.RootCfgClient;
import org.forgerock.opendj.server.config.meta.BackendIndexCfgDefn;
import org.forgerock.opendj.server.config.meta.BackendIndexCfgDefn.IndexType;
import org.opends.admin.ads.util.ConnectionWrapper;
import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor;
import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
@@ -82,7 +79,7 @@
import org.opends.quicksetup.installer.InstallerHelper;
import org.opends.quicksetup.util.Utils;
import org.opends.server.tools.BackendCreationHelper;
import org.opends.server.tools.BackendCreationHelper.DefaultIndex;
import org.opends.server.tools.BackendCreationHelper.CreateIndex;
import org.opends.server.tools.BackendTypeHelper;
import org.opends.server.tools.BackendTypeHelper.BackendTypeUIAdapter;
import org.opends.server.tools.ImportLDIF;
@@ -863,12 +860,6 @@
      });
      performTask();
      printTaskDone();
      if (isNewBackend())
      {
        createAdditionalIndexes();
      }
      refreshProgressBar();
    }
    private void updateConfigurationOffline() throws Exception
@@ -877,8 +868,6 @@
      try
      {
        performTask();
        printTaskDone();
        refreshProgressBar();
      }
      finally
      {
@@ -907,12 +896,17 @@
      {
        printCreateNewBackendProgress(backendName);
        createBackend(backendName);
        printTaskDone();
        displayCreateAdditionalIndexesDsConfigCmdLine();
        printTaskDone();
      }
      else
      {
        printCreateNewBaseDNProgress(backendName);
        addNewBaseDN(backendName);
        printTaskDone();
      }
      refreshProgressBar();
    }
    private void createBackend(String backendName) throws Exception
@@ -923,7 +917,7 @@
      }
      else
      {
        createBackendOnline(backendName);
        createBackendOnline(backendName, getInfo().getConnection());
      }
    }
@@ -940,10 +934,10 @@
      }
    }
    private void createBackendOnline(String backendName) throws Exception
    private void createBackendOnline(String backendName, ConnectionWrapper conn) throws Exception
    {
      Set<DN> baseDNs = Collections.singleton(DN.valueOf(newBaseDN));
      BackendCreationHelper.createBackendOffline(backendName, baseDNs, getSelectedBackendType().getBackend());
      BackendCreationHelper.createBackendOnline(backendName, baseDNs, getSelectedBackendType().getBackend(), conn);
    }
    private RootCfgClient getRootConfigurationClient() throws LdapException
@@ -987,33 +981,6 @@
      }
    }
    private void createAdditionalIndexes() throws Exception
    {
      final String backendName = getBackendName();
      displayCreateAdditionalIndexesDsConfigCmdLine();
      final RootCfgClient root = getRootConfigurationClient();
      addBackendDefaultIndexes((PluggableBackendCfgClient) root.getBackend(backendName));
      displayCreateAdditionalIndexesDone();
    }
    private void addBackendDefaultIndexes(PluggableBackendCfgClient backendCfgClient) throws Exception
    {
      for (DefaultIndex defaultIndex : BackendCreationHelper.DEFAULT_INDEXES)
      {
        final BackendIndexCfgClient index = backendCfgClient.createBackendIndex(
            BackendIndexCfgDefn.getInstance(), defaultIndex.getName(), null);
        final List<IndexType> indexTypes = new LinkedList<>();
        indexTypes.add(IndexType.EQUALITY);
        if (defaultIndex.shouldCreateSubstringIndex())
        {
          indexTypes.add(IndexType.SUBSTRING);
        }
        index.setIndexType(indexTypes);
        index.commit();
      }
    }
    private void printCreateNewBaseDNProgress(final String backendName) throws OpenDsException
    {
      SwingUtilities.invokeLater(new Runnable()
@@ -1060,9 +1027,9 @@
    private void displayCreateAdditionalIndexesDsConfigCmdLine()
    {
      final List<List<String>> argsArray = new ArrayList<>();
      for (DefaultIndex defaultIndex : BackendCreationHelper.DEFAULT_INDEXES)
      for (CreateIndex index : BackendCreationHelper.DEFAULT_INDEXES)
      {
        argsArray.add(getCreateIndexCommandLineArguments(defaultIndex));
        argsArray.add(getCreateIndexCommandLineArguments(index));
      }
      final StringBuilder sb = new StringBuilder();
@@ -1086,7 +1053,7 @@
      });
    }
    private List<String> getCreateIndexCommandLineArguments(final DefaultIndex defaultIndex)
    private List<String> getCreateIndexCommandLineArguments(final CreateIndex index)
    {
      final List<String> args = new ArrayList<>();
      args.add("create-backend-index");
@@ -1095,10 +1062,10 @@
      args.add("--type");
      args.add("generic");
      args.add("--index-name");
      args.add(defaultIndex.getName());
      args.add(index.getName());
      args.add("--set");
      args.add("index-type:" + IndexType.EQUALITY);
      if (defaultIndex.shouldCreateSubstringIndex())
      if (index.shouldCreateSubstringIndex())
      {
        args.add("--set");
        args.add("index-type:" + IndexType.SUBSTRING);
@@ -1110,19 +1077,6 @@
      return args;
    }
    private void displayCreateAdditionalIndexesDone()
    {
      SwingUtilities.invokeLater(new Runnable()
      {
        @Override
        public void run()
        {
          getProgressDialog().appendProgressHtml(
              Utilities.getProgressDone(ColorAndFontConstants.progressFont) + "<br><br>");
        }
      });
    }
    /**
     * Creates the data in the new base DN.
     *
opendj-server-legacy/src/main/java/org/opends/server/tools/BackendCreationHelper.java
@@ -32,6 +32,7 @@
import org.forgerock.opendj.server.config.meta.BackendIndexCfgDefn;
import org.forgerock.opendj.server.config.meta.BackendIndexCfgDefn.IndexType;
import org.forgerock.opendj.server.config.server.BackendCfg;
import org.opends.admin.ads.util.ConnectionWrapper;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.quicksetup.Installation;
@@ -39,22 +40,22 @@
public class BackendCreationHelper
{
  /** Describes an attribute index which should be created during installation. */
  public static final class DefaultIndex
  public static final class CreateIndex
  {
    private static DefaultIndex withEqualityAndSubstring(final String name)
    private static CreateIndex withEqualityAndSubstring(final String name)
    {
      return new DefaultIndex(name, true);
      return new CreateIndex(name, true);
    }
    private static DefaultIndex withEquality(final String name)
    private static CreateIndex withEquality(final String name)
    {
      return new DefaultIndex(name, false);
      return new CreateIndex(name, false);
    }
    private final String name;
    private final boolean shouldCreateSubstringIndex;
    private DefaultIndex(final String name, final boolean substringIndex)
    private CreateIndex(final String name, final boolean substringIndex)
    {
      this.name = name;
      this.shouldCreateSubstringIndex = substringIndex;
@@ -81,18 +82,29 @@
    {
      return shouldCreateSubstringIndex;
    }
    @Override
    public String toString()
    {
      String className = getClass().getSimpleName();
      if (shouldCreateSubstringIndex)
      {
        return className + "(" + name + ".equality" + ", " + name + ".substring" + ")";
      }
      return className + "(" + name + ".equality" + ")";
    }
  }
  /** Default indexes to add in a new backend. */
  public static final DefaultIndex[] DEFAULT_INDEXES = {
    DefaultIndex.withEqualityAndSubstring("cn"),
    DefaultIndex.withEqualityAndSubstring("givenName"),
    DefaultIndex.withEqualityAndSubstring("mail"),
    DefaultIndex.withEqualityAndSubstring("sn"),
    DefaultIndex.withEqualityAndSubstring("telephoneNumber"),
    DefaultIndex.withEquality("member"),
    DefaultIndex.withEquality("uid"),
    DefaultIndex.withEquality("uniqueMember")
  public static final CreateIndex[] DEFAULT_INDEXES = {
    CreateIndex.withEqualityAndSubstring("cn"),
    CreateIndex.withEqualityAndSubstring("givenName"),
    CreateIndex.withEqualityAndSubstring("mail"),
    CreateIndex.withEqualityAndSubstring("sn"),
    CreateIndex.withEqualityAndSubstring("telephoneNumber"),
    CreateIndex.withEquality("member"),
    CreateIndex.withEquality("uid"),
    CreateIndex.withEquality("uniqueMember")
  };
  /**
@@ -119,6 +131,27 @@
  }
  /**
   * Add a new backend with the provided name in the config.ldif file.
   *
   * @param backendName
   *          The new backend name
   * @param baseDNs
   *          The base dns to add in the new backend.
   * @param backendType
   *          The backend type
   * @param conn
   *          The connection to the server
   * @throws Exception
   *           If any problems occurred
   */
  public static void createBackendOnline(String backendName, Collection<DN> baseDNs,
      ManagedObjectDefinition<? extends BackendCfgClient, ? extends BackendCfg> backendType, ConnectionWrapper conn)
      throws Exception
  {
    createBackend(conn.getRootConfiguration(), backendName, baseDNs, backendType);
  }
  /**
   * Create a backend with the provided name using the provided
   * {@code RootCfgClient}.
   *
@@ -136,31 +169,31 @@
  private static void createBackend(RootCfgClient rootConfiguration, String backendName, Collection<DN> baseDNs,
      ManagedObjectDefinition<? extends BackendCfgClient, ? extends BackendCfg> backendType) throws Exception
  {
      final BackendCfgClient backendCfgClient = rootConfiguration.createBackend(backendType, backendName, null);
      backendCfgClient.setEnabled(true);
      backendCfgClient.setBaseDN(baseDNs);
      backendCfgClient.setWritabilityMode(WritabilityMode.ENABLED);
      backendCfgClient.commit();
    final BackendCfgClient backendCfgClient = rootConfiguration.createBackend(backendType, backendName, null);
    backendCfgClient.setEnabled(true);
    backendCfgClient.setBaseDN(baseDNs);
    backendCfgClient.setWritabilityMode(WritabilityMode.ENABLED);
    backendCfgClient.commit();
      addBackendDefaultIndexes((PluggableBackendCfgClient) backendCfgClient);
    addBackendDefaultIndexes((PluggableBackendCfgClient) backendCfgClient);
  }
  private static void addBackendDefaultIndexes(PluggableBackendCfgClient backendCfgClient) throws Exception
  {
    for (DefaultIndex defaultIndex : DEFAULT_INDEXES)
    for (CreateIndex index : DEFAULT_INDEXES)
    {
      final BackendIndexCfgClient index =
          backendCfgClient.createBackendIndex(BackendIndexCfgDefn.getInstance(), defaultIndex.name, null);
      final BackendIndexCfgClient indexCfg =
          backendCfgClient.createBackendIndex(BackendIndexCfgDefn.getInstance(), index.name, null);
      final List<IndexType> indexTypes = new LinkedList<>();
      indexTypes.add(IndexType.EQUALITY);
      if (defaultIndex.shouldCreateSubstringIndex)
      if (index.shouldCreateSubstringIndex)
      {
        indexTypes.add(IndexType.SUBSTRING);
      }
      index.setIndexType(indexTypes);
      indexCfg.setIndexType(indexTypes);
      index.commit();
      indexCfg.commit();
    }
  }
}