From 48deac6f808690e620a5444398c938dc8ef2a970 Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Mon, 23 May 2016 18:17:55 +0000
Subject: [PATCH] OPENDJ-3002 Fix upgrade to 4.0.0-OEM

---
 opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java          |   24 ++++++
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java      |  163 +++++++++++++++++++++++++---------------
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java |    7 +
 opendj-server-legacy/src/messages/org/opends/messages/tool.properties                |    4 
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java |   16 ++++
 5 files changed, 149 insertions(+), 65 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
index 9a9f377..920bf10 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
@@ -43,6 +43,7 @@
 import static org.opends.server.tools.upgrade.UpgradeTasks.*;
 import static org.opends.server.tools.upgrade.UpgradeUtils.batDirectory;
 import static org.opends.server.tools.upgrade.UpgradeUtils.binDirectory;
+import static org.opends.server.tools.upgrade.UpgradeUtils.instanceContainsJeBackends;
 import static org.opends.server.tools.upgrade.UpgradeUtils.libDirectory;
 import static org.opends.server.util.StaticUtils.*;
 
@@ -63,6 +64,9 @@
   /** The error exit code value. */
   static final int EXIT_CODE_ERROR = 1;
 
+  private static final String LOCAL_DB_BACKEND_OBJECT_CLASS = "ds-cfg-local-db-backend";
+  private static final String JE_BACKEND_OBJECT_CLASS = "ds-cfg-je-backend";
+
   /** If the upgrade contains some post upgrade tasks to do. */
   private static boolean hasPostUpgradeTask;
 
@@ -467,64 +471,9 @@
           }
         },
         deleteFile(new File(libDirectory, "je.jar")),
-        requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get(), NO,
-                renameLocalDBBackendDirectories(),
-                // Convert JE backends to PDB backends.
-                modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY.get(),
-                        "(objectclass=ds-cfg-local-db-backend)",
-                        "delete: objectclass",
-                        "objectclass: ds-cfg-local-db-backend",
-                        "-",
-                        "add: objectclass",
-                        "objectclass: ds-cfg-pluggable-backend",
-                        "objectclass: ds-cfg-pdb-backend",
-                        "-",
-                        "replace: ds-cfg-java-class",
-                        "ds-cfg-java-class: org.opends.server.backends.pdb.PDBBackend",
-                        "-",
-                        "delete: ds-cfg-preload-time-limit",
-                        "-",
-                        "delete: ds-cfg-import-thread-count",
-                        "-",
-                        "delete: ds-cfg-import-queue-size",
-                        "-",
-                        "delete: ds-cfg-db-txn-write-no-sync",
-                        "-",
-                        "delete: ds-cfg-db-run-cleaner",
-                        "-",
-                        "delete: ds-cfg-db-cleaner-min-utilization",
-                        "-",
-                        "delete: ds-cfg-db-evictor-lru-only",
-                        "-",
-                        "delete: ds-cfg-db-evictor-core-threads",
-                        "-",
-                        "delete: ds-cfg-db-evictor-max-threads",
-                        "-",
-                        "delete: ds-cfg-db-evictor-keep-alive",
-                        "-",
-                        "delete: ds-cfg-db-evictor-nodes-per-scan",
-                        "-",
-                        "delete: ds-cfg-db-log-file-max",
-                        "-",
-                        "delete: ds-cfg-db-log-filecache-size",
-                        "-",
-                        "delete: ds-cfg-db-logging-file-handler-on",
-                        "-",
-                        "delete: ds-cfg-db-logging-level",
-                        "-",
-                        "delete: ds-cfg-db-checkpointer-bytes-interval",
-                        "-",
-                        "delete: ds-cfg-db-checkpointer-wakeup-interval",
-                        "-",
-                        "delete: ds-cfg-db-num-lock-tables",
-                        "-",
-                        "delete: ds-cfg-db-num-cleaner-threads",
-                        "-",
-                        "delete: ds-cfg-je-property",
-                        "-",
-                        "delete: ds-cfg-subordinate-indexes-enabled",
-                        "-"
-                ),
+        requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get("3.0.0"), NO,
+                renameLocalDBBackendDirectories(LOCAL_DB_BACKEND_OBJECT_CLASS),
+                convertJEBackendsToPDBBackends(LOCAL_DB_BACKEND_OBJECT_CLASS),
                 // Convert JE backend indexes to PDB backend indexes.
                 modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_3_SUMMARY.get(),
                         "(objectclass=ds-cfg-local-db-index)",
@@ -639,10 +588,9 @@
         deleteConfigEntry(INFO_UPGRADE_TASK_CONFIGURATION_BACKEND_NOT_CONFIGURABLE.get(),
             "dn: ds-cfg-backend-id=config,cn=Backends,cn=config"));
 
-    /**
-     * All upgrades will refresh the server configuration schema and generate a new upgrade folder.
-     */
+    /** All upgrades will refresh the server configuration schema and generate a new upgrade folder. */
     registerLast(
+        performOEMMigrationIfNeeded(),
         copySchemaFile("02-config.ldif"),
         updateConfigUpgradeFolder(),
         postUpgradeRebuildIndexes());
@@ -650,6 +598,99 @@
     // @formatter:on
   }
 
+  /** If the upgraded version is OEM, migrates local-db backends to PDB, see OPENDJ-3002 **/
+  private static UpgradeTask performOEMMigrationIfNeeded() {
+    return conditionalUpgradeTasks(
+        isOemVersionAndNewerThan3dot0(),
+        deleteFile(new File(libDirectory, "je.jar")),
+        deleteFile(new File(libDirectory, "opendj-je-backend.jar")),
+        conditionalUpgradeTasks(
+            new UpgradeCondition() {
+                @Override
+                public boolean shouldPerformUpgradeTasks(final UpgradeContext context) throws ClientException {
+                    return instanceContainsJeBackends();
+                }
+            },
+            requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get("4.0.0"), NO,
+                    renameLocalDBBackendDirectories(JE_BACKEND_OBJECT_CLASS),
+                    convertJEBackendsToPDBBackends(JE_BACKEND_OBJECT_CLASS))
+        )
+    );
+  }
+
+  private static UpgradeCondition isOemVersionAndNewerThan3dot0() {
+    return new UpgradeCondition() {
+        @Override
+        public boolean shouldPerformUpgradeTasks(UpgradeContext context) throws ClientException {
+            return isOEMVersion()
+                && context.getFromVersion().isNewerThan(BuildVersion.valueOf("3.0.0"));
+        }
+
+        @Override
+        public String toString() {
+            return "is OEM version and from version >= 3.0.0";
+        }
+    };
+  }
+
+    private static UpgradeTask convertJEBackendsToPDBBackends(final String objectClass) {
+    return modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY.get(),
+        "(objectclass=" + objectClass + ")",
+        "delete: objectclass",
+        "objectclass: " + objectClass,
+        "-",
+        "add: objectclass",
+        "objectclass: ds-cfg-pluggable-backend",
+        "objectclass: ds-cfg-pdb-backend",
+        "-",
+        "replace: ds-cfg-java-class",
+        "ds-cfg-java-class: org.opends.server.backends.pdb.PDBBackend",
+        "-",
+        "delete: ds-cfg-preload-time-limit",
+        "-",
+        "delete: ds-cfg-import-thread-count",
+        "-",
+        "delete: ds-cfg-import-queue-size",
+        "-",
+        "delete: ds-cfg-db-txn-write-no-sync",
+        "-",
+        "delete: ds-cfg-db-run-cleaner",
+        "-",
+        "delete: ds-cfg-db-cleaner-min-utilization",
+        "-",
+        "delete: ds-cfg-db-evictor-lru-only",
+        "-",
+        "delete: ds-cfg-db-evictor-core-threads",
+        "-",
+        "delete: ds-cfg-db-evictor-max-threads",
+        "-",
+        "delete: ds-cfg-db-evictor-keep-alive",
+        "-",
+        "delete: ds-cfg-db-evictor-nodes-per-scan",
+        "-",
+        "delete: ds-cfg-db-log-file-max",
+        "-",
+        "delete: ds-cfg-db-log-filecache-size",
+        "-",
+        "delete: ds-cfg-db-logging-file-handler-on",
+        "-",
+        "delete: ds-cfg-db-logging-level",
+        "-",
+        "delete: ds-cfg-db-checkpointer-bytes-interval",
+        "-",
+        "delete: ds-cfg-db-checkpointer-wakeup-interval",
+        "-",
+        "delete: ds-cfg-db-num-lock-tables",
+        "-",
+        "delete: ds-cfg-db-num-cleaner-threads",
+        "-",
+        "delete: ds-cfg-je-property",
+        "-",
+        "delete: ds-cfg-subordinate-indexes-enabled",
+        "-"
+    );
+  }
+
   /**
    * Returns a list containing all the tasks which are required in order to upgrade
    * from {@code fromVersion} to {@code toVersion}.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
index 8af823d..2685e31 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
@@ -1033,8 +1033,11 @@
   /**
    * Creates backups of the local DB backends directories by renaming adding them a ".bak" suffix.
    *  e.g "userRoot" would become "userRoot.bak"
+   *
+   *  @param backendObjectClass
+   *          The backend object class name.
    */
-  static UpgradeTask renameLocalDBBackendDirectories()
+  static UpgradeTask renameLocalDBBackendDirectories(final String backendObjectClass)
   {
     return new AbstractUpgradeTask()
     {
@@ -1045,7 +1048,7 @@
       {
         try
         {
-          Filter filter = Filter.equality("objectclass", "ds-cfg-local-db-backend");
+          Filter filter = Filter.equality("objectclass", backendObjectClass);
           SearchRequest findLocalDBBackends = Requests.newSearchRequest(DN.rootDN(), SearchScope.WHOLE_SUBTREE, filter);
           try (final EntryReader jeBackends = searchConfigFile(findLocalDBBackends))
           {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java
index 2d34d8e..f6fdd6c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java
@@ -766,6 +766,22 @@
     return indexesToRebuild;
   }
 
+  /** Returns {@code true} if the installed instance contains at least one JE backend. */
+  static boolean instanceContainsJeBackends()
+  {
+    final SearchRequest sr = Requests.newSearchRequest(
+            "", SearchScope.WHOLE_SUBTREE, "(objectclass=ds-cfg-je-backend)", "dn");
+    try (final EntryReader entryReader = searchConfigFile(sr))
+    {
+      return entryReader.hasNext();
+    }
+    catch (final IOException unlikely)
+    {
+      logger.error(ERR_UPGRADE_READING_CONF_FILE.get(unlikely.getMessage()));
+      return true;
+    }
+  }
+
   /** Prevent instantiation. */
   private UpgradeUtils()
   {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java b/opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java
index 2af94a1..2312c91 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java
@@ -278,4 +278,28 @@
     }
     return Utils.joinAsString(".", major, minor, point);
   }
+
+  /**
+   * Returns {@code true} if the version is newer than the provided version.
+   *
+   * @param version
+   *          The version to be compared
+   * @return {@code true} if the version is newer than the provided version.
+   */
+  public boolean isNewerThan(final BuildVersion version)
+  {
+    return this.compareTo(version) >= 0;
+  }
+
+  /**
+   * Returns {@code true} if the version is older than the provided version.
+   *
+   * @param version
+   *          The version to be compared
+   * @return {@code true} if the version is older than the provided version.
+   */
+  public boolean isOlderThan(final BuildVersion version)
+  {
+    return this.compareTo(version) <= 0;
+  }
 }
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
index d935bfa..a11cbbc 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
@@ -2599,12 +2599,12 @@
 SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS_20016=\
   <xinclude:include href="variablelist-backendstat-index-status.xml" />
 INFO_INSTALLDS_BACKEND_TYPE_USED_20017=Backend Type: %s
-INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY_20018=WARNING: OpenDJ 3.0.0 OEM Edition removes support for the \
+INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY_20018=WARNING: OpenDJ %s OEM Edition removes support for the \
  Berkeley JE backend.\n\nThe upgrade tool will reconfigure all JE \
  backends as PDB backends.\n\nAfter the upgrade the new PDB backend(s) \
  will be empty. It is therefore very strongly recommended that any data that was \
  in the JE backends be exported to LDIF so that it can be re-imported once the \
- upgrade completes.\n\n
+ upgrade completes
 INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY_20019=Reconfiguring local-db backends to PDB backends
 INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_3_SUMMARY_20020=Reconfiguring local-db backend indexes to PDB backend indexes
 INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_4_SUMMARY_20021=Reconfiguring local-db backend VLV indexes to PDB backend VLV indexes

--
Gitblit v1.10.0