From 5360b07bd36e6b3479c1bb3f911bb34f8d661b1f Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Wed, 21 Sep 2016 15:15:44 +0000
Subject: [PATCH] OPENDJ-2413 Apply PR comments: remove builders in parameters classes, simplify configuration retrieval Include also other minor changes and renaming

---
 opendj-server-legacy/src/main/java/org/opends/server/util/embedded/EmbeddedDirectoryServer.java |  376 ++++++++++++++++++-----------------------------------
 1 files changed, 131 insertions(+), 245 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/embedded/EmbeddedDirectoryServer.java b/opendj-server-legacy/src/main/java/org/opends/server/util/embedded/EmbeddedDirectoryServer.java
index 708295b..11edee5 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/embedded/EmbeddedDirectoryServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/embedded/EmbeddedDirectoryServer.java
@@ -15,6 +15,7 @@
  */
 package org.opends.server.util.embedded;
 
+import static org.opends.messages.UtilityMessages.ERR_EMBEDDED_SERVER_LDIF_MANAGEMENT_CONTEXT;
 import static org.opends.server.util.ServerConstants.*;
 import static org.forgerock.opendj.config.client.ldap.LDAPManagementContext.newManagementContext;
 import static org.forgerock.opendj.config.client.ldap.LDAPManagementContext.newLDIFManagementContext;
@@ -23,6 +24,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.file.Paths;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.opendj.adapter.server3x.Adapters;
@@ -34,10 +36,10 @@
 import org.forgerock.opendj.ldap.LDAPConnectionFactory;
 import org.forgerock.opendj.ldap.requests.Requests;
 import org.forgerock.opendj.ldap.requests.SimpleBindRequest;
-import org.forgerock.opendj.server.config.client.RootCfgClient;
 import org.forgerock.util.Options;
-import org.forgerock.util.Pair;
+import org.forgerock.util.Reject;
 import org.opends.quicksetup.TempLogFile;
+import org.opends.server.config.ConfigConstants;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.tools.ImportLDIF;
@@ -48,6 +50,7 @@
 import org.opends.server.types.DirectoryEnvironmentConfig;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
+import org.opends.server.util.DynamicConstants;
 import org.opends.server.util.StaticUtils;
 
 /**
@@ -57,9 +60,9 @@
 public class EmbeddedDirectoryServer
 {
   private static final String EMBEDDED_OPEN_DJ_PREFIX = "embeddedOpenDJ";
-
+  private static final String ARCHIVE_ROOT_DIRECTORY = DynamicConstants.SHORT_NAME.toLowerCase();
   private static final String QUICKSETUP_ROOT_PROPERTY = "org.opends.quicksetup.Root";
-  private static final String QUICKSETUP_INSTANCE_PROPERTY = "org.opends.quicksetup.Root";
+  private static final String QUICKSETUP_INSTANCE_PROPERTY = "org.opends.quicksetup.instance";
 
   /** The parameters for install and instance directories, and configuration file of the server. */
   private final ConfigParameters configParams;
@@ -76,22 +79,23 @@
   /** The error stream used for feedback during operations on server. */
   private final OutputStream errStream;
 
-  /**
-   * Defines an embedded directory server, providing the output and error streams used for
-   * giving feedback during operations on the server.
-   *
-   * @param configParams
-   *          The basic configuration parameters for the server.
-   * @param connParams
-   *          The connection parameters for the server.
-   * @param out
-   *          Output stream used for feedback during operations on server
-   * @param err
-   *          Error stream used for feedback during operations on server
-   */
   private EmbeddedDirectoryServer(ConfigParameters configParams, ConnectionParameters connParams,
       OutputStream out, OutputStream err)
   {
+    Reject.ifNull(configParams.getServerRootDirectory());
+    if (connParams != null)
+    {
+      Reject.ifNull(
+        connParams.getHostName(),
+        connParams.getLdapPort(),
+        connParams.getBindDn(),
+        connParams.getBindPassword());
+    }
+    if (configParams.getConfigurationFile() == null)
+    {
+      // use the default path if configuration file is not provided
+      configParams.configurationFile(getDefaultConfigurationFilePath(configParams.getServerRootDirectory()));
+    }
     this.configParams = configParams;
     this.connectionParams = connParams;
     this.outStream = out;
@@ -101,7 +105,7 @@
       SimpleBindRequest authRequest = Requests.newSimpleBindRequest(
           connectionParams.getBindDn(), connectionParams.getBindPassword().toCharArray());
       ldapConnectionFactory = new LDAPConnectionFactory(
-          connectionParams.getHostname(),
+          connectionParams.getHostName(),
           connectionParams.getLdapPort(),
           Options.defaultOptions().set(LDAPConnectionFactory.AUTHN_BIND_REQUEST, authRequest));
     }
@@ -111,23 +115,21 @@
     }
   }
 
-  /**
-   * Defines an embedded directory server.
-   * <p>
-   * Output/error streams used for giving feedback during operations are default system ones.
-   *
-   * @param configParams
-   *          The basic configuration parameters for the server.
-   * @param connParams
-   *          The connection parameters for the server.
-   */
   private EmbeddedDirectoryServer(ConfigParameters configParams, ConnectionParameters connParams)
   {
     this(configParams, connParams, System.out, System.err);
   }
 
+  private static String getDefaultConfigurationFilePath(String serverRootDirectory)
+  {
+    return Paths.get(serverRootDirectory)
+        .resolve(ConfigConstants.CONFIG_DIR_NAME)
+        .resolve(ConfigConstants.CONFIG_FILE_NAME)
+        .toString();
+  }
+
   /**
-   * Defines an embedded directory server for any operation.
+   * Creates an instance of an embedded directory server for any operation.
    *
    * @param configParams
    *          The basic configuration parameters for the server.
@@ -137,16 +139,16 @@
    *          Output stream used for feedback during operations on server
    * @param err
    *          Error stream used for feedback during operations on server
-   * @return the directory server
+   * @return the embedded directory server
    */
-  public static EmbeddedDirectoryServer defineServer(ConfigParameters configParams,
+  public static EmbeddedDirectoryServer manageEmbeddedDirectoryServer(ConfigParameters configParams,
       ConnectionParameters connParams, OutputStream out, OutputStream err)
   {
     return new EmbeddedDirectoryServer(configParams, connParams, out, err);
   }
 
   /**
-   * Defines an embedded directory server for start/stop operation.
+   * Creates an instance of an embedded directory server for start/stop operation.
    * <p>
    * To be able to perform any operation on the server, use the alternative {@code defineServer()}
    * method.
@@ -159,14 +161,14 @@
    *          Error stream used for feedback during operations on server
    * @return the directory server
    */
-  public static EmbeddedDirectoryServer defineServerForStartStopOperations(ConfigParameters configParams,
+  public static EmbeddedDirectoryServer manageEmbeddedDirectoryServerForStartStop(ConfigParameters configParams,
       OutputStream out, OutputStream err)
   {
     return new EmbeddedDirectoryServer(configParams, null, out, err);
   }
 
   /**
-   * Defines an embedded directory server for start/stop operation.
+   * Creates an instance of an embedded directory server for start/stop operation.
    * <p>
    * To be able to perform any operation on the server, use the alternative {@code defineServer()}
    * method.
@@ -175,41 +177,17 @@
    *          The basic configuration parameters for the server.
    * @return the directory server
    */
-  public static EmbeddedDirectoryServer defineServerForStartStopOperations(ConfigParameters configParams)
+  public static EmbeddedDirectoryServer manageEmbeddedDirectoryServerForStartStop(
+      ConfigParameters configParams)
   {
     return new EmbeddedDirectoryServer(configParams, null, System.out, System.err);
   }
 
   /**
-   * Displays the replication status on the output stream defined for this server.
-   * <p>
-   * Displays a list with the basic replication configuration of all base DNs of
-   * the servers defined in the registration information.
-   *
-   * @param parameters
-   *            The parameters for the replication.
-   * @throws EmbeddedDirectoryServerException
-   *            If a problem occurs.
-   */
-  public void displayReplicationStatus(ReplicationParameters parameters) throws EmbeddedDirectoryServerException
-  {
-    checkConnectionParameters();
-    int returnCode = ReplicationCliMain.mainCLI(
-        parameters.toCommandLineArgumentsStatus(configParams.getConfigurationFile(), connectionParams),
-        !isRunning(), outStream, errStream);
-
-    if (returnCode != 0)
-    {
-      throw new EmbeddedDirectoryServerException(
-          ERR_EMBEDDED_SERVER_DISPLAY_REPLICATION_STATUS.get(configParams.getServerRootDirectory(), returnCode));
-    }
-  }
-
-  /**
-   * Enables replication between this directory server (first server) and another server
+   * Configures replication between this directory server (first server) and another server
    * (second server).
    * <p>
-   * Updates the configuration of the servers to replicate the data under the
+   * This method updates the configuration of the servers to replicate the data under the
    * base DN specified in the parameters.
    *
    * @param parameters
@@ -217,18 +195,70 @@
    * @throws EmbeddedDirectoryServerException
    *            If a problem occurs.
    */
-  public void enableReplication(ReplicationParameters parameters) throws EmbeddedDirectoryServerException
+  public void configureReplication(ReplicationParameters parameters) throws EmbeddedDirectoryServerException
   {
-    checkConnectionParameters();
+    Reject.checkNotNull(connectionParams);
     int returnCode = ReplicationCliMain.mainCLI(
-        parameters.toCommandLineArgumentsEnable(configParams.getConfigurationFile(), connectionParams),
+        parameters.toCommandLineArgumentsConfiguration(configParams.getConfigurationFile(), connectionParams),
         !isRunning(), outStream, errStream);
 
     if (returnCode != 0)
     {
-      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_ENABLE_REPLICATION.get(
-          configParams.getServerRootDirectory(), parameters.getReplicationPort1(), parameters.getHostname2(),
-          parameters.getReplicationPort2(), returnCode));
+      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_CONFIGURE_REPLICATION.get(
+          configParams.getServerRootDirectory(), parameters.getReplicationPortSource(),
+          parameters.getHostnameDestination(), parameters.getReplicationPortDestination(), returnCode));
+    }
+  }
+
+  /**
+   * Returns the configuration of this server, which can be read or updated.
+   * <p>
+   * The returned object is an instance of {@code ManagementContext} class, which allow access to the
+   * root configuration object using its {@code getRootConfiguration()} method.
+   * Starting from the root configuration, it is possible to access any configuration object, in order
+   * to perform read or update operations.
+   * <p>
+   * Note that {@code ManagementContext} instance must be closed after usage. It is recommended to use
+   * it inside a try-with-resource statement.
+   * <p>
+   * Example reading configuration:
+   * <pre>
+   *   try(ManagementContext config = server.getConfiguration()) {
+   *      List<String> syncProviders = config.getRootConfiguration().listSynchronizationProviders();
+   *      System.out.println("sync providers=" + syncProviders);
+   *   }
+   * </pre>
+   * <p>
+   * Example updating configuration:
+   * <pre>
+   *   try(ManagementContext config = server.getConfiguration()) {
+   *      JEBackendCfgClient userRoot = (JEBackendCfgClient) config.getRootConfiguration().getBackend("userRoot");
+   *      userRoot.setBaseDN(Arrays.asList(DN.valueOf("dc=example,dc=com")));
+   *      userRoot.setDBCachePercent(70);
+   *      // changes must be committed to be effective
+   *      userRoot.commit();
+   *   }
+   * </pre>
+   * @return the management context object which gives direct access to the root configuration of the server
+   * @throws EmbeddedDirectoryServerException
+   *            If the retrieval of the configuration fails
+   */
+  @SuppressWarnings("resource")
+  public ManagementContext getConfiguration() throws EmbeddedDirectoryServerException
+  {
+    try
+    {
+      if (isRunning())
+      {
+        Connection ldapConnection = ldapConnectionFactory.getConnection();
+        return newManagementContext(ldapConnection, LDAPProfile.getInstance());
+      }
+      return newLDIFManagementContext(new File(configParams.getConfigurationFile()));
+    }
+    catch (IOException e)
+    {
+      throw new EmbeddedDirectoryServerException(
+          ERR_EMBEDDED_SERVER_LDIF_MANAGEMENT_CONTEXT.get(configParams.getConfigurationFile()));
     }
   }
 
@@ -263,11 +293,10 @@
    * @throws EmbeddedDirectoryServerException
    *            If the import fails
    */
-  public void importData(ImportParameters parameters) throws EmbeddedDirectoryServerException
+  public void importLDIF(ImportParameters parameters) throws EmbeddedDirectoryServerException
   {
     checkServerIsRunning();
-    checkConnectionParameters();
-    int returnCode = ImportLDIF.mainImportLDIF(
+    Reject.checkNotNull(connectionParams);    int returnCode = ImportLDIF.mainImportLDIF(
         parameters.toCommandLineArguments(configParams.getConfigurationFile(), connectionParams),
         !isRunning(), outStream, errStream);
 
@@ -288,7 +317,7 @@
    */
   public void initializeReplication(ReplicationParameters parameters) throws EmbeddedDirectoryServerException
   {
-    checkConnectionParameters();
+    Reject.checkNotNull(connectionParams);
     int returnCode = ReplicationCliMain.mainCLI(
         parameters.toCommandLineArgumentsInitialize(configParams.getConfigurationFile(), connectionParams),
         !isRunning(), outStream, errStream);
@@ -296,12 +325,28 @@
     if (returnCode != 0)
     {
       throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_INITIALIZE_REPLICATION.get(
-          configParams.getServerRootDirectory(), connectionParams.getAdminPort(), parameters.getHostname2(),
-          parameters.getAdminPort2(), returnCode));
+          configParams.getServerRootDirectory(), connectionParams.getAdminPort(), parameters.getHostnameDestination(),
+          parameters.getAdminPortDestination(), returnCode));
     }
   }
 
   /**
+   * Indicates whether replication is currently running for the embedded server.
+   *
+   * @param parameters
+   *            The parameters for the replication.
+   * @return {@code true} if replication is running, {@code false} otherwise
+   */
+  public boolean isReplicationRunning(ReplicationParameters parameters)
+  {
+    Reject.checkNotNull(connectionParams);
+    int returnCode = ReplicationCliMain.mainCLI(
+        parameters.toCommandLineArgumentsStatus(configParams.getConfigurationFile(), connectionParams),
+        !isRunning(), outStream, errStream);
+    return returnCode == 0;
+  }
+
+  /**
    * Indicates whether this server is currently running.
    *
    * @return {@code true} if the server is currently running, or {@code false} if not.
@@ -312,50 +357,7 @@
   }
 
   /**
-   * Reads the configuration of this server with the provided configuration reader.
-   * <p>
-   * The configuration reader provides access to the root configuration of the directory,
-   * which can then be used to read any configuration object and return the result as an
-   * arbitrary object.
-   * <p>
-   * Example:
-   * <pre>
-   * server.readConfiguration(new DirectoryConfigReader<List<String>>() {
-   *   public List<String> read(RootCfgClient rootConfig) {
-   *    return Arrays.asList(rootConfig.listSynchronizationProviders());
-   *   }
-   * });
-   * </pre>
-   * @param <R>
-   *          the type of the returned result
-   * @param configReader
-   *          the reader of the configuration
-   * @return the result of the read
-   * @throws EmbeddedDirectoryServerException
-   *            If the read fails
-   */
-  public <R> R readConfiguration(DirectoryConfigReader<R> configReader) throws EmbeddedDirectoryServerException
-  {
-    checkConnectionParameters();
-    Pair<ManagementContext, Connection> contextAndConnection = getManagementContext();
-    try
-    {
-      RootCfgClient rootConfig = contextAndConnection.getFirst().getRootConfiguration();
-      return configReader.read(rootConfig);
-    }
-    catch (Exception e)
-    {
-      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_READ_CONFIG.get(
-          configParams.getServerRootDirectory(), StaticUtils.stackTraceToSingleLineString(e)));
-    }
-    finally
-    {
-      StaticUtils.close(contextAndConnection.getFirst(), contextAndConnection.getSecond());
-    }
-  }
-
-  /**
-   * Setups this server from the root directory.
+   * Set this server up from the root directory.
    * <p>
    * As a pre-requisite, the OpenDJ archive must have been previously extracted to some
    * directory. To perform a setup directly from an archive, see {@code setupFromArchive()}.
@@ -367,8 +369,7 @@
    */
   public void setup(SetupParameters parameters) throws EmbeddedDirectoryServerException
   {
-    checkConnectionParameters();
-
+    Reject.checkNotNull(connectionParams);
     System.setProperty(PROPERTY_SERVER_ROOT, configParams.getServerRootDirectory());
     System.setProperty(QUICKSETUP_ROOT_PROPERTY, configParams.getServerRootDirectory());
     String instanceDir = configParams.getServerInstanceDirectory() != null ?
@@ -388,27 +389,26 @@
   }
 
   /**
-   * Setups this server from the provided archive.
+   * Extracts the provided archive to the appropriate root directory of the server.
    * <p>
    * As the DJ archive includes the "opendj" directory, it is mandatory to have
-   * the root directory named "opendj" when using this method.
+   * the root directory named after it when using this method.
    *
    * @param openDJZipFile
    *            The OpenDJ server archive.
-   * @param parameters
-   *            The installation parameters.
    * @throws EmbeddedDirectoryServerException
-   *            If the setup fails for any reason.
+   *            If the extraction of the archive fails.
    */
-  public void setupFromArchive(File openDJZipFile, SetupParameters parameters) throws EmbeddedDirectoryServerException
+  public void extractArchiveForSetup(File openDJZipFile) throws EmbeddedDirectoryServerException
   {
-    checkConnectionParameters();
+    Reject.checkNotNull(connectionParams);
     try
     {
       File serverRoot = new File(configParams.getServerRootDirectory());
-      if (!serverRoot.getName().equals("opendj"))
+      if (!ARCHIVE_ROOT_DIRECTORY.equals(serverRoot.getName()))
       {
-        throw new EmbeddedDirectoryServerException(LocalizableMessage.raw("Wrong server root directory" + serverRoot));
+        throw new EmbeddedDirectoryServerException(
+            ERR_EMBEDDED_SERVER_ARCHIVE_SETUP_WRONG_ROOT_DIRECTORY.get(ARCHIVE_ROOT_DIRECTORY, serverRoot));
       }
       // the directory where the zip file is extracted should be one level up from the server root.
       File deployDirectory = serverRoot.getParentFile();
@@ -419,7 +419,6 @@
       throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_SETUP_EXTRACT_ARCHIVE.get(
           openDJZipFile, configParams.getServerRootDirectory(), StaticUtils.stackTraceToSingleLineString(e)));
     }
-    setup(parameters);
   }
 
   /**
@@ -522,47 +521,6 @@
   }
 
   /**
-   * Configures this server with the provided configuration updater.
-   * <p>
-   * The configuration updater provides access to the root configuration of the directory server,
-   * which can then be used to perform one or more modifications on any configuration object.
-   * <p>
-   * Example:
-   * <pre>
-   * server.configure(new DirectoryConfigUpdater() {
-   *
-   *   public void update(RootCfgClient rootConfig) {
-   *     JEBackendCfgClient userRoot = (JEBackendCfgClient) rootConfig.getBackend("userRoot");
-   *     userRoot.setBaseDN(Arrays.asList(DN.valueOf("dc=example,dc=com")));
-   *     userRoot.setDBCachePercent(70);
-   *     userRoot.commit();
-   *   }
-   * });
-   * </pre>
-   *
-   * @param configUpdater
-   *            updates the configuration
-   * @throws EmbeddedDirectoryServerException
-   *            If an error occurs.
-   */
-  public void updateConfiguration(DirectoryConfigUpdater configUpdater) throws EmbeddedDirectoryServerException
-  {
-    checkConnectionParameters();
-    Pair<ManagementContext, Connection> contextAndConnection = getManagementContext();
-    try {
-      RootCfgClient rootConfig = contextAndConnection.getFirst().getRootConfiguration();
-      configUpdater.update(rootConfig);
-    } catch (Exception e) {
-      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_UPDATE_CONFIG.get(
-          configParams.getServerRootDirectory(), StaticUtils.stackTraceToSingleLineString(e)));
-    }
-    finally
-    {
-      StaticUtils.close(contextAndConnection.getFirst(), contextAndConnection.getSecond());
-    }
-  }
-
-  /**
    * Upgrades this server.
    * <p>
    * Upgrades the server configuration and application data so that it is compatible
@@ -585,56 +543,11 @@
     }
   }
 
-  /**
-   * Interface to update the configuration of the directory server.
-   */
-  public interface DirectoryConfigUpdater
-  {
-    /**
-     * Updates the configuration, provided the root configuration object of the directory server.
-     *
-     * @param rootConfig
-     *          The root configuration of the server.
-     * @throws Exception
-     *          If an error occurs.
-     */
-    public void update(RootCfgClient rootConfig) throws Exception;
-  }
-
-  /**
-   * Interface to read the configuration of the directory server.
-   *
-   * @param <R>
-   *            The type of the result returned by the read operation.
-   */
-  public interface DirectoryConfigReader<R>
-  {
-    /**
-     * Reads the configuration, provided the root configuration object of the directory server.
-     *
-     * @param rootConfig
-     *          The root configuration of the server.
-     * @return the result of the read operation
-     * @throws Exception
-     *          If an error occurs.
-     */
-    public R read(RootCfgClient rootConfig) throws Exception;
-  }
-
-  private void checkConnectionParameters() throws EmbeddedDirectoryServerException
-  {
-    if (connectionParams == null)
-    {
-      throw new EmbeddedDirectoryServerException(LocalizableMessage.raw("Operation is not permitted"));
-    }
-  }
-
   private void checkServerIsRunning() throws EmbeddedDirectoryServerException
   {
     if (!isRunning())
     {
-      throw new EmbeddedDirectoryServerException(LocalizableMessage.raw(
-          "This operation is only available when server is online"));
+      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_IMPORT_DATA_SERVER_IS_NOT_RUNNING.get());
     }
   }
 
@@ -642,35 +555,8 @@
   {
     if (isRunning())
     {
-      throw new EmbeddedDirectoryServerException(LocalizableMessage.raw(
-          "This operation is only available when server is offline"));
-    }
-  }
+      throw new EmbeddedDirectoryServerException(ERR_EMBEDDED_SERVER_REBUILD_INDEX_SERVER_IS_RUNNING.get());
 
-  /**
-   * Retrieves the management context, and optionally a connection if the server is running, in order to
-   * give access to the configuration of the server.
-   */
-  private Pair<ManagementContext, Connection> getManagementContext() throws EmbeddedDirectoryServerException
-  {
-    Connection ldapConnection = null;
-    ManagementContext ctx = null;
-    try
-    {
-      if (isRunning())
-      {
-        ldapConnection = ldapConnectionFactory.getConnection();
-        ctx = newManagementContext(ldapConnection, LDAPProfile.getInstance());
-      }
-      else
-      {
-        ctx = newLDIFManagementContext(new File(configParams.getConfigurationFile()));
-      }
-      return Pair.of(ctx, ldapConnection);
-    }
-    catch (IOException e)
-    {
-      throw new EmbeddedDirectoryServerException(LocalizableMessage.raw("Error when initialising LDIF mgt ctx"));
     }
   }
 }

--
Gitblit v1.10.0