From 4bf97a0d53caa31340e8ffdccba31cdc4cf02dbd Mon Sep 17 00:00:00 2001
From: Gaetan Boismal <gaetan.boismal@forgerock.com>
Date: Fri, 15 May 2015 12:50:21 +0000
Subject: [PATCH] OPENDJ-1991 Code cleanup

---
 opendj-server-legacy/src/main/java/org/opends/server/types/BackupDirectory.java             |  559 +++++++++++++-------------------
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BackupListPanel.java |  400 ++++++++++------------
 opendj-server-legacy/src/main/java/org/opends/server/types/BackupInfo.java                  |    6 
 3 files changed, 407 insertions(+), 558 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BackupListPanel.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BackupListPanel.java
index fae01e9..a7e8e3b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BackupListPanel.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/BackupListPanel.java
@@ -30,7 +30,8 @@
 import static org.opends.messages.AdminToolMessages.*;
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.messages.ToolMessages.*;
-import static com.forgerock.opendj.util.OperatingSystem.isWindows;
+
+import static com.forgerock.opendj.util.OperatingSystem.*;
 
 import java.awt.Component;
 import java.awt.Dimension;
@@ -42,11 +43,9 @@
 import java.util.ArrayList;
 import java.util.GregorianCalendar;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-
 import javax.swing.Box;
 import javax.swing.JButton;
 import javax.swing.JLabel;
@@ -61,6 +60,8 @@
 import javax.swing.event.ListSelectionListener;
 import javax.swing.table.TableColumn;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.guitools.controlpanel.datamodel.BackupDescriptor;
 import org.opends.guitools.controlpanel.datamodel.BackupTableModel;
 import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
@@ -69,94 +70,68 @@
 import org.opends.guitools.controlpanel.ui.renderer.BackupTableCellRenderer;
 import org.opends.guitools.controlpanel.util.BackgroundTask;
 import org.opends.guitools.controlpanel.util.Utilities;
+import org.opends.quicksetup.Installation;
 import org.opends.server.types.BackupDirectory;
 import org.opends.server.types.BackupInfo;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.util.StaticUtils;
 
-/**
- * Abstract class used to refactor code in panels that contain a backup list on
- * it.
- *
- */
+/** Abstract class used to refactor code in panels that contain a backup list on it. */
 public abstract class BackupListPanel extends StatusGenericPanel
 {
   private static final long serialVersionUID = -4804555239922795163L;
 
-  /**
-   * The text field containing the parent directory.
-   */
+  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
+
+  /** The refreshing list message, displayed when the list of backups is refreshed. */
+  protected static final LocalizableMessage REFRESHING_LIST = INFO_CTRL_PANEL_REFRESHING_LIST_SUMMARY.get();
+
+  /** The message informing that no backups where found. */
+  protected static final LocalizableMessage NO_BACKUPS_FOUND = INFO_CTRL_PANEL_NO_BACKUPS_FOUND.get();
+
+  private static final String DUMMY_PARENT_PATH = "/local/OpenDJ-X.X.X/bak";
+
+  /** The text field containing the parent directory. */
   protected JTextField parentDirectory;
 
-  /**
-   * The refreshing list message, displayed when the list of backups is
-   * refreshed.
-   */
-  protected final LocalizableMessage REFRESHING_LIST =
-    INFO_CTRL_PANEL_REFRESHING_LIST_SUMMARY.get();
-
-  /**
-   * The message informing that no backups where found.
-   */
-  protected final LocalizableMessage NO_BACKUPS_FOUND =
-    INFO_CTRL_PANEL_NO_BACKUPS_FOUND.get();
-
-  /**
-   * Label for the path field.
-   */
+  /** Label for the path field. */
   protected JLabel lPath;
-  /**
-   * Label for the list.
-   */
+
+  /** Label for the list. */
   protected JLabel lAvailableBackups;
-  /**
-   * Refreshing list label (displayed instead of the list when this one is
-   * being refreshed).
-   */
+
+  /** Refreshing list label (displayed instead of the list when this one is being refreshed). */
   protected JLabel lRefreshingList;
-  /**
-   * Refresh list button.
-   */
+
+  /** Refresh list button. */
   protected JButton refreshList;
-  /**
-   * Verify backup button.
-   */
+
+  /** Verify backup button. */
   protected JButton verifyBackup;
-  /**
-   * Browse button.
-   */
+
+  /** Browse button. */
   protected JButton browse;
-  /**
-   * The scroll that contains the list of backups (actually is a table).
-   */
+
+  /** The scroll that contains the list of backups (actually is a table). */
   protected JScrollPane tableScroll;
-  /**
-   * The list of backups.
-   */
+
+  /** The list of backups. */
   protected JTable backupList;
 
   private JLabel lRemoteFileHelp;
 
-  /**
-   * Whether the backup parent directory has been initialized with a value or
-   * not.
-   */
+  /** Whether the backup parent directory has been initialized with a value. */
   private boolean backupDirectoryInitialized;
 
   private BackupTableCellRenderer renderer;
 
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
-
-  /**
-   * Default constructor.
-   *
-   */
+  /** Default constructor. */
   protected BackupListPanel()
   {
     super();
   }
 
-  /** {@inheritDoc} */
+  @Override
   public Component getPreferredFocusComponent()
   {
     return parentDirectory;
@@ -164,6 +139,7 @@
 
   /**
    * Returns the selected backup in the list.
+   *
    * @return the selected backup in the list.
    */
   protected BackupDescriptor getSelectedBackup()
@@ -172,33 +148,33 @@
     int row = backupList.getSelectedRow();
     if (row != -1)
     {
-      BackupTableModel model = (BackupTableModel)backupList.getModel();
+      BackupTableModel model = (BackupTableModel) backupList.getModel();
       backup = model.get(row);
     }
     return backup;
   }
 
   /**
-   * Notification that the verify button was clicked.  Whatever is required
-   * to be done must be done in this method.
-   *
+   * Notification that the verify button was clicked. Whatever is required to be
+   * done must be done in this method.
    */
   protected abstract void verifyBackupClicked();
 
   /**
    * Creates the components and lays them in the panel.
-   * @param gbc the grid bag constraints to be used.
+   *
+   * @param gbc
+   *          the grid bag constraints to be used.
    */
   protected void createLayout(GridBagConstraints gbc)
   {
-    gbc.gridy ++;
+    gbc.gridy++;
     gbc.anchor = GridBagConstraints.WEST;
     gbc.weightx = 0.0;
     gbc.fill = GridBagConstraints.NONE;
     gbc.gridwidth = 1;
     gbc.insets.left = 0;
-    lPath = Utilities.createPrimaryLabel(
-        INFO_CTRL_PANEL_BACKUP_PATH_LABEL.get());
+    lPath = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_BACKUP_PATH_LABEL.get());
     add(lPath, gbc);
 
     gbc.gridx = 1;
@@ -210,27 +186,24 @@
     browse = Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
     browse.setOpaque(false);
     browse.addActionListener(
-        new BrowseActionListener(parentDirectory,
-            BrowseActionListener.BrowseType.LOCATION_DIRECTORY,  this));
+        new BrowseActionListener(parentDirectory, BrowseActionListener.BrowseType.LOCATION_DIRECTORY, this));
     gbc.gridx = 2;
     gbc.weightx = 0.0;
     add(browse, gbc);
 
-    lRemoteFileHelp = Utilities.createInlineHelpLabel(
-        INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
+    lRemoteFileHelp = Utilities.createInlineHelpLabel(INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get());
     gbc.gridx = 1;
     gbc.gridwidth = 2;
     gbc.insets.top = 3;
     gbc.insets.left = 10;
-    gbc.gridy ++;
+    gbc.gridy++;
     add(lRemoteFileHelp, gbc);
 
     gbc.gridx = 0;
-    gbc.gridy ++;
+    gbc.gridy++;
     gbc.insets.top = 10;
     gbc.insets.left = 0;
-    lAvailableBackups = Utilities.createPrimaryLabel(
-        INFO_CTRL_PANEL_AVAILABLE_BACKUPS_LABEL.get());
+    lAvailableBackups = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_AVAILABLE_BACKUPS_LABEL.get());
     gbc.anchor = GridBagConstraints.NORTHWEST;
     gbc.fill = GridBagConstraints.NONE;
     gbc.gridwidth = 1;
@@ -255,13 +228,12 @@
       model.add(backup);
     }
     backupList.setModel(model);
-    backupList.getSelectionModel().setSelectionMode(
-        ListSelectionModel.SINGLE_SELECTION);
+    backupList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     backupList.setShowGrid(false);
     backupList.setIntercellSpacing(new Dimension(0, 0));
     renderer = new BackupTableCellRenderer();
     renderer.setParentPath(new File(DUMMY_PARENT_PATH));
-    for (int i=0; i<model.getColumnCount(); i++)
+    for (int i = 0; i < model.getColumnCount(); i++)
     {
       TableColumn col = backupList.getColumn(model.getColumnName(i));
       col.setCellRenderer(renderer);
@@ -275,7 +247,7 @@
     add(tableScroll, gbc);
     lRefreshingList.setPreferredSize(tableScroll.getPreferredSize());
 
-    gbc.gridy ++;
+    gbc.gridy++;
     gbc.anchor = GridBagConstraints.EAST;
     gbc.weightx = 0.0;
     gbc.weighty = 0.0;
@@ -291,28 +263,26 @@
     gbc2.fill = GridBagConstraints.HORIZONTAL;
     gbc2.weightx = 1.0;
     buttonPanel.add(Box.createHorizontalGlue(), gbc2);
-    refreshList = Utilities.createButton(
-        INFO_CTRL_PANEL_REFRESH_LIST_BUTTON_LABEL.get());
+    refreshList = Utilities.createButton(INFO_CTRL_PANEL_REFRESH_LIST_BUTTON_LABEL.get());
     refreshList.setOpaque(false);
     refreshList.addActionListener(new ActionListener()
     {
-      /** {@inheritDoc} */
+      @Override
       public void actionPerformed(ActionEvent ev)
       {
         refreshList();
       }
     });
     gbc2.weightx = 0.0;
-    gbc2.gridx ++;
+    gbc2.gridx++;
     buttonPanel.add(refreshList, gbc2);
-    gbc2.gridx ++;
+    gbc2.gridx++;
     gbc2.insets.left = 5;
-    verifyBackup = Utilities.createButton(
-        INFO_CTRL_PANEL_VERIFY_BACKUP_BUTTON_LABEL.get());
+    verifyBackup = Utilities.createButton(INFO_CTRL_PANEL_VERIFY_BACKUP_BUTTON_LABEL.get());
     verifyBackup.setOpaque(false);
     verifyBackup.addActionListener(new ActionListener()
     {
-      /** {@inheritDoc} */
+      @Override
       public void actionPerformed(ActionEvent ev)
       {
         verifyBackupClicked();
@@ -320,7 +290,7 @@
     });
     ListSelectionListener listener = new ListSelectionListener()
     {
-      /** {@inheritDoc} */
+      @Override
       public void valueChanged(ListSelectionEvent ev)
       {
         BackupDescriptor backup = getSelectedBackup();
@@ -335,33 +305,30 @@
   /**
    * Refresh the list of backups by looking in the backups defined under the
    * provided parent backup directory.
-   *
    */
   protected void refreshList()
   {
     final boolean refreshEnabled = refreshList.isEnabled();
-
     refreshList.setEnabled(false);
     verifyBackup.setEnabled(false);
     tableScroll.setVisible(false);
     lRefreshingList.setText(REFRESHING_LIST.toString());
     lRefreshingList.setVisible(isLocal());
-    final int lastSelectedRow = backupList.getSelectedRow();
 
+    final int lastSelectedRow = backupList.getSelectedRow();
     final String parentPath = parentDirectory.getText();
-    BackgroundTask<Set<BackupInfo>> worker =
-      new BackgroundTask<Set<BackupInfo>>()
+
+    BackgroundTask<Set<BackupInfo>> worker = new BackgroundTask<Set<BackupInfo>>()
     {
-      /** {@inheritDoc} */
+      @Override
       public Set<BackupInfo> processBackgroundTask() throws Throwable
       {
         // Open the backup directory and make sure it is valid.
-        LinkedHashSet<BackupInfo> backups = new LinkedHashSet<BackupInfo>();
+        Set<BackupInfo> backups = new LinkedHashSet<>();
         Throwable firstThrowable = null;
         try
         {
-          BackupDirectory backupDir =
-            BackupDirectory.readBackupDirectoryDescriptor(parentPath);
+          BackupDirectory backupDir = BackupDirectory.readBackupDirectoryDescriptor(parentPath);
           backups.addAll(backupDir.getBackups().values());
         }
         catch (Throwable t)
@@ -371,30 +338,27 @@
         // Check the subdirectories
         File f = new File(parentPath);
 
-        // Check the first level of directories (we might have done a backup
-        // of one backend and then a backup of several backends under the
-        // same directory).
+        // Check the first level of directories (we might have done
+        // a backup of one backend and then a backup of several backends under the same directory).
         if (f.isDirectory())
         {
           File[] children = f.listFiles();
-          for (int i=0; i<children.length; i++)
+          for (int i = 0; i < children.length; i++)
           {
             if (children[i].isDirectory())
             {
               try
               {
                 BackupDirectory backupDir =
-                  BackupDirectory.readBackupDirectoryDescriptor(
-                      children[i].getAbsolutePath());
+                    BackupDirectory.readBackupDirectoryDescriptor(children[i].getAbsolutePath());
 
                 backups.addAll(backupDir.getBackups().values());
               }
               catch (Throwable t2)
               {
-                if (!children[i].getName().equals("tasks") &&
-                    (firstThrowable != null))
+                if (!children[i].getName().equals("tasks") && firstThrowable != null)
                 {
-                  logger.warn(LocalizableMessage.raw("Error searching backup: "+t2, t2));
+                  logger.warn(LocalizableMessage.raw("Error searching backup: " + t2, t2));
                 }
               }
             }
@@ -407,79 +371,24 @@
         return backups;
       }
 
-      /** {@inheritDoc} */
-      public void backgroundTaskCompleted(Set<BackupInfo> returnValue,
-          Throwable t)
+      @Override
+      public void backgroundTaskCompleted(Set<BackupInfo> returnValue, Throwable t)
       {
-        BackupTableModel model = (BackupTableModel)backupList.getModel();
+        BackupTableModel model = (BackupTableModel) backupList.getModel();
         model.clear();
         renderer.setParentPath(new File(parentPath));
         if (t == null)
         {
-          if (!returnValue.isEmpty())
-          {
-            for (BackupInfo backup : returnValue)
-            {
-              model.add(new BackupDescriptor(backup));
-            }
-            model.fireTableDataChanged();
-            Utilities.updateTableSizes(backupList);
-            tableScroll.setVisible(true);
-            lRefreshingList.setVisible(false);
-          }
-          else
-          {
-            model.fireTableDataChanged();
-            lRefreshingList.setText(NO_BACKUPS_FOUND.toString());
-            lRefreshingList.setVisible(isLocal());
-          }
-          errorPane.setVisible(false);
-          // This is done to perform checks against whether we require to
-          // display an error message or not.
-          configurationChanged(new ConfigurationChangeEvent(null,
-              getInfo().getServerDescriptor()));
+          performSuccessActions(returnValue, model);
         }
         else
         {
-          model.fireTableDataChanged();
-          boolean displayError = true;
-          if (t instanceof OpenDsException)
-          {
-            OpenDsException e = (OpenDsException)t;
-            if (StaticUtils.hasDescriptor(e.getMessageObject(),
-                ERR_BACKUPDIRECTORY_NO_DESCRIPTOR_FILE))
-            {
-              displayError = false;
-            }
-          }
-          if (displayError)
-          {
-            LocalizableMessage details = ERR_RESTOREDB_CANNOT_READ_BACKUP_DIRECTORY.get(
-              parentDirectory.getText(), StaticUtils.getExceptionMessage(t));
-
-            updateErrorPane(errorPane,
-                ERR_ERROR_SEARCHING_BACKUPS_SUMMARY.get(),
-                ColorAndFontConstants.errorTitleFont,
-                details,
-                errorPane.getFont());
-            packParentDialog();
-          }
-          errorPane.setVisible(displayError);
-
-          if (!displayError)
-          {
-            // This is done to perform checks against whether we require to
-            // display an error message or not.
-            configurationChanged(new ConfigurationChangeEvent(null,
-                getInfo().getServerDescriptor()));
-          }
-
-          lRefreshingList.setText(NO_BACKUPS_FOUND.toString());
+          performErrorActions(t, model);
         }
+
         refreshList.setEnabled(refreshEnabled);
         verifyBackup.setEnabled(getSelectedBackup() != null);
-        if ((lastSelectedRow != -1) &&
-            (lastSelectedRow < backupList.getRowCount()))
+        if (lastSelectedRow != -1 && lastSelectedRow < backupList.getRowCount())
         {
           backupList.setRowSelectionInterval(lastSelectedRow, lastSelectedRow);
         }
@@ -488,77 +397,111 @@
           backupList.setRowSelectionInterval(0, 0);
         }
       }
+
+      private void performSuccessActions(Set<BackupInfo> returnValue, BackupTableModel model)
+      {
+        if (!returnValue.isEmpty())
+        {
+          for (BackupInfo backup : returnValue)
+          {
+            model.add(new BackupDescriptor(backup));
+          }
+          Utilities.updateTableSizes(backupList);
+          tableScroll.setVisible(true);
+          lRefreshingList.setVisible(false);
+        }
+        else
+        {
+          lRefreshingList.setText(NO_BACKUPS_FOUND.toString());
+          lRefreshingList.setVisible(isLocal());
+        }
+        updateUI(true, model);
+      }
+
+      private void performErrorActions(Throwable t, BackupTableModel model)
+      {
+        boolean displayError = true;
+        if (t instanceof OpenDsException)
+        {
+          OpenDsException e = (OpenDsException) t;
+          if (StaticUtils.hasDescriptor(e.getMessageObject(), ERR_BACKUPDIRECTORY_NO_DESCRIPTOR_FILE))
+          {
+            displayError = false;
+          }
+        }
+
+        if (displayError)
+        {
+          LocalizableMessage details = ERR_RESTOREDB_CANNOT_READ_BACKUP_DIRECTORY.get(
+              parentDirectory.getText(), StaticUtils.getExceptionMessage(t));
+
+          updateErrorPane(errorPane,
+                          ERR_ERROR_SEARCHING_BACKUPS_SUMMARY.get(),
+                          ColorAndFontConstants.errorTitleFont,
+                          details,
+                          errorPane.getFont());
+          packParentDialog();
+        }
+        updateUI(false, model);
+     }
+
+      private void updateUI(boolean isSuccess, BackupTableModel model)
+      {
+        model.fireTableDataChanged();
+        errorPane.setVisible(!isSuccess);
+        if (isSuccess)
+        {
+          // This is done to perform checks against whether we require to display an error message.
+          configurationChanged(new ConfigurationChangeEvent(null, getInfo().getServerDescriptor()));
+        }
+        else
+        {
+          lRefreshingList.setText(NO_BACKUPS_FOUND.toString());
+        }
+      }
     };
     worker.startBackgroundTask();
   }
 
-  private final String DUMMY_PARENT_PATH = "/local/OpenDJ-X.X.X/bak";
+
   /**
-   * Creates a list with backup descriptor.  This is done simply to have a good
-   * initial size for the table.
+   * Creates a list with backup descriptor.
+   * This is done simply to have a good initial size for the table.
+   *
    * @return a list with bogus backup descriptors.
    */
-  private ArrayList<BackupDescriptor> createDummyBackupList()
+  private List<BackupDescriptor> createDummyBackupList()
   {
-    ArrayList<BackupDescriptor> list = new ArrayList<BackupDescriptor>();
-    list.add(new BackupDescriptor(
-        new File(DUMMY_PARENT_PATH+"/200704201567Z"),
-        new GregorianCalendar(2007, 5, 20, 8, 10).getTime(),
-        BackupDescriptor.Type.FULL, "id"));
-    list.add(new BackupDescriptor(
-        new File(DUMMY_PARENT_PATH+"/200704201567Z"),
-        new GregorianCalendar(2007, 5, 22, 8, 10).getTime(),
-        BackupDescriptor.Type.INCREMENTAL, "id"));
-    list.add(new BackupDescriptor(
-        new File(DUMMY_PARENT_PATH+"/200704221567Z"),
-        new GregorianCalendar(2007, 5, 25, 8, 10).getTime(),
-        BackupDescriptor.Type.INCREMENTAL, "id"));
+    List<BackupDescriptor> list = new ArrayList<>();
+    list.add(new BackupDescriptor(new File(DUMMY_PARENT_PATH + "/200704201567Z"),
+             new GregorianCalendar(2007, 5, 20, 8, 10).getTime(), BackupDescriptor.Type.FULL, "id"));
+    list.add(new BackupDescriptor(new File(DUMMY_PARENT_PATH + "/200704201567Z"),
+             new GregorianCalendar(2007, 5, 22, 8, 10).getTime(), BackupDescriptor.Type.INCREMENTAL, "id"));
+    list.add(new BackupDescriptor(new File(DUMMY_PARENT_PATH + "/200704221567Z"),
+             new GregorianCalendar(2007, 5, 25, 8, 10).getTime(), BackupDescriptor.Type.INCREMENTAL, "id"));
     return list;
   }
 
-  /** {@inheritDoc} */
-  public void configurationChanged(ConfigurationChangeEvent ev)
+  @Override
+  public void configurationChanged(final ConfigurationChangeEvent ev)
   {
-    ServerDescriptor desc = ev.getNewDescriptor();
-
-    if (!backupDirectoryInitialized &&
-        (parentDirectory.getText().length() == 0))
+    if (!backupDirectoryInitialized && parentDirectory.getText().length() == 0)
     {
-      String path;
-
-      if (desc.isLocal() || (desc.isWindows() == isWindows()))
-      {
-        File f = new File(desc.getInstancePath(),
-            org.opends.quicksetup.Installation.BACKUPS_PATH_RELATIVE);
-        try
-        {
-          path = f.getCanonicalPath();
-        }
-        catch (Throwable t)
-        {
-          path = f.getAbsolutePath();
-        }
-      }
-      else
-      {
-        String separator = desc.isWindows() ? "\\" : "/";
-        path = desc.getInstancePath() + separator +
-        org.opends.quicksetup.Installation.BACKUPS_PATH_RELATIVE;
-      }
-
-      final String fPath = path;
       SwingUtilities.invokeLater(new Runnable()
       {
+        @Override
         public void run()
         {
-          parentDirectory.setText(fPath);
+          parentDirectory.setText(getBackupPath(ev.getNewDescriptor()));
           refreshList();
           backupDirectoryInitialized = true;
         }
       });
     }
+
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         lRemoteFileHelp.setVisible(!isLocal());
@@ -571,7 +514,28 @@
     });
   }
 
-  /** {@inheritDoc} */
+  private String getBackupPath(ServerDescriptor desc)
+  {
+    if (desc.isLocal() || desc.isWindows() == isWindows())
+    {
+      File f = new File(desc.getInstancePath(), Installation.BACKUPS_PATH_RELATIVE);
+      try
+      {
+        return f.getCanonicalPath();
+      }
+      catch (Throwable t)
+      {
+        return f.getAbsolutePath();
+      }
+    }
+    else
+    {
+      String separator = desc.isWindows() ? "\\" : "/";
+      return desc.getInstancePath() + separator + Installation.BACKUPS_PATH_RELATIVE;
+    }
+  }
+
+  @Override
   public void toBeDisplayed(boolean visible)
   {
     if (visible && backupDirectoryInitialized)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/BackupDirectory.java b/opendj-server-legacy/src/main/java/org/opends/server/types/BackupDirectory.java
index 24e47cc..e55ed9b 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/BackupDirectory.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/BackupDirectory.java
@@ -28,8 +28,6 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 
-
-
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -38,291 +36,284 @@
 import java.io.IOException;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import org.forgerock.opendj.config.server.ConfigException;
-
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
 
-
-
 /**
  * This class defines a data structure for holding information about a
- * filesystem directory that contains data for one or more backups
- * associated with a backend.  Only backups for a single backend may
- * be placed in any given directory.
+ * filesystem directory that contains data for one or more backups associated
+ * with a backend. Only backups for a single backend may be placed in any given
+ * directory.
  */
 @org.opends.server.types.PublicAPI(
-     stability=org.opends.server.types.StabilityLevel.VOLATILE,
-     mayInstantiate=true,
-     mayExtend=false,
-     mayInvoke=true)
+    stability = org.opends.server.types.StabilityLevel.VOLATILE,
+    mayInstantiate = true,
+    mayExtend = false,
+    mayInvoke = true)
 public final class BackupDirectory
 {
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
-
-
-
   /**
    * The name of the property that will be used to provide the DN of
    * the configuration entry for the backend associated with the
    * backups in this directory.
    */
-  public static final String PROPERTY_BACKEND_CONFIG_DN =
-       "backend_dn";
-
-
+  public static final String PROPERTY_BACKEND_CONFIG_DN = "backend_dn";
 
   /**
    * The DN of the configuration entry for the backend with which this
    * backup directory is associated.
    */
-  private DN configEntryDN;
+  private final DN configEntryDN;
 
   /**
    * The set of backups in the specified directory.  The iteration
    * order will be the order in which the backups were created.
    */
-  private LinkedHashMap<String,BackupInfo> backups;
+  private final Map<String, BackupInfo> backups;
 
   /** The filesystem path to the backup directory. */
-  private String path;
-
-
+  private final String path;
 
   /**
-   * Creates a new backup directory object with the provided
-   * information.
+   * Creates a new backup directory object with the provided information.
    *
-   * @param  path           The path to the directory containing the
-   *                        backup file(s).
-   * @param  configEntryDN  The DN of the configuration entry for the
-   *                        backend with which this backup directory
-   *                        is associated.
+   * @param path
+   *          The path to the directory containing the backup file(s).
+   * @param configEntryDN
+   *          The DN of the configuration entry for the backend with which this
+   *          backup directory is associated.
    */
   public BackupDirectory(String path, DN configEntryDN)
   {
-    this.path          = path;
-    this.configEntryDN = configEntryDN;
-
-    backups = new LinkedHashMap<String,BackupInfo>();
+    this(path, configEntryDN, null);
   }
 
-
-
   /**
-   * Creates a new backup directory object with the provided
-   * information.
+   * Creates a new backup directory object with the provided information.
    *
-   * @param  path           The path to the directory containing the
-   *                        backup file(s).
-   * @param  configEntryDN  The DN of the configuration entry for the
-   *                        backend with which this backup directory
-   *                        is associated.
-   * @param  backups        Information about the set of backups
-   *                        available within the specified directory.
+   * @param path
+   *          The path to the directory containing the backup file(s).
+   * @param configEntryDN
+   *          The DN of the configuration entry for the backend with which this
+   *          backup directory is associated.
+   * @param backups
+   *          Information about the set of backups available within the
+   *          specified directory.
    */
-  public BackupDirectory(String path, DN configEntryDN,
-                         LinkedHashMap<String,BackupInfo> backups)
+  public BackupDirectory(String path, DN configEntryDN, LinkedHashMap<String, BackupInfo> backups)
   {
-    this.path          = path;
+    this.path = path;
     this.configEntryDN = configEntryDN;
 
-    if (backups == null)
-    {
-      this.backups = new LinkedHashMap<String,BackupInfo>();
-    }
-    else
+    if (backups != null)
     {
       this.backups = backups;
     }
+    else
+    {
+      this.backups = new LinkedHashMap<>();
+    }
   }
 
-
-
   /**
-   * Retrieves the path to the directory containing the backup
-   * file(s).
+   * Retrieves the path to the directory containing the backup file(s).
    *
-   * @return  The path to the directory containing the backup file(s).
+   * @return The path to the directory containing the backup file(s).
    */
   public String getPath()
   {
     return path;
   }
 
-
-
   /**
-   * Retrieves the DN of the configuration entry for the backend with
-   * which this backup directory is associated.
+   * Retrieves the DN of the configuration entry for the backend with which this
+   * backup directory is associated.
    *
-   * @return  The DN of the configuration entry for the backend with
-   *          which this backup directory is associated.
+   * @return The DN of the configuration entry for the backend with which this
+   *         backup directory is associated.
    */
   public DN getConfigEntryDN()
   {
     return configEntryDN;
   }
 
-
-
   /**
-   * Retrieves the set of backups in this backup directory, as a
-   * mapping between the backup ID and the associated backup info.
-   * The iteration order for the map will be the order in which the
-   * backups were created.
+   * Retrieves the set of backups in this backup directory, as a mapping between
+   * the backup ID and the associated backup info. The iteration order for the
+   * map will be the order in which the backups were created.
    *
-   * @return  The set of backups in this backup directory.
+   * @return The set of backups in this backup directory.
    */
-  public LinkedHashMap<String,BackupInfo> getBackups()
+  public Map<String, BackupInfo> getBackups()
   {
     return backups;
   }
 
-
-
   /**
-   * Retrieves the backup info structure for the backup with the
-   * specified ID.
+   * Retrieves the backup info structure for the backup with the specified ID.
    *
-   * @param  backupID  The backup ID for the structure to retrieve.
-   *
-   * @return  The requested backup info structure, or
-   *          <CODE>null</CODE> if no such structure exists.
+   * @param backupID
+   *          The backup ID for the structure to retrieve.
+   * @return The requested backup info structure, or <CODE>null</CODE> if no such
+   *         structure exists.
    */
   public BackupInfo getBackupInfo(String backupID)
   {
     return backups.get(backupID);
   }
 
-
-
   /**
-   * Retrieves the most recent backup for this backup directory,
-   * according to the backup date.
+   * Retrieves the most recent backup for this backup directory, according to
+   * the backup date.
    *
-   * @return  The most recent backup for this backup directory,
-   *          according to the backup date, or <CODE>null</CODE> if
-   *          there are no backups in the backup directory.
+   * @return The most recent backup for this backup directory, according to the
+   *         backup date, or <CODE>null</CODE> if there are no backups in the
+   *         backup directory.
    */
   public BackupInfo getLatestBackup()
   {
     BackupInfo latestBackup = null;
     for (BackupInfo backup : backups.values())
     {
-      if (latestBackup == null)
+      if (latestBackup == null
+          || backup.getBackupDate().getTime() > latestBackup.getBackupDate().getTime())
       {
         latestBackup = backup;
       }
-      else
-      {
-        if (backup.getBackupDate().getTime() >
-            latestBackup.getBackupDate().getTime())
-        {
-          latestBackup = backup;
-        }
-      }
     }
 
     return latestBackup;
   }
 
-
-
   /**
-   * Adds information about the provided backup to this backup
-   * directory.
+   * Adds information about the provided backup to this backup directory.
    *
-   * @param  backupInfo  The backup info structure for the backup to
-   *                     be added.
-   *
-   * @throws  ConfigException  If another backup already exists with
-   *                           the same backup ID.
+   * @param backupInfo
+   *          The backup info structure for the backup to be added.
+   * @throws ConfigException
+   *           If another backup already exists with the same backup ID.
    */
-  public void addBackup(BackupInfo backupInfo)
-         throws ConfigException
+  public void addBackup(BackupInfo backupInfo) throws ConfigException
   {
     String backupID = backupInfo.getBackupID();
     if (backups.containsKey(backupID))
     {
-      LocalizableMessage message =
-          ERR_BACKUPDIRECTORY_ADD_DUPLICATE_ID.get(backupID, path);
-      throw new ConfigException(message);
+      throw new ConfigException(ERR_BACKUPDIRECTORY_ADD_DUPLICATE_ID.get(backupID, path));
     }
-
     backups.put(backupID, backupInfo);
   }
 
-
-
   /**
-   * Removes the backup with the specified backup ID from this backup
-   * directory.
+   * Removes the backup with the specified backup ID from this backup directory.
    *
-   * @param  backupID  The backup ID for the backup to remove from
-   *                   this backup directory.
-   *
-   * @throws  ConfigException  If it is not possible to remove the
-   *                           requested backup for some reason (e.g.,
-   *                           no such backup exists, or another
-   *                           backup is dependent on it).
+   * @param backupID
+   *          The backup ID for the backup to remove from this backup directory.
+   * @throws ConfigException
+   *           If it is not possible to remove the requested backup for some
+   *           reason (e.g., no such backup exists, or another backup is
+   *           dependent on it).
    */
-  public void removeBackup(String backupID)
-         throws ConfigException
+  public void removeBackup(String backupID) throws ConfigException
   {
-    if (! backups.containsKey(backupID))
+    if (!backups.containsKey(backupID))
     {
-      LocalizableMessage message =
-          ERR_BACKUPDIRECTORY_NO_SUCH_BACKUP.get(backupID, path);
-      throw new ConfigException(message);
+      throw new ConfigException(ERR_BACKUPDIRECTORY_NO_SUCH_BACKUP.get(backupID, path));
     }
 
     for (BackupInfo backup : backups.values())
     {
       if (backup.dependsOn(backupID))
       {
-        LocalizableMessage message = ERR_BACKUPDIRECTORY_UNRESOLVED_DEPENDENCY.
-            get(backupID, path, backup.getBackupID());
-        throw new ConfigException(message);
+        throw new ConfigException(ERR_BACKUPDIRECTORY_UNRESOLVED_DEPENDENCY.get(backupID, path, backup.getBackupID()));
       }
     }
 
     backups.remove(backupID);
   }
 
-
-
   /**
-   * Retrieves a path to the backup descriptor file that should be
-   * used for this backup directory.
+   * Retrieves a path to the backup descriptor file that should be used for this
+   * backup directory.
    *
-   * @return  A path to the backup descriptor file that should be used
-   *          for this backup directory.
+   * @return A path to the backup descriptor file that should be used for this
+   *         backup directory.
    */
   public String getDescriptorPath()
   {
     return path + File.separator + BACKUP_DIRECTORY_DESCRIPTOR_FILE;
   }
 
-
-
   /**
-   * Writes the descriptor with the information contained in this
-   * structure to disk in the appropriate directory.
+   * Writes the descriptor with the information contained in this structure to
+   * disk in the appropriate directory.
    *
-   * @throws  IOException  If a problem occurs while writing to disk.
+   * @throws IOException
+   *           If a problem occurs while writing to disk.
    */
-  public void writeBackupDirectoryDescriptor()
-         throws IOException
+  public void writeBackupDirectoryDescriptor() throws IOException
   {
-    // First make sure that the target directory exists.  If it
-    // doesn't, then try to create it.
+    // First make sure that the target directory exists.  If it doesn't, then try to create it.
+    createDirectoryIfNotExists();
+
+    // We'll write to a temporary file so that we won't destroy the live copy if a problem occurs.
+    String newDescriptorFilePath = path + File.separator + BACKUP_DIRECTORY_DESCRIPTOR_FILE + ".new";
+    File newDescriptorFile = new File(newDescriptorFilePath);
+    try (BufferedWriter writer = new BufferedWriter(new FileWriter(newDescriptorFile, false)))
+    {
+      // The first line in the file will only contain the DN of the configuration entry for the associated backend.
+      writer.write(PROPERTY_BACKEND_CONFIG_DN + "=" + configEntryDN);
+      writer.newLine();
+      writer.newLine();
+
+      // Iterate through all of the backups and add them to the file.
+      for (BackupInfo backup : backups.values())
+      {
+        List<String> backupLines = backup.encode();
+        for (String line : backupLines)
+        {
+          writer.write(line);
+          writer.newLine();
+        }
+
+        writer.newLine();
+      }
+
+      // At this point, the file should be complete so flush and close it.
+      writer.flush();
+    }
+
+    // If previous backup descriptor file exists, then rename it.
+    String descriptorFilePath = path + File.separator + BACKUP_DIRECTORY_DESCRIPTOR_FILE;
+    File descriptorFile = new File(descriptorFilePath);
+    renameOldBackupDescriptorFile(descriptorFile, descriptorFilePath);
+
+    // Rename the new descriptor file to match the previous one.
+    try
+    {
+      newDescriptorFile.renameTo(descriptorFile);
+    }
+    catch (Exception e)
+    {
+      logger.traceException(e);
+      LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_RENAME_NEW_DESCRIPTOR.get(
+          newDescriptorFilePath, descriptorFilePath, getExceptionMessage(e));
+      throw new IOException(message.toString());
+    }
+  }
+
+  private void createDirectoryIfNotExists() throws IOException
+  {
     File dir = new File(path);
-    if (! dir.exists())
+    if (!dir.exists())
     {
       try
       {
@@ -331,61 +322,18 @@
       catch (Exception e)
       {
         logger.traceException(e);
-
-        LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_CREATE_DIRECTORY.
-            get(path, getExceptionMessage(e));
+        LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_CREATE_DIRECTORY.get(path, getExceptionMessage(e));
         throw new IOException(message.toString());
       }
     }
-    else if (! dir.isDirectory())
+    else if (!dir.isDirectory())
     {
-      LocalizableMessage message = ERR_BACKUPDIRECTORY_NOT_DIRECTORY.get(path);
-      throw new IOException(message.toString());
+      throw new IOException(ERR_BACKUPDIRECTORY_NOT_DIRECTORY.get(path).toString());
     }
+  }
 
-
-    // We'll write to a temporary file so that we won't destroy the
-    // live copy if a problem occurs.
-    String newDescriptorFilePath = path + File.separator +
-                                   BACKUP_DIRECTORY_DESCRIPTOR_FILE +
-                                   ".new";
-    File newDescriptorFile = new File(newDescriptorFilePath);
-    BufferedWriter writer =
-         new BufferedWriter(new FileWriter(newDescriptorFile, false));
-
-
-    // The first line in the file will only contain the DN of the
-    // configuration entry for the associated backend.
-    writer.write(PROPERTY_BACKEND_CONFIG_DN + "=" + configEntryDN);
-    writer.newLine();
-    writer.newLine();
-
-
-    // Iterate through all of the backups and add them to the file.
-    for (BackupInfo backup : backups.values())
-    {
-      LinkedList<String> backupLines = backup.encode();
-
-      for (String line : backupLines)
-      {
-        writer.write(line);
-        writer.newLine();
-      }
-
-      writer.newLine();
-    }
-
-
-    // At this point, the file should be complete so flush and close
-    // it.
-    writer.flush();
-    writer.close();
-
-
-    // If previous backup descriptor file exists, then rename it.
-    String descriptorFilePath = path + File.separator +
-                                BACKUP_DIRECTORY_DESCRIPTOR_FILE;
-    File descriptorFile = new File(descriptorFilePath);
+  private void renameOldBackupDescriptorFile(File descriptorFile, String descriptorFilePath) throws IOException
+  {
     if (descriptorFile.exists())
     {
       String savedDescriptorFilePath = descriptorFilePath + ".save";
@@ -399,11 +347,8 @@
         catch (Exception e)
         {
           logger.traceException(e);
-
-          LocalizableMessage message =
-              ERR_BACKUPDIRECTORY_CANNOT_DELETE_SAVED_DESCRIPTOR.
-                get(savedDescriptorFilePath, getExceptionMessage(e),
-                    newDescriptorFilePath, descriptorFilePath);
+          LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_DELETE_SAVED_DESCRIPTOR.get(
+              savedDescriptorFilePath, getExceptionMessage(e), descriptorFilePath, descriptorFilePath);
           throw new IOException(message.toString());
         }
       }
@@ -415,162 +360,100 @@
       catch (Exception e)
       {
         logger.traceException(e);
-
-        LocalizableMessage message =
-            ERR_BACKUPDIRECTORY_CANNOT_RENAME_CURRENT_DESCRIPTOR.
-              get(descriptorFilePath, savedDescriptorFilePath,
-                  getExceptionMessage(e), newDescriptorFilePath,
-                  descriptorFilePath);
+        LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_RENAME_CURRENT_DESCRIPTOR.get(descriptorFilePath,
+            savedDescriptorFilePath, getExceptionMessage(e), descriptorFilePath, descriptorFilePath);
         throw new IOException(message.toString());
       }
     }
-
-
-    // Rename the new descriptor file to match the previous one.
-    try
-    {
-      newDescriptorFile.renameTo(descriptorFile);
-    }
-    catch (Exception e)
-    {
-      logger.traceException(e);
-
-      LocalizableMessage message =
-        ERR_BACKUPDIRECTORY_CANNOT_RENAME_NEW_DESCRIPTOR.
-            get(newDescriptorFilePath, descriptorFilePath,
-                getExceptionMessage(e));
-      throw new IOException(message.toString());
-    }
   }
 
-
-
   /**
-   * Reads the backup descriptor file in the specified path and uses
-   * the information it contains to create a new backup directory
-   * structure.
+   * Reads the backup descriptor file in the specified path and uses the
+   * information it contains to create a new backup directory structure.
    *
-   * @param  path  The path to the directory containing the backup
-   *               descriptor file to read.
-   *
-   * @return  The backup directory structure created from the contents
-   *          of the descriptor file.
-   *
-   * @throws  IOException  If a problem occurs while trying to read
-   *                       the contents of the descriptor file.
-   *
-   * @throws  ConfigException  If the contents of the descriptor file
-   *                           cannot be parsed to create a backup
-   *                           directory structure.
+   * @param path
+   *          The path to the directory containing the backup descriptor file to
+   *          read.
+   * @return The backup directory structure created from the contents of the
+   *         descriptor file.
+   * @throws IOException
+   *           If a problem occurs while trying to read the contents of the
+   *           descriptor file.
+   * @throws ConfigException
+   *           If the contents of the descriptor file cannot be parsed to create
+   *           a backup directory structure.
    */
-  public static BackupDirectory
-                     readBackupDirectoryDescriptor(String path)
-         throws IOException, ConfigException
+  public static BackupDirectory readBackupDirectoryDescriptor(String path) throws IOException, ConfigException
   {
     // Make sure that the descriptor file exists.
-    String descriptorFilePath = path + File.separator +
-                                BACKUP_DIRECTORY_DESCRIPTOR_FILE;
-    File descriptorFile = new File(descriptorFilePath);
-    if (! descriptorFile.exists())
+    String descriptorFilePath = path + File.separator + BACKUP_DIRECTORY_DESCRIPTOR_FILE;
+    if (!new File(descriptorFilePath).exists())
     {
-      LocalizableMessage message = ERR_BACKUPDIRECTORY_NO_DESCRIPTOR_FILE.get(
-          descriptorFilePath);
-      throw new ConfigException(message);
+      throw new ConfigException(ERR_BACKUPDIRECTORY_NO_DESCRIPTOR_FILE.get(descriptorFilePath));
     }
 
-
-    // Open the file for reading.  The first line should be the DN of
-    // the associated configuration entry.
-    BufferedReader reader =
-         new BufferedReader(new FileReader(descriptorFile));
-    String line = reader.readLine();
-    if ((line == null) || (line.length() == 0))
+    // Open the file for reading.
+    // The first line should be the DN of the associated configuration entry.
+    try (BufferedReader reader = new BufferedReader(new FileReader(descriptorFilePath)))
     {
-      LocalizableMessage message =
-        ERR_BACKUPDIRECTORY_CANNOT_READ_CONFIG_ENTRY_DN.
-            get(descriptorFilePath);
-      throw new ConfigException(message);
-    }
-    else if (! line.startsWith(PROPERTY_BACKEND_CONFIG_DN))
-    {
-      LocalizableMessage message = ERR_BACKUPDIRECTORY_FIRST_LINE_NOT_DN.get(
-          descriptorFilePath, line);
-      throw new ConfigException(message);
-    }
-
-    String dnString =
-         line.substring(PROPERTY_BACKEND_CONFIG_DN.length() + 1);
-    DN configEntryDN;
-    try
-    {
-      configEntryDN = DN.valueOf(dnString);
-    }
-    catch (DirectoryException de)
-    {
-      LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_DECODE_DN.get(
-          dnString, descriptorFilePath, de.getMessageObject());
-      throw new ConfigException(message, de);
-    }
-    catch (Exception e)
-    {
-      LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_DECODE_DN.get(
-          dnString, descriptorFilePath, getExceptionMessage(e));
-      throw new ConfigException(message, e);
-    }
-
-
-    // Create the backup directory structure from what we know so far.
-    BackupDirectory backupDirectory =
-         new BackupDirectory(path, configEntryDN);
-
-
-    // Iterate through the rest of the file and create the backup info
-    // structures.  Blank lines will be considered delimiters.
-    LinkedList<String> lines = new LinkedList<String>();
-    while (true)
-    {
-      line = reader.readLine();
-      if ((line == null) || (line.length() == 0))
+      String line = reader.readLine();
+      if (line == null || line.length() == 0)
       {
-        // It's a blank line or the end of the file.  If we have lines
-        // to process then do so.  Otherwise, move on.
-        if (lines.isEmpty())
+        throw new ConfigException(ERR_BACKUPDIRECTORY_CANNOT_READ_CONFIG_ENTRY_DN.get(descriptorFilePath));
+      }
+      else if (!line.startsWith(PROPERTY_BACKEND_CONFIG_DN))
+      {
+        throw new ConfigException(ERR_BACKUPDIRECTORY_FIRST_LINE_NOT_DN.get(descriptorFilePath, line));
+      }
+
+      String dnString = line.substring(PROPERTY_BACKEND_CONFIG_DN.length() + 1);
+      DN configEntryDN;
+      try
+      {
+        configEntryDN = DN.valueOf(dnString);
+      }
+      catch (DirectoryException de)
+      {
+        LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_DECODE_DN.get(
+            dnString, descriptorFilePath, de.getMessageObject());
+        throw new ConfigException(message, de);
+      }
+      catch (Exception e)
+      {
+        LocalizableMessage message = ERR_BACKUPDIRECTORY_CANNOT_DECODE_DN.get(
+            dnString, descriptorFilePath, getExceptionMessage(e));
+        throw new ConfigException(message, e);
+      }
+
+      // Create the backup directory structure from what we know so far.
+      BackupDirectory backupDirectory = new BackupDirectory(path, configEntryDN);
+
+      // Iterate through the rest of the file and create the backup info structures.
+      // Blank lines will be considered delimiters.
+      List<String> lines = new LinkedList<>();
+      while ((line = reader.readLine()) != null)
+      {
+        if (!line.isEmpty())
         {
-          if (line == null)
-          {
-            break;
-          }
-          else
-          {
-            continue;
-          }
+          lines.add(line);
+          continue;
         }
 
-
-        // Parse the lines that we read and add the backup info to the
-        // directory structure.
-        BackupInfo backupInfo = BackupInfo.decode(backupDirectory,
-                                                  lines);
-        backupDirectory.addBackup(backupInfo);
-        lines.clear();
-
-
-        // If it was the end of the file, then break out of the loop.
-        if (line == null)
-        {
-          break;
-        }
+        // We are on a delimiter blank line.
+        readBackupFromLines(backupDirectory, lines);
       }
-      else
-      {
-        lines.add(line);
-      }
+      readBackupFromLines(backupDirectory, lines);
+
+      return backupDirectory;
     }
+  }
 
-
-    // Close the reader and return the backup directory structure.
-    reader.close();
-    return backupDirectory;
+  private static void readBackupFromLines(BackupDirectory backupDirectory, List<String> lines) throws ConfigException
+  {
+    if (!lines.isEmpty())
+    {
+      backupDirectory.addBackup(BackupInfo.decode(backupDirectory, lines));
+      lines.clear();
+    }
   }
 }
-
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/BackupInfo.java b/opendj-server-legacy/src/main/java/org/opends/server/types/BackupInfo.java
index 7e88c06..17e7797 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/BackupInfo.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/BackupInfo.java
@@ -30,17 +30,19 @@
 
 
 
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.TimeZone;
 
 import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.server.util.Base64;
-
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.util.ServerConstants.*;
 import static org.opends.server.util.StaticUtils.*;
@@ -501,7 +503,7 @@
    *                           decode the backup info data.
    */
   public static BackupInfo decode(BackupDirectory backupDirectory,
-                                  LinkedList<String> encodedInfo)
+                                  List<String> encodedInfo)
          throws ConfigException
   {
     String                 backupID         = null;

--
Gitblit v1.10.0