From 9748e704763be89c57cad0a65fe74dce65fbcf84 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 07 Nov 2014 10:44:24 +0000
Subject: [PATCH] Code cleanup for the tools

---
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java                       |    6 
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java |  144 ++---
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java                |   46 -
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java      |  198 +------
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java                                |   21 
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java                    |   31 
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java                   |  271 ++--------
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java                            |   97 --
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java                                   |  203 ++++++-
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java                       |  114 +--
 opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java                            |  400 +++++----------
 11 files changed, 568 insertions(+), 963 deletions(-)

diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java
index ecaddad..04eab50 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ConnectionHandlersMonitoringTableModel.java
@@ -26,21 +26,20 @@
  */
 package org.opends.guitools.controlpanel.datamodel;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor.
-Protocol;
 import org.forgerock.i18n.LocalizableMessage;
+import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor.Protocol;
+
+import static org.opends.guitools.controlpanel.util.Utilities.*;
+import static org.opends.messages.AdminToolMessages.*;
 
 /**
  * The table model used to display the monitoring information of connection
  * handlers.
- *
  */
 public class ConnectionHandlersMonitoringTableModel extends
 MonitoringTableModel<ConnectionHandlerDescriptor,
@@ -48,9 +47,8 @@
 {
   private static final long serialVersionUID = -8891998773191495L;
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   protected Set<AddressConnectionHandlerDescriptor> convertToInternalData(
       Set<ConnectionHandlerDescriptor> newData)
   {
@@ -75,22 +73,18 @@
     return newAddresses;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int compare(AddressConnectionHandlerDescriptor desc1,
       AddressConnectionHandlerDescriptor desc2)
   {
-    int result;
     ArrayList<Integer> possibleResults = new ArrayList<Integer>();
 
     possibleResults.add(compareNames(desc1, desc2));
     possibleResults.addAll(getMonitoringPossibleResults(
         desc1.getMonitoringEntry(), desc2.getMonitoringEntry()));
 
-    result = possibleResults.get(getSortColumn());
+    int result = possibleResults.get(getSortColumn());
     if (result == 0)
     {
       for (int i : possibleResults)
@@ -112,58 +106,56 @@
   private int compareNames(AddressConnectionHandlerDescriptor ach1,
       AddressConnectionHandlerDescriptor ach2)
   {
-    int compare = 0;
-    boolean addressEqual = false;
-    if (ach1.getAddress() == null)
+    if (equal(ach1.getAddress(), ach2.getAddress()))
     {
-      if (ach2.getAddress() == null)
-      {
-        addressEqual = true;
-      }
+      Integer port1 = Integer.valueOf(ach1.getConnectionHandler().getPort());
+      Integer port2 = Integer.valueOf(ach2.getConnectionHandler().getPort());
+      return port1.compareTo(port2);
     }
-    else if (ach2.getAddress() != null)
-    {
-      addressEqual = ach1.getAddress().equals(ach2.getAddress());
-    }
-    if (addressEqual)
-    {
-      Integer port1 = new Integer(ach1.getConnectionHandler().getPort());
-      Integer port2 = new Integer(ach2.getConnectionHandler().getPort());
-      compare = port1.compareTo(port2);
-    }
-    else
-    {
-      compare = getName(ach1).compareTo(getName(ach2));
-    }
-    return compare;
+    return getName(ach1).compareTo(getName(ach2));
   }
 
   /**
-   * {@inheritDoc}
+   * Returns whether two addresses are equal.
+   *
+   * @param address1
+   *          the first address
+   * @param address2
+   *          the second address
+   * @return true if both are equal, false otherwise
    */
+  static boolean equal(InetAddress address1, InetAddress address2)
+  {
+    if (address1 != null)
+    {
+      return address1.equals(address2);
+    }
+    return address2 == null;
+  }
+
+  /** {@inheritDoc} */
+  @Override
   protected CustomSearchResult getMonitoringEntry(
       AddressConnectionHandlerDescriptor ach)
   {
     return ach.getMonitoringEntry();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   protected String getName(AddressConnectionHandlerDescriptor ach)
   {
     StringBuilder sb = new StringBuilder();
     ConnectionHandlerDescriptor ch = ach.getConnectionHandler();
     if (ch.getProtocol() == Protocol.ADMINISTRATION_CONNECTOR)
     {
-      sb.append(INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME.get(
-          ch.getPort()));
+      sb.append(INFO_CTRL_PANEL_ADMINISTRATION_CONNECTOR_NAME.get(ch.getPort()));
     }
     else
     {
       if (ach.getAddress() != null)
       {
-        sb.append(ach.getAddress().getHostAddress()+":"+ch.getPort());
+        sb.append(ach.getAddress().getHostAddress()).append(":").append(ch.getPort());
       }
       else
       {
@@ -186,35 +178,26 @@
   private CustomSearchResult getMonitoringEntry(InetAddress address,
       ConnectionHandlerDescriptor cch)
   {
-    CustomSearchResult monitoringEntry = null;
     for (CustomSearchResult sr : cch.getMonitoringEntries())
     {
-      String cn = (String)getFirstMonitoringValue(sr, "cn");
+      String cn = getFirstValueAsString(sr, "cn");
       if (cn != null)
       {
         if (address == null)
         {
-          monitoringEntry = sr;
-          break;
+          return sr;
         }
-        else
+        if (cn.endsWith(" " + address.getHostAddress() + " port " + cch.getPort() + " Statistics"))
         {
-          if (cn.endsWith(
-              " "+address.getHostAddress()+" port "+cch.getPort()+
-              " Statistics"))
-          {
-            monitoringEntry = sr;
-            break;
-          }
+          return sr;
         }
       }
     }
-    return monitoringEntry;
+    return null;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   protected LocalizableMessage getNameHeader()
   {
     return INFO_CTRL_PANEL_CONNECTION_HANDLER_HEADER.get();
@@ -285,48 +268,27 @@
     return monitoringEntry;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int hashCode()
   {
     return hashCode;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public boolean equals(Object o)
   {
-    boolean equals = false;
     if (o != this)
     {
-      if (o instanceof AddressConnectionHandlerDescriptor)
-      {
-        AddressConnectionHandlerDescriptor ach =
-          (AddressConnectionHandlerDescriptor)o;
-        if (ach.getAddress() == null)
-        {
-          equals = getAddress() == null;
-        }
-        else if (getAddress() == null)
-        {
-          equals = false;
-        }
-        else
-        {
-          equals = ach.getAddress().equals(getAddress());
-        }
-        if (equals)
-        {
-          equals = ach.getConnectionHandler().equals(getConnectionHandler());
-        }
-      }
+      return true;
     }
-    else
+    if (!(o instanceof AddressConnectionHandlerDescriptor))
     {
-      equals = true;
+      return false;
     }
-    return equals;
+    AddressConnectionHandlerDescriptor ach = (AddressConnectionHandlerDescriptor) o;
+    return ConnectionHandlersMonitoringTableModel.equal(getAddress(), ach.getAddress())
+        && ach.getConnectionHandler().equals(getConnectionHandler());
   }
 }
\ No newline at end of file
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index 8834ec3..305d164 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -69,6 +69,7 @@
 import static com.forgerock.opendj.util.OperatingSystem.*;
 
 import static org.opends.admin.ads.util.ConnectionUtils.*;
+import static org.opends.guitools.controlpanel.util.Utilities.*;
 
 /**
  * This is the classes that is shared among all the different places in the
@@ -343,16 +344,7 @@
   {
     if (userDataCtx != null)
     {
-      if (connectionPool.isConnectionRegistered(userDataCtx))
-      {
-        try
-        {
-          connectionPool.unregisterConnection(userDataCtx);
-        }
-        catch (Throwable t)
-        {
-        }
-      }
+      unregisterConnection(connectionPool, ctx);
     }
     this.userDataCtx = ctx;
     if (ctx != null)
@@ -500,22 +492,7 @@
     }
     ConfigReader reader;
 
-    ServerDescriptor.ServerStatus status = null;
-    for (Task task : getTasks())
-    {
-      if ((task.getType() == Task.Type.START_SERVER) &&
-          (task.getState() == Task.State.RUNNING) &&
-          isRunningOnServer(desc, task))
-      {
-        status = ServerDescriptor.ServerStatus.STARTING;
-      }
-      else if ((task.getType() == Task.Type.STOP_SERVER) &&
-          (task.getState() == Task.State.RUNNING) &&
-          isRunningOnServer(desc, task))
-      {
-        status = ServerDescriptor.ServerStatus.STOPPING;
-      }
-    }
+    ServerDescriptor.ServerStatus status = getStatus(desc);
     if (status != null)
     {
       desc.setStatus(status);
@@ -525,16 +502,7 @@
         this.ctx = null;
         if (userDataCtx != null)
         {
-          if (connectionPool.isConnectionRegistered(userDataCtx))
-          {
-            try
-            {
-              connectionPool.unregisterConnection(userDataCtx);
-            }
-            catch (Throwable t)
-            {
-            }
-          }
+          unregisterConnection(connectionPool, ctx);
           StaticUtils.close(userDataCtx);
           userDataCtx = null;
         }
@@ -616,35 +584,13 @@
             }
             else
             {
-              desc.setStatus(
-                  ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
+              desc.setStatus(ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE);
               reader = null;
             }
-            try
-            {
-              ctx.close();
-            }
-            catch (Throwable t)
-            {
-            }
+            StaticUtils.close(ctx);
             this.ctx = null;
-            if (connectionPool.isConnectionRegistered(userDataCtx))
-            {
-              try
-              {
-                connectionPool.unregisterConnection(userDataCtx);
-              }
-              catch (Throwable t)
-              {
-              }
-            }
-            try
-            {
-              userDataCtx.close();
-            }
-            catch (Throwable t)
-            {
-            }
+            unregisterConnection(connectionPool, ctx);
+            StaticUtils.close(userDataCtx);
             userDataCtx = null;
           }
         }
@@ -663,16 +609,13 @@
           desc.setJvmMemoryUsageMonitor(rCtx.getJvmMemoryUsage());
           desc.setSystemInformationMonitor(rCtx.getSystemInformation());
           desc.setWorkQueueMonitor(rCtx.getWorkQueue());
-          desc.setOpenDSVersion((String)Utilities.getFirstMonitoringValue(
-              rCtx.getVersionMonitor(), "fullVersion"));
-          String installPath = (String)Utilities.getFirstMonitoringValue(
-              rCtx.getSystemInformation(), "installPath");
+          desc.setOpenDSVersion(getFirstValueAsString(rCtx.getVersionMonitor(), "fullVersion"));
+          String installPath = getFirstValueAsString(rCtx.getSystemInformation(), "installPath");
           if (installPath != null)
           {
             desc.setInstallPath(installPath);
           }
-          String instancePath = (String)Utilities.getFirstMonitoringValue(
-              rCtx.getSystemInformation(), "instancePath");
+          String instancePath = getFirstValueAsString(rCtx.getSystemInformation(), "instancePath");
           if (instancePath != null)
           {
             desc.setInstancePath(instancePath);
@@ -712,6 +655,41 @@
     }
   }
 
+  private ServerDescriptor.ServerStatus getStatus(ServerDescriptor desc)
+  {
+    ServerDescriptor.ServerStatus status = null;
+    for (Task task : getTasks())
+    {
+      if ((task.getType() == Task.Type.START_SERVER) &&
+          (task.getState() == Task.State.RUNNING) &&
+          isRunningOnServer(desc, task))
+      {
+        status = ServerDescriptor.ServerStatus.STARTING;
+      }
+      else if ((task.getType() == Task.Type.STOP_SERVER) &&
+          (task.getState() == Task.State.RUNNING) &&
+          isRunningOnServer(desc, task))
+      {
+        status = ServerDescriptor.ServerStatus.STOPPING;
+      }
+    }
+    return status;
+  }
+
+  private void unregisterConnection(LDAPConnectionPool connectionPool, InitialLdapContext userDataCtx)
+  {
+    if (connectionPool.isConnectionRegistered(userDataCtx))
+    {
+      try
+      {
+        connectionPool.unregisterConnection(userDataCtx);
+      }
+      catch (Throwable t)
+      {
+      }
+    }
+  }
+
   /**
    * Adds a configuration change listener.
    * @param listener the listener.
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java
index 0847f58..677f82d 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/DBEnvironmentMonitoringTableModel.java
@@ -26,8 +26,6 @@
  */
 package org.opends.guitools.controlpanel.datamodel;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -36,9 +34,11 @@
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.opends.guitools.controlpanel.util.Utilities;
 import org.forgerock.i18n.LocalizableMessage;
 
+import static org.opends.guitools.controlpanel.util.Utilities.*;
+import static org.opends.messages.AdminToolMessages.*;
+
 /**
  * The abstract table model used to display all the network groups.
  */
@@ -48,25 +48,17 @@
   private static final long serialVersionUID = 548035716525600536L;
   private Set<BackendDescriptor> data = new HashSet<BackendDescriptor>();
   private ArrayList<String[]> dataArray = new ArrayList<String[]>();
-  private ArrayList<BackendDescriptor> dataSourceArray =
-    new ArrayList<BackendDescriptor>();
+  private ArrayList<BackendDescriptor> dataSourceArray = new ArrayList<BackendDescriptor>();
 
   private String[] columnNames = {};
   private LocalizableMessage NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
   private LocalizableMessage NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
 
-
-  /**
-   * The operations to be displayed.
-   */
+  /** The operations to be displayed. */
   private LinkedHashSet<String> attributes = new LinkedHashSet<String>();
-  /**
-   * The sort column of the table.
-   */
-  private int sortColumn = 0;
-  /**
-   * Whether the sorting is ascending or descending.
-   */
+  /** The sort column of the table. */
+  private int sortColumn;
+  /** Whether the sorting is ascending or descending. */
   private boolean sortAscending = true;
 
   /**
@@ -88,6 +80,7 @@
    * Updates the table model contents and sorts its contents depending on the
    * sort options set by the user.
    */
+  @Override
   public void forceResort()
   {
     updateDataArray();
@@ -105,154 +98,45 @@
     fireTableDataChanged();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int getColumnCount()
   {
     return columnNames.length;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int getRowCount()
   {
     return dataArray.size();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public Object getValueAt(int row, int col)
   {
     return dataArray.get(row)[col];
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public String getColumnName(int col) {
     return columnNames[col];
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int compare(BackendDescriptor desc1, BackendDescriptor desc2)
   {
-    int result;
+    CustomSearchResult monitor1 = desc1.getMonitoringEntry();
+    CustomSearchResult monitor2 = desc2.getMonitoringEntry();
+
     ArrayList<Integer> possibleResults = new ArrayList<Integer>();
-
     possibleResults.add(getName(desc1).compareTo(getName(desc2)));
-    for (String attrName : attributes)
-    {
-      int possibleResult;
-      if (desc1.getMonitoringEntry() == null)
-      {
-        if (desc2.getMonitoringEntry() == null)
-        {
-          possibleResult = 0;
-        }
-        else
-        {
-          possibleResult = -1;
-        }
-      }
-      else if (desc2.getMonitoringEntry() == null)
-      {
-        possibleResult = 1;
-      }
-      else
-      {
-        Object v1 = null;
-        Object v2 = null;
+    computeMonitoringPossibleResults(monitor1, monitor2, possibleResults, attributes);
 
-        for (String attr : desc1.getMonitoringEntry().getAttributeNames())
-        {
-          if (attr.equalsIgnoreCase(attrName))
-          {
-            v1 = getFirstMonitoringValue(desc1.getMonitoringEntry(), attrName);
-            break;
-          }
-        }
-        for (String attr : desc2.getMonitoringEntry().getAttributeNames())
-        {
-          if (attr.equalsIgnoreCase(attrName))
-          {
-            v2 = getFirstMonitoringValue(desc2.getMonitoringEntry(), attrName);
-            break;
-          }
-        }
-
-        if (v1 == null)
-        {
-          if (v2 == null)
-          {
-            possibleResult = 0;
-          }
-          else
-          {
-            possibleResult = -1;
-          }
-        }
-        else if (v2 == null)
-        {
-          possibleResult = 1;
-        }
-        else
-        {
-          if (v1 instanceof Number)
-          {
-            if ((v1 instanceof Double) || (v2 instanceof Double))
-            {
-              double n1 = ((Number)v1).doubleValue();
-              double n2 = ((Number)v2).doubleValue();
-              if (n1 > n2)
-              {
-                possibleResult = 1;
-              }
-              else if (n1 < n2)
-              {
-                possibleResult = -1;
-              }
-              else
-              {
-                possibleResult = 0;
-              }
-            }
-            else
-            {
-              long n1 = ((Number)v1).longValue();
-              long n2 = ((Number)v2).longValue();
-              if (n1 > n2)
-              {
-                possibleResult = 1;
-              }
-              else if (n1 < n2)
-              {
-                possibleResult = -1;
-              }
-              else
-              {
-                possibleResult = 0;
-              }
-            }
-          }
-          else if (v2 instanceof Number)
-          {
-            possibleResult = -1;
-          }
-          else
-          {
-            possibleResult = v1.toString().compareTo(v2.toString());
-          }
-        }
-      }
-      possibleResults.add(possibleResult);
-    }
-
-    result = possibleResults.get(getSortColumn());
+    int result = possibleResults.get(getSortColumn());
     if (result == 0)
     {
       for (int i : possibleResults)
@@ -276,6 +160,7 @@
    * @return <CODE>true</CODE> if the sort is ascending and <CODE>false</CODE>
    * otherwise.
    */
+  @Override
   public boolean isSortAscending()
   {
     return sortAscending;
@@ -285,6 +170,7 @@
    * Sets whether to sort ascending of descending.
    * @param sortAscending whether to sort ascending or descending.
    */
+  @Override
   public void setSortAscending(boolean sortAscending)
   {
     this.sortAscending = sortAscending;
@@ -294,6 +180,7 @@
    * Returns the column index used to sort.
    * @return the column index used to sort.
    */
+  @Override
   public int getSortColumn()
   {
     return sortColumn;
@@ -303,6 +190,7 @@
    * Sets the column index used to sort.
    * @param sortColumn column index used to sort..
    */
+  @Override
   public void setSortColumn(int sortColumn)
   {
     this.sortColumn = sortColumn;
@@ -401,14 +289,6 @@
   }
 
   /**
-   * {@inheritDoc}
-   */
-  protected String[] getColumnNames()
-  {
-    return columnNames;
-  }
-
-  /**
    * Returns the label to be used for the provided backend.
    * @param backend the backend.
    * @return the label to be used for the provided backend.
@@ -424,8 +304,7 @@
    * @return the monitoring entry associated with the provided backend.  Returns
    * <CODE>null</CODE> if there is no monitoring entry associated.
    */
-  protected CustomSearchResult getMonitoringEntry(
-      BackendDescriptor backend)
+  protected CustomSearchResult getMonitoringEntry(BackendDescriptor backend)
   {
     return backend.getMonitoringEntry();
   }
@@ -438,29 +317,18 @@
     CustomSearchResult monitoringEntry = getMonitoringEntry(backend);
     for (String attr : attributes)
     {
-      Object o = getFirstMonitoringValue(monitoringEntry, attr);
-      if (o == null)
+      String o = getFirstValueAsString(monitoringEntry, attr);
+      if (o != null)
       {
-        line[i] = NO_VALUE_SET.toString();
+        line[i] = o;
       }
       else
       {
-        line[i] = o.toString();
+        line[i] = NO_VALUE_SET.toString();
       }
       i++;
     }
     return line;
   }
 
-  /**
-   * Returns the first value for a given attribute in the provided entry.
-   * @param sr the entry.
-   * @param attrName the attribute name.
-   * @return the first value for a given attribute in the provided entry.
-   */
-  protected Object getFirstMonitoringValue(CustomSearchResult sr,
-      String attrName)
-  {
-    return Utilities.getFirstMonitoringValue(sr, attrName);
-  }
 }
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java
index 3416a7f..febf11f 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/MonitoringTableModel.java
@@ -26,65 +26,47 @@
  */
 package org.opends.guitools.controlpanel.datamodel;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.opends.guitools.controlpanel.util.Utilities;
 import org.forgerock.i18n.LocalizableMessage;
+import org.opends.guitools.controlpanel.util.Utilities;
+
+import static org.opends.guitools.controlpanel.util.Utilities.*;
+import static org.opends.messages.AdminToolMessages.*;
 
 /**
  * The abstract table model used to display all the network groups.
  * @param <T> the type of the objects passed externally to the table model.
  * @param <P> the type of the objects used internally by the table model.
  */
-public abstract class MonitoringTableModel<T, P> extends SortableTableModel
-implements Comparator<P>
+abstract class MonitoringTableModel<T, P> extends SortableTableModel implements Comparator<P>
 {
   private static final long serialVersionUID = -3974562860632179025L;
-  private Set<P> data = new HashSet<P>();
-  private ArrayList<String[]> dataArray = new ArrayList<String[]>();
-  private ArrayList<P> dataSourceArray = new ArrayList<P>();
+  private final Set<P> data = new HashSet<P>();
+  private final ArrayList<String[]> dataArray = new ArrayList<String[]>();
+  private final ArrayList<P> dataSourceArray = new ArrayList<P>();
   private boolean showAverages;
   private long runningTime;
 
   private String[] columnNames = {};
-  private LocalizableMessage NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
-  private LocalizableMessage NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
+  private final LocalizableMessage NO_VALUE_SET = INFO_CTRL_PANEL_NO_MONITORING_VALUE.get();
+  private final LocalizableMessage NOT_IMPLEMENTED = INFO_CTRL_PANEL_NOT_IMPLEMENTED.get();
 
-
-  /**
-   * The attributes to be displayed.
-   */
-  private LinkedHashSet<MonitoringAttributes> attributes =
-    new LinkedHashSet<MonitoringAttributes>();
-  /**
-   * The sort column of the table.
-   */
-  private int sortColumn = 0;
-  /**
-   * Whether the sorting is ascending or descending.
-   */
+  /** The attributes to be displayed. */
+  private final LinkedHashSet<MonitoringAttributes> attributes = new LinkedHashSet<MonitoringAttributes>();
+  /** The sort column of the table. */
+  private int sortColumn;
+  /** Whether the sorting is ascending or descending. */
   private boolean sortAscending = true;
 
   /**
-   * Indicates whether a total row must be added or not.  The default behavior
-   * is to add it.
-   * @return <CODE>true</CODE> if a total row must be added and
-   * <CODE>false</CODE> otherwise.
-   */
-  protected boolean addTotalRow()
-  {
-    return true;
-  }
-
-  /**
    * Sets the data for this table model.
    * @param newData the data for this table model.
    * @param runningTime the running time of the server in miliseconds.
@@ -109,6 +91,7 @@
    * Updates the table model contents and sorts its contents depending on the
    * sort options set by the user.
    */
+  @Override
   public void forceResort()
   {
     updateDataArray();
@@ -126,33 +109,29 @@
     fireTableDataChanged();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int getColumnCount()
   {
     return columnNames.length;
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public int getRowCount()
   {
     return dataArray.size();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public Object getValueAt(int row, int col)
   {
     return dataArray.get(row)[col];
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public String getColumnName(int col) {
     return columnNames[col];
   }
@@ -162,6 +141,7 @@
    * @return <CODE>true</CODE> if the sort is ascending and <CODE>false</CODE>
    * otherwise.
    */
+  @Override
   public boolean isSortAscending()
   {
     return sortAscending;
@@ -171,6 +151,7 @@
    * Sets whether to sort ascending of descending.
    * @param sortAscending whether to sort ascending or descending.
    */
+  @Override
   public void setSortAscending(boolean sortAscending)
   {
     this.sortAscending = sortAscending;
@@ -180,6 +161,7 @@
    * Returns the column index used to sort.
    * @return the column index used to sort.
    */
+  @Override
   public int getSortColumn()
   {
     return sortColumn;
@@ -189,6 +171,7 @@
    * Sets the column index used to sort.
    * @param sortColumn column index used to sort..
    */
+  @Override
   public void setSortColumn(int sortColumn)
   {
     this.sortColumn = sortColumn;
@@ -264,53 +247,42 @@
     }
 
     // Add the total: always at the end
-    if (addTotalRow())
+    String[] line = new String[columnNames.length];
+    line[0] = "<html><b>" + INFO_CTRL_PANEL_TOTAL_LABEL.get() + "</b>";
+    for (int i = 1; i < line.length; i++)
     {
-      String[] line = new String[columnNames.length];
-      line[0] = "<html><b>" + INFO_CTRL_PANEL_TOTAL_LABEL.get() + "</b>";
-      for (int i=1; i<line.length; i++)
+      boolean valueSet = false;
+      boolean notImplemented = false;
+      long totalValue = 0;
+      for (int j = 0; j < dataArray.size(); j++)
       {
-        boolean valueSet = false;
-        boolean notImplemented = false;
-        long totalValue = 0;
-        for (int j=0; j<dataArray.size(); j++)
+        String[] l = dataArray.get(j);
+        String value = l[i];
+        try
         {
-          String[] l = dataArray.get(j);
-          String value = l[i];
-          try
-          {
-            long v = Long.parseLong(value);
-            totalValue += v;
-            valueSet = true;
-          }
-          catch (Throwable t)
-          {
-            notImplemented = NOT_IMPLEMENTED.toString().equals(value);
-          }
+          long v = Long.parseLong(value);
+          totalValue += v;
+          valueSet = true;
         }
-        if (notImplemented)
+        catch (Throwable t)
         {
-          line[i] = NOT_IMPLEMENTED.toString();
-        }
-        else if (valueSet)
-        {
-          line[i] = String.valueOf(totalValue);
-        }
-        else
-        {
-          line[i] = NO_VALUE_SET.toString();
+          notImplemented = NOT_IMPLEMENTED.toString().equals(value);
         }
       }
-      dataArray.add(line);
+      if (notImplemented)
+      {
+        line[i] = NOT_IMPLEMENTED.toString();
+      }
+      else if (valueSet)
+      {
+        line[i] = String.valueOf(totalValue);
+      }
+      else
+      {
+        line[i] = NO_VALUE_SET.toString();
+      }
     }
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  protected String[] getColumnNames()
-  {
-    return columnNames;
+    dataArray.add(line);
   }
 
   /**
@@ -358,7 +330,7 @@
             String s = String.valueOf(average);
             int index = s.indexOf(".");
             // Show a maximum of two decimals.
-            if ((index != -1) && ((index + 3) < s.length()))
+            if (index != -1 && index + 3 < s.length())
             {
               s = s.substring(0, index + 3);
             }
@@ -392,18 +364,6 @@
   }
 
   /**
-   * Returns the first value for a given attribute in the provided entry.
-   * @param sr the entry.
-   * @param attrName the attribute name.
-   * @return the first value for a given attribute in the provided entry.
-   */
-  protected Object getFirstMonitoringValue(CustomSearchResult sr,
-      String attrName)
-  {
-    return Utilities.getFirstMonitoringValue(sr, attrName);
-  }
-
-  /**
    * Returns a list of integer with all the values of two monitoring entries
    * compared.
    * @param monitor1 the first monitoring entry.
@@ -414,120 +374,13 @@
   protected ArrayList<Integer> getMonitoringPossibleResults(
       CustomSearchResult monitor1, CustomSearchResult monitor2)
   {
-    ArrayList<Integer> possibleResults = new ArrayList<Integer>();
+    final List<String> attrs = new ArrayList<String>();
     for (MonitoringAttributes operation : getAttributes())
     {
-      int possibleResult;
-      if (monitor1 == null)
-      {
-        if (monitor2 == null)
-        {
-          possibleResult = 0;
-        }
-        else
-        {
-          possibleResult = -1;
-        }
-      }
-      else if (monitor2 == null)
-      {
-        possibleResult = 1;
-      }
-      else
-      {
-        Object v1 = null;
-        Object v2 = null;
-
-        for (String attrName : monitor1.getAttributeNames())
-        {
-          if (operation.getAttributeName().equalsIgnoreCase(attrName))
-          {
-            v1 = getFirstMonitoringValue(monitor1, attrName);
-            break;
-          }
-        }
-        for (String attrName : monitor2.getAttributeNames())
-        {
-          if (operation.getAttributeName().equalsIgnoreCase(attrName))
-          {
-            v2 = getFirstMonitoringValue(monitor2, attrName);
-            break;
-          }
-        }
-
-        if (v1 == null)
-        {
-          if (v2 == null)
-          {
-            possibleResult = 0;
-          }
-          else
-          {
-            possibleResult = -1;
-          }
-        }
-        else if (v2 == null)
-        {
-          possibleResult = 1;
-        }
-        else
-        {
-          if (v1 instanceof Number)
-          {
-            if (v2 instanceof Number)
-            {
-              if ((v1 instanceof Double) || (v2 instanceof Double))
-              {
-                double n1 = ((Number)v1).doubleValue();
-                double n2 = ((Number)v2).doubleValue();
-                if (n1 > n2)
-                {
-                  possibleResult = 1;
-                }
-                else if (n1 < n2)
-                {
-                  possibleResult = -1;
-                }
-                else
-                {
-                  possibleResult = 0;
-                }
-              }
-              else
-              {
-                long n1 = ((Number)v1).longValue();
-                long n2 = ((Number)v2).longValue();
-                if (n1 > n2)
-                {
-                  possibleResult = 1;
-                }
-                else if (n1 < n2)
-                {
-                  possibleResult = -1;
-                }
-                else
-                {
-                  possibleResult = 0;
-                }
-              }
-            }
-            else
-            {
-              possibleResult = 1;
-            }
-          }
-          else if (v2 instanceof Number)
-          {
-            possibleResult = -1;
-          }
-          else
-          {
-            possibleResult = v1.toString().compareTo(v2.toString());
-          }
-        }
-      }
-      possibleResults.add(possibleResult);
+      attrs.add(operation.getAttributeName());
     }
+    final ArrayList<Integer> possibleResults = new ArrayList<Integer>();
+    computeMonitoringPossibleResults(monitor1, monitor2, possibleResults, attrs);
     return possibleResults;
   }
 }
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
index acf9cb4..e5104a1 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
@@ -527,7 +527,7 @@
     {
       return false;
     }
-    String os = (String) getFirstMonitoringValue(sr, "operatingSystem");
+    String os = getFirstValueAsString(sr, "operatingSystem");
     if (os != null)
     {
       return OperatingSystem.WINDOWS == OperatingSystem.forName(os);
@@ -729,8 +729,8 @@
     {
       try
       {
-        String start = (String) getFirstMonitoringValue(rootMonitor, START_DATE.getAttributeName());
-        String current = (String) getFirstMonitoringValue(rootMonitor, CURRENT_DATE.getAttributeName());
+        String start = getFirstValueAsString(rootMonitor, START_DATE.getAttributeName());
+        String current = getFirstValueAsString(rootMonitor, CURRENT_DATE.getAttributeName());
         Date startTime = ConfigFromDirContext.utcParser.parse(start);
         Date currentTime = ConfigFromDirContext.utcParser.parse(current);
         return currentTime.getTime() - startTime.getTime();
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java
index 6d41cf3..ba72f30 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/EntryCachesMonitoringPanel.java
@@ -22,43 +22,38 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.guitools.controlpanel.ui;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import javax.swing.Box;
 import javax.swing.JLabel;
 
 import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
-import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
 import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
 import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.util.Utilities;
+
+import static org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes.*;
+import static org.opends.guitools.controlpanel.util.Utilities.*;
+import static org.opends.messages.AdminToolMessages.*;
 /**
  * The panel displaying the entry caches monitor panel.
  */
 public class EntryCachesMonitoringPanel extends GeneralMonitoringPanel
 {
   private static final long serialVersionUID = 9031734563700069830L;
-  static List<MonitoringAttributes> ngOperations =
-    new ArrayList<MonitoringAttributes>();
-  {
-    ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_TRIES);
-    ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_HITS);
-    ngOperations.add(BasicMonitoringAttributes.ENTRY_CACHE_HIT_RATIO);
-    ngOperations.add(BasicMonitoringAttributes.CURRENT_ENTRY_CACHE_SIZE);
-    ngOperations.add(BasicMonitoringAttributes.MAX_ENTRY_CACHE_SIZE);
-    ngOperations.add(BasicMonitoringAttributes.CURRENT_ENTRY_CACHE_COUNT);
-    ngOperations.add(BasicMonitoringAttributes.MAX_ENTRY_CACHE_COUNT);
-  }
-  private ArrayList<JLabel> monitoringLabels =
-    new ArrayList<JLabel>();
+  private static List<MonitoringAttributes> ngOperations = new ArrayList<MonitoringAttributes>(Arrays.asList(
+      ENTRY_CACHE_TRIES, ENTRY_CACHE_HITS, ENTRY_CACHE_HIT_RATIO, CURRENT_ENTRY_CACHE_SIZE, MAX_ENTRY_CACHE_SIZE,
+      CURRENT_ENTRY_CACHE_COUNT, MAX_ENTRY_CACHE_COUNT));
+
+  private ArrayList<JLabel> monitoringLabels = new ArrayList<JLabel>();
   {
     for (int i=0; i<ngOperations.size(); i++)
     {
@@ -85,6 +80,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public Component getPreferredFocusComponent()
   {
     return monitoringLabels.get(0);
@@ -159,8 +155,7 @@
       int index = 0;
       for (MonitoringAttributes attr : ngOperations)
       {
-        if (Utilities.getFirstMonitoringValue(csr, attr.getAttributeName())
-            == null)
+        if (getFirstValueAsString(csr, attr.getAttributeName()) == null)
         {
           monitoringLabels.get(index).setVisible(false);
           labels.get(index).setVisible(false);
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java
index 2c453be..4fc195d 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/JavaInformationMonitoringPanel.java
@@ -22,11 +22,10 @@
  *
  *
  *      Copyright 2009 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.guitools.controlpanel.ui;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
@@ -46,12 +45,15 @@
 import javax.swing.event.ChangeListener;
 import javax.swing.text.JTextComponent;
 
-import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
 import org.opends.guitools.controlpanel.datamodel.BasicMonitoringAttributes;
+import org.opends.guitools.controlpanel.datamodel.CustomSearchResult;
 import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
 import org.opends.guitools.controlpanel.ui.components.BasicExpander;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.opends.server.util.ServerConstants;
+
+import static org.opends.guitools.controlpanel.util.Utilities.*;
+import static org.opends.messages.AdminToolMessages.*;
+import static org.opends.server.util.ServerConstants.*;
 
 /**
  * The panel displaying the java monitoring information.
@@ -82,8 +84,8 @@
   {
     for (int i=0; i<generalAttributes.size(); i++)
     {
-      if ((generalAttributes.get(i) == BasicMonitoringAttributes.CLASS_PATH) ||
-          (generalAttributes.get(i) == BasicMonitoringAttributes.JVM_ARGUMENTS))
+      if (generalAttributes.get(i) == BasicMonitoringAttributes.CLASS_PATH ||
+          generalAttributes.get(i) == BasicMonitoringAttributes.JVM_ARGUMENTS)
       {
         JEditorPane pane = new JEditorPane();
         pane.setEditable(false);
@@ -112,9 +114,8 @@
     createLayout();
   }
 
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
+  @Override
   public Component getPreferredFocusComponent()
   {
     return generalMonitoringComps.get(0);
@@ -175,14 +176,13 @@
         gbc.insets.right = 10;
         gbc.weightx = 1.0;
         gbc.fill = GridBagConstraints.BOTH;
-        add(generalMonitoringComps.get(i), gbc);
       }
       else
       {
         gbc.weightx = 0.0;
         gbc.fill = GridBagConstraints.HORIZONTAL;
-        add(generalMonitoringComps.get(i), gbc);
       }
+      add(generalMonitoringComps.get(i), gbc);
     }
 
     final BasicExpander extraExpander = new BasicExpander(
@@ -249,22 +249,20 @@
         gbc1.insets.right = 10;
         gbc1.weightx = 1.0;
         gbc1.fill = GridBagConstraints.BOTH;
-        extraGeneralPanel.add(generalMonitoringComps.get(index), gbc1);
       }
       else
       {
         gbc1.weightx = 1.0;
         gbc1.fill = GridBagConstraints.HORIZONTAL;
-        extraGeneralPanel.add(generalMonitoringComps.get(index), gbc1);
       }
+      extraGeneralPanel.add(generalMonitoringComps.get(index), gbc1);
       gbc1.insets.top = 10;
       gbc1.gridy ++;
     }
     ChangeListener changeListener = new ChangeListener()
     {
-      /**
-       * {@inheritDoc}
-       */
+      /** {@inheritDoc} */
+      @Override
       public void stateChanged(ChangeEvent e)
       {
         extraGeneralPanel.setVisible(extraExpander.isSelected());
@@ -274,9 +272,8 @@
 
     changeListener = new ChangeListener()
     {
-      /**
-       * {@inheritDoc}
-       */
+      /** {@inheritDoc} */
+      @Override
       public void stateChanged(ChangeEvent e)
       {
         memoryPanel.setVisible(memoryExpander.isSelected());
@@ -360,9 +357,8 @@
         SortedSet<String> sortedNames = new TreeSet<String>();
         for (String attrName : allNames)
         {
-          if (!attrName.equalsIgnoreCase(
-              ServerConstants.OBJECTCLASS_ATTRIBUTE_TYPE_NAME) &&
-              !attrName.equalsIgnoreCase(ServerConstants.ATTR_COMMON_NAME))
+          if (!OBJECTCLASS_ATTRIBUTE_TYPE_NAME.equalsIgnoreCase(attrName)
+              && !ATTR_COMMON_NAME.equalsIgnoreCase(attrName))
           {
             sortedNames.add(attrName);
           }
@@ -399,12 +395,10 @@
 
       for (int i=0; i<memoryAttributes.size() ; i++)
       {
-        Object value = Utilities.getFirstMonitoringValue(
-            csrMemory,
-            memoryAttributes.get(i));
+        String value = getFirstValueAsString(csrMemory, memoryAttributes.get(i));
         if (value != null)
         {
-          memoryLabels.get(i).setText(value.toString());
+          memoryLabels.get(i).setText(value);
         }
         else
         {
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
index 53307d1..bcf5be3 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
@@ -80,14 +80,18 @@
 import static com.forgerock.opendj.cli.Utils.*;
 
 import static org.opends.admin.ads.util.ConnectionUtils.*;
+import static org.opends.guitools.controlpanel.util.Utilities.*;
 import static org.opends.messages.AdminToolMessages.*;
 import static org.opends.messages.QuickSetupMessages.*;
+import static org.opends.server.monitors.VersionMonitorProvider.*;
 
 /**
  * The panel that appears when the user is asked to provide authentication.
  */
 public class LocalOrRemotePanel extends StatusGenericPanel
 {
+
+  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
   private static final long serialVersionUID = 5051556513294844797L;
 
   private JComboBox combo;
@@ -101,19 +105,11 @@
   private String usedUrl;
   private JLabel localInstallLabel;
   private JEditorPane localInstall;
-
   private JLabel localNotRunning;
-
   private boolean isLocalServerRunning;
-
   private boolean callOKWhenVisible;
 
-  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
-
-  /**
-   * Default constructor.
-   *
-   */
+  /** Default constructor. */
   public LocalOrRemotePanel()
   {
     super();
@@ -431,13 +427,7 @@
         @Override
         public Void processBackgroundTask() throws Throwable
         {
-          try
-          {
-            Thread.sleep(200);
-          }
-          catch (Throwable t)
-          {
-          }
+          StaticUtils.sleep(200);
           File instancePath = Installation.getLocal().getInstanceDirectory();
           isLocalServerRunning = Utilities.isServerRunning(instancePath);
           return null;
@@ -583,7 +573,7 @@
             else
             {
               usedUrl = ConnectionUtils.getLDAPUrl(hostName.getText().trim(),
-                  new Integer(port.getText().trim()), true);
+                  Integer.valueOf(port.getText().trim()), true);
               ctx = createLdapsContext(usedUrl, dn.getText(),
                   String.valueOf(pwd.getPassword()),
                   getInfo().getConnectTimeout(), null,
@@ -591,20 +581,13 @@
               checkVersion(ctx);
             }
 
-            try
-            {
-              Thread.sleep(500);
-            }
-            catch (Throwable t)
-            {
-            }
+            StaticUtils.sleep(500);
             SwingUtilities.invokeLater(new Runnable()
             {
               @Override
               public void run()
               {
-                displayMessage(
-                    INFO_CTRL_PANEL_READING_CONFIGURATION_SUMMARY.get());
+                displayMessage(INFO_CTRL_PANEL_READING_CONFIGURATION_SUMMARY.get());
               }
             });
             closeInfoConnections();
@@ -715,7 +698,7 @@
               {
                 String hostPort = ServerDescriptor.getServerRepresentation(
                     hostName.getText().trim(),
-                    new Integer(port.getText().trim()));
+                    Integer.valueOf(port.getText().trim()));
                 NamingException ne = (NamingException)throwable;
                 errors.add(getMessageForException(ne, hostPort));
                 setPrimaryInvalid(portLabel);
@@ -907,13 +890,7 @@
       @Override
       public void run()
       {
-        try
-        {
-          Thread.sleep(getInfo().getPoolingPeriod());
-        }
-        catch (Throwable t)
-        {
-        }
+        StaticUtils.sleep(getInfo().getPoolingPeriod());
         getInfo().startPooling();
       }
     });
@@ -925,9 +902,7 @@
     LocalizableMessage msg = null;
     try
     {
-      /*
-       * Search for the version on the remote server.
-       */
+      // Search for the version on the remote server.
       SearchControls searchControls = new SearchControls();
       searchControls.setSearchScope(
       SearchControls.OBJECT_SCOPE);
@@ -939,8 +914,7 @@
           VersionMonitorProvider.ATTR_MINOR_VERSION
           });
       NamingEnumeration<SearchResult> en =
-        ctx.search("cn=Version,cn=monitor", "objectclass=*",
-          searchControls);
+        ctx.search("cn=Version,cn=monitor", "objectclass=*", searchControls);
       SearchResult sr = null;
       try
       {
@@ -953,21 +927,16 @@
       {
         en.close();
       }
-      CustomSearchResult csr =
-        new CustomSearchResult(sr, "cn=Version,cn=monitor");
+
+      CustomSearchResult csr = new CustomSearchResult(sr, "cn=Version,cn=monitor");
 
       String hostName = ConnectionUtils.getHostName(ctx);
 
-      String productName = String.valueOf(Utilities.getFirstMonitoringValue(csr,
-          VersionMonitorProvider.ATTR_PRODUCT_NAME));
-      String major = String.valueOf(Utilities.getFirstMonitoringValue(csr,
-          VersionMonitorProvider.ATTR_MAJOR_VERSION));
-      String point = String.valueOf(Utilities.getFirstMonitoringValue(csr,
-          VersionMonitorProvider.ATTR_POINT_VERSION));
-      String minor = String.valueOf(Utilities.getFirstMonitoringValue(csr,
-          VersionMonitorProvider.ATTR_MINOR_VERSION));
-      // Be strict, control panel is only compatible with exactly the same
-      // version.
+      String productName = String.valueOf(getFirstValueAsString(csr, ATTR_PRODUCT_NAME));
+      String major = String.valueOf(getFirstValueAsString(csr, ATTR_MAJOR_VERSION));
+      String point = String.valueOf(getFirstValueAsString(csr, ATTR_POINT_VERSION));
+      String minor = String.valueOf(getFirstValueAsString(csr, ATTR_MINOR_VERSION));
+      // Be strict, control panel is only compatible with exactly the same version
       if (!productName.equalsIgnoreCase(DynamicConstants.PRODUCT_NAME))
       {
         msg = ERR_NOT_SAME_PRODUCT_IN_REMOTE_SERVER_NOT_FOUND.get(hostName,
@@ -994,7 +963,6 @@
 
   private boolean isVersionException(Throwable t)
   {
-    boolean isVersionException = false;
     if (t instanceof OpenDsException)
     {
       OpenDsException oe = (OpenDsException)t;
@@ -1005,34 +973,15 @@
             StaticUtils.hasDescriptor(msg, ERR_VERSION_IN_REMOTE_SERVER_NOT_FOUND) ||
             StaticUtils.hasDescriptor(msg, ERR_NOT_SAME_PRODUCT_IN_REMOTE_SERVER_NOT_FOUND))
         {
-          isVersionException = true;
+          return true;
         }
       }
     }
-    return isVersionException;
+    return false;
   }
 
   private void closeInfoConnections()
   {
-    if (getInfo().getDirContext() != null)
-    {
-      try
-      {
-        getInfo().getDirContext().close();
-      }
-      catch (Throwable t)
-      {
-      }
-    }
-    if (getInfo().getUserDataDirContext() != null)
-    {
-      try
-      {
-        getInfo().getUserDataDirContext().close();
-      }
-      catch (Throwable t)
-      {
-      }
-    }
+    StaticUtils.close(getInfo().getDirContext(), getInfo().getUserDataDirContext());
   }
 }
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
index c5ef4e4..3728876 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
@@ -26,8 +26,6 @@
  */
 package org.opends.guitools.controlpanel.ui;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.awt.CardLayout;
 import java.awt.Color;
 import java.awt.Component;
@@ -56,9 +54,6 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-
 import javax.naming.NamingEnumeration;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
@@ -73,6 +68,11 @@
 import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.i18n.LocalizableMessageDescriptor;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.opends.admin.ads.util.ConnectionUtils;
 import org.opends.guitools.controlpanel.browser.BrowserController;
 import org.opends.guitools.controlpanel.browser.IconPool;
@@ -85,7 +85,10 @@
 import org.opends.guitools.controlpanel.datamodel.MonitoringAttributes;
 import org.opends.guitools.controlpanel.datamodel.ScheduleType;
 import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
-import org.opends.guitools.controlpanel.event.*;
+import org.opends.guitools.controlpanel.datamodel.SortableListModel;
+import org.opends.guitools.controlpanel.event.ConfigChangeListener;
+import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
+import org.opends.guitools.controlpanel.event.ConfigurationElementCreatedListener;
 import org.opends.guitools.controlpanel.task.RebuildIndexTask;
 import org.opends.guitools.controlpanel.task.RestartServerTask;
 import org.opends.guitools.controlpanel.task.StartServerTask;
@@ -95,14 +98,15 @@
 import org.opends.guitools.controlpanel.util.BackgroundTask;
 import org.opends.guitools.controlpanel.util.LowerCaseComparator;
 import org.opends.guitools.controlpanel.util.Utilities;
-import org.forgerock.i18n.LocalizableMessageBuilder;
-import org.forgerock.i18n.LocalizableMessageDescriptor;
 import org.opends.quicksetup.ui.CustomHTMLEditorKit;
 import org.opends.server.schema.SchemaConstants;
 import org.opends.server.types.ObjectClass;
-import org.forgerock.opendj.ldap.schema.ObjectClassType;
 import org.opends.server.types.OpenDsException;
 import org.opends.server.util.ServerConstants;
+import org.opends.server.util.StaticUtils;
+
+import static org.opends.guitools.controlpanel.ui.ControlCenterMainPane.*;
+import static org.opends.messages.AdminToolMessages.*;
 
 /**
  * An abstract class that contains a number of methods that are shared by all
@@ -124,49 +128,44 @@
   /**
    * The not applicable message.
    */
-  protected final static LocalizableMessage NOT_APPLICABLE =
+  protected static final LocalizableMessage NOT_APPLICABLE =
     INFO_NOT_APPLICABLE_LABEL.get();
 
-  private LocalizableMessage AUTHENTICATE = INFO_AUTHENTICATE_BUTTON_LABEL.get();
-  private LocalizableMessage START = INFO_START_BUTTON_LABEL.get();
+  private final LocalizableMessage AUTHENTICATE = INFO_AUTHENTICATE_BUTTON_LABEL.get();
+  private final LocalizableMessage START = INFO_START_BUTTON_LABEL.get();
 
   private ControlPanelInfo info;
 
-  private boolean enableClose = true;
+  private final boolean enableClose = true;
   private boolean enableCancel = true;
   private boolean enableOK = true;
 
-  private boolean disposeOnClose = false;
+  private boolean disposeOnClose;
 
-  private JPanel cardPanel;
-  private JPanel mainPanel;
-  private JEditorPane message;
+  private final JPanel cardPanel;
+  private final JPanel mainPanel;
+  private final JEditorPane message;
 
-  private CardLayout cardLayout;
+  private final CardLayout cardLayout;
 
   private static final String MAIN_PANEL = "mainPanel";
   private static final String MESSAGE_PANEL = "messagePanel";
 
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
-  /**
-   * The error pane.
-   */
+  /** The error pane. */
   protected JEditorPane errorPane;
 
-  /**
-   * The last displayed message in the error pane.
-   */
-  protected String lastDisplayedError = null;
+  /** The last displayed message in the error pane. */
+  private String lastDisplayedError;
 
-  private ArrayList<ConfigurationElementCreatedListener> confListeners =
+  private final ArrayList<ConfigurationElementCreatedListener> confListeners =
     new ArrayList<ConfigurationElementCreatedListener>();
 
-  private boolean sizeSet = false;
-  private boolean focusSet = false;
+  private boolean sizeSet;
+  private boolean focusSet;
 
-  private static DateFormat taskDateFormat =
-    new SimpleDateFormat("yyyyMMddHHmmss");
+  private static final DateFormat taskDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
 
   /**
    * Returns the title that will be used as title of the dialog.
@@ -291,6 +290,7 @@
    * @param comp the Component to be added.
    * @param constraints the constraints.
    */
+  @Override
   public void add(Component comp, Object constraints)
   {
     mainPanel.add(comp, constraints);
@@ -378,6 +378,7 @@
     CustomHTMLEditorKit htmlEditor = new CustomHTMLEditorKit();
     htmlEditor.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent ev)
       {
         if (AUTHENTICATE.toString().equals(ev.getActionCommand()))
@@ -535,7 +536,7 @@
    * of doing whatever is required (close the dialog, launch a task, etc.).
    *
    */
-  abstract public void okClicked();
+  public abstract void okClicked();
 
   /**
    * Adds a configuration element created listener.
@@ -558,21 +559,6 @@
   }
 
   /**
-   * Notifies the configuration element created listener that a new object has
-   * been created.
-   * @param configObject the created object.
-   */
-  protected void notifyConfigurationElementCreated(Object configObject)
-  {
-    for (ConfigurationElementCreatedListener listener :
-      getConfigurationElementCreatedListeners())
-    {
-      listener.elementCreated(
-          new ConfigurationElementCreatedEvent(this, configObject));
-    }
-  }
-
-  /**
    * Returns the list of configuration listeners.
    * @return the list of configuration listeners.
    */
@@ -668,41 +654,34 @@
     progressDialog.setTaskIsOver(false);
     boolean rebuildIndexes;
     String backendName = index.getBackend().getBackendID();
+    LocalizableMessage summary = INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get();
     if (!isServerRunning())
     {
-      rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog,
-          INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
+      rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog, summary,
           INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_OFFLINE_DETAILS.get(
               index.getName(), backendName));
     }
+    else if (isLocal())
+    {
+      rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog, summary,
+          INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_ONLINE_DETAILS.get(
+              index.getName(), backendName, backendName));
+    }
     else
     {
-      if (isLocal())
-      {
-        rebuildIndexes = Utilities.displayConfirmationDialog(progressDialog,
-            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
-            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_ONLINE_DETAILS.get(
-                index.getName(), backendName, backendName));
-      }
-      else
-      {
-        Utilities.displayWarningDialog(progressDialog,
-            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_SUMMARY.get(),
-            INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_REMOTE_DETAILS.get(
-                index.getName(), backendName));
-        rebuildIndexes = false;
-      }
+      Utilities.displayWarningDialog(progressDialog, summary,
+          INFO_CTRL_PANEL_INDEX_REBUILD_REQUIRED_REMOTE_DETAILS.get(
+              index.getName(), backendName));
+      rebuildIndexes = false;
     }
     if (rebuildIndexes)
     {
-      SortedSet<AbstractIndexDescriptor> indexes =
-        new TreeSet<AbstractIndexDescriptor>();
+      SortedSet<AbstractIndexDescriptor> indexes = new TreeSet<AbstractIndexDescriptor>();
       indexes.add(index);
       SortedSet<String> baseDNs = new TreeSet<String>();
       for (BaseDNDescriptor b : index.getBackend().getBaseDns())
       {
-        String baseDN = Utilities.unescapeUtf8(b.getDn().toString());
-        baseDNs.add(baseDN);
+        baseDNs.add(Utilities.unescapeUtf8(b.getDn().toString()));
       }
 
       RebuildIndexTask newTask = new RebuildIndexTask(getInfo(),
@@ -760,7 +739,7 @@
   protected class IgnoreItemListener implements ItemListener
   {
     private Object selectedItem;
-    private JComboBox combo;
+    private final JComboBox combo;
 
     /**
      * Constructor.
@@ -776,9 +755,8 @@
       }
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
+    @Override
     public void itemStateChanged(ItemEvent ev)
     {
       Object o = combo.getSelectedItem();
@@ -790,13 +768,10 @@
           for (int i=0; i<combo.getModel().getSize(); i++)
           {
             Object item = combo.getModel().getElementAt(i);
-            if (item instanceof CategorizedComboBoxElement)
+            if (item instanceof CategorizedComboBoxElement && !isCategory(item))
             {
-              if (!isCategory(item))
-              {
-                selectedItem = item;
-                break;
-              }
+              selectedItem = item;
+              break;
             }
           }
         }
@@ -848,15 +823,14 @@
     {
       LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
       mb.append(details);
-      mb.append("<br><br>"+getAuthenticateHTML());
+      mb.append("<br><br>").append(getAuthenticateHTML());
       LocalizableMessage title = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get();
       updateErrorPane(errorPane, title, ColorAndFontConstants.errorTitleFont,
           mb.toMessage(), ColorAndFontConstants.defaultFont);
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(true);
@@ -869,9 +843,8 @@
     {
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(false);
@@ -890,19 +863,9 @@
    */
   protected boolean authenticationRequired(ServerDescriptor desc)
   {
-    boolean returnValue;
     ServerDescriptor.ServerStatus status = desc.getStatus();
-    if (((status == ServerDescriptor.ServerStatus.STARTED) &&
-        !desc.isAuthenticated()) ||
-        (status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE))
-    {
-      returnValue = true;
-    }
-    else
-    {
-      returnValue = false;
-    }
-    return returnValue;
+    return (status == ServerDescriptor.ServerStatus.STARTED && !desc.isAuthenticated())
+        || status == ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE;
   }
 
   /**
@@ -919,14 +882,13 @@
       LocalizableMessage title = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get();
       LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
       mb.append(details);
-      mb.append("<br><br>"+getAuthenticateHTML());
+      mb.append("<br><br>").append(getAuthenticateHTML());
       updateErrorPane(errorPane, title, ColorAndFontConstants.errorTitleFont,
           mb.toMessage(), ColorAndFontConstants.defaultFont);
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(true);
@@ -938,9 +900,8 @@
     {
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(false);
@@ -965,21 +926,20 @@
       LocalizableMessage authRequired)
   {
     ServerDescriptor.ServerStatus status = desc.getStatus();
-    if ((status != ServerDescriptor.ServerStatus.STARTED) &&
-        (status != ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE))
+    if (status != ServerDescriptor.ServerStatus.STARTED &&
+        status != ServerDescriptor.ServerStatus.NOT_CONNECTED_TO_REMOTE)
     {
       LocalizableMessage title = INFO_CTRL_PANEL_SERVER_NOT_RUNNING_SUMMARY.get();
       LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
       mb.append(detailsServerNotRunning);
-      mb.append("<br><br>"+getStartServerHTML());
+      mb.append("<br><br>").append(getStartServerHTML());
       updateErrorPane(errorPane, title, ColorAndFontConstants.errorTitleFont,
           mb.toMessage(),
           ColorAndFontConstants.defaultFont);
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(true);
@@ -992,14 +952,13 @@
       LocalizableMessage title = INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_SUMMARY.get();
       LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
       mb.append(authRequired);
-      mb.append("<br><br>"+getAuthenticateHTML());
+      mb.append("<br><br>").append(getAuthenticateHTML());
       updateErrorPane(errorPane, title, ColorAndFontConstants.errorTitleFont,
           mb.toMessage(), ColorAndFontConstants.defaultFont);
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(true);
@@ -1011,9 +970,8 @@
     {
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           errorPane.setVisible(false);
@@ -1041,13 +999,12 @@
    */
   protected boolean isCategory(Object o)
   {
-    boolean isCategory = false;
     if (o instanceof CategorizedComboBoxElement)
     {
       CategorizedComboBoxElement desc = (CategorizedComboBoxElement)o;
-      isCategory = desc.getType() == CategorizedComboBoxElement.Type.CATEGORY;
+      return desc.getType() == CategorizedComboBoxElement.Type.CATEGORY;
     }
-    return isCategory;
+    return false;
   }
 
   /**
@@ -1086,15 +1043,10 @@
         // Do it outside the event thread if the panel requires it.
         BackgroundTask<Void> worker = new BackgroundTask<Void>()
         {
+          @Override
           public Void processBackgroundTask() throws Throwable
           {
-            try
-            {
-              Thread.sleep(1000);
-            }
-            catch (Throwable t)
-            {
-            }
+            StaticUtils.sleep(1000);
             configurationChanged(new ConfigurationChangeEvent(
                 StatusGenericPanel.this.info,
                 StatusGenericPanel.this.info.getServerDescriptor()));
@@ -1102,6 +1054,7 @@
           }
 
 
+          @Override
           public void backgroundTaskCompleted(Void returnValue,
               Throwable t)
           {
@@ -1129,25 +1082,13 @@
     }
   }
 
-  /**
-   * Displays the main panel.
-   *
-   */
+  /** Displays the main panel. */
   protected void displayMainPanel()
   {
     cardLayout.show(cardPanel, MAIN_PANEL);
   }
 
   /**
-   * Returns whether the main panel is visible or not.
-   * @return whether the main panel is visible or not.
-   */
-  protected boolean isMainPanelVisible()
-  {
-    return mainPanel.isVisible();
-  }
-
-  /**
    * Displays a message and hides the main panel.
    * @param msg the message to be displayed.
    */
@@ -1173,15 +1114,6 @@
   }
 
   /**
-   * Returns whether the message is visible or not.
-   * @return whether the message is visible or not.
-   */
-  protected boolean isMessageVisible()
-  {
-    return message.isVisible();
-  }
-
-  /**
    * Updates the contents of an editor pane using the error format.
    * @param pane the editor pane to be updated.
    * @param title the title.
@@ -1196,20 +1128,6 @@
   }
 
   /**
-   * Updates the contents of an editor pane using the warning format.
-   * @param pane the editor pane to be updated.
-   * @param title the title.
-   * @param titleFont the font to be used for the title.
-   * @param details the details message.
-   * @param detailsFont the font to be used for the details.
-   */
-  protected void updateWarningPane(JEditorPane pane, LocalizableMessage title,
-      Font titleFont, LocalizableMessage details, Font detailsFont)
-  {
-    updatePane(pane, title, titleFont, details, detailsFont, PanelType.WARNING);
-  }
-
-  /**
    * Updates the contents of an editor pane using the confirmation format.
    * @param pane the editor pane to be updated.
    * @param title the title.
@@ -1220,33 +1138,21 @@
   protected void updateConfirmationPane(JEditorPane pane, LocalizableMessage title,
       Font titleFont, LocalizableMessage details, Font detailsFont)
   {
-    updatePane(pane, title, titleFont, details, detailsFont,
-        PanelType.CONFIRMATION);
+    updatePane(pane, title, titleFont, details, detailsFont, PanelType.CONFIRMATION);
   }
 
-  /**
-   * The different types of error panels that are handled.
-   *
-   */
-  protected enum PanelType
+  /** The different types of error panels that are handled. */
+  private enum PanelType
   {
-    /**
-     * The message in the panel is an error.
-     */
+    /** The message in the panel is an error. */
     ERROR,
-    /**
-     * The message in the panel is a confirmation.
-     */
+    /** The message in the panel is a confirmation. */
     CONFIRMATION,
-    /**
-     * The message in the panel is an information message.
-     */
+    /** The message in the panel is an information message. */
     INFORMATION,
-    /**
-     * The message in the panel is a warning message.
-     */
+    /** The message in the panel is a warning message. */
     WARNING
-  };
+  }
 
   /**
    * Updates the contents of an editor pane using the provided format.
@@ -1312,9 +1218,8 @@
     {
       SwingUtilities.invokeLater(new Runnable()
       {
-        /**
-         * {@inheritDoc}
-         */
+        /** {@inheritDoc} */
+        @Override
         public void run()
         {
           pane.invalidate();
@@ -1350,6 +1255,7 @@
     updateComboBoxModel(newElements, model);
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         combo.setVisible(newElements.size() > 0);
@@ -1380,8 +1286,7 @@
   {
     LinkedHashSet<CategorizedComboBoxElement> newElements =
       new LinkedHashSet<CategorizedComboBoxElement>();
-    SortedSet<String> backendIDs =
-      new TreeSet<String>(new LowerCaseComparator());
+    SortedSet<String> backendIDs = new TreeSet<String>(new LowerCaseComparator());
     HashMap<String, SortedSet<String>> hmBaseDNs =
       new HashMap<String, SortedSet<String>>();
 
@@ -1391,8 +1296,7 @@
       {
         String backendID = backend.getBackendID();
         backendIDs.add(backendID);
-        SortedSet<String> baseDNs =
-          new TreeSet<String>(new LowerCaseComparator());
+        SortedSet<String> baseDNs = new TreeSet<String>(new LowerCaseComparator());
         for (BaseDNDescriptor baseDN : backend.getBaseDns())
         {
           try
@@ -1441,12 +1345,13 @@
    * @param comparator the object that will be used to compare the objects in
    * the model.  If <CODE>null</CODE>, the equals method will be used.
    */
-  protected void updateComboBoxModel(final Collection<?> newElements,
+  private void updateComboBoxModel(final Collection<?> newElements,
       final DefaultComboBoxModel model,
       final Comparator<Object> comparator)
   {
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         Utilities.updateComboBoxModel(newElements, model, comparator);
@@ -1483,8 +1388,7 @@
             }
             dns.add(dn);
             SortedSet<AbstractIndexDescriptor> indexes =
-              new TreeSet<AbstractIndexDescriptor>();
-            indexes.addAll(backend.getIndexes());
+              new TreeSet<AbstractIndexDescriptor>(backend.getIndexes());
             indexes.addAll(backend.getVLVIndexes());
             SortedSet<AbstractIndexDescriptor> currentIndexes =
               hmIndexes.get(dn);
@@ -1542,10 +1446,10 @@
         {
           boolean availableChanged = false;
           boolean selectedChanged = false;
-          SortedSet<AbstractIndexDescriptor> availableIndexes =
-            addRemove.getAvailableListModel().getData();
-          SortedSet<AbstractIndexDescriptor> selectedIndexes =
-            addRemove.getSelectedListModel().getData();
+          SortableListModel<AbstractIndexDescriptor> availableListModel = addRemove.getAvailableListModel();
+          SortableListModel<AbstractIndexDescriptor> selectedListModel = addRemove.getSelectedListModel();
+          SortedSet<AbstractIndexDescriptor> availableIndexes = availableListModel.getData();
+          SortedSet<AbstractIndexDescriptor> selectedIndexes = selectedListModel.getData();
           availableChanged = availableIndexes.retainAll(indexes);
           selectedChanged = selectedIndexes.retainAll(indexes);
 
@@ -1560,19 +1464,19 @@
           }
           if (availableChanged)
           {
-            addRemove.getAvailableListModel().clear();
-            addRemove.getAvailableListModel().addAll(availableIndexes);
-            addRemove.getAvailableListModel().fireContentsChanged(
-                addRemove.getAvailableListModel(), 0,
-                addRemove.getAvailableListModel().getSize());
+            availableListModel.clear();
+            availableListModel.addAll(availableIndexes);
+            availableListModel.fireContentsChanged(
+                availableListModel, 0,
+                availableListModel.getSize());
           }
           if (selectedChanged)
           {
-            addRemove.getSelectedListModel().clear();
-            addRemove.getSelectedListModel().addAll(selectedIndexes);
-            addRemove.getSelectedListModel().fireContentsChanged(
-                addRemove.getSelectedListModel(), 0,
-                addRemove.getSelectedListModel().getSize());
+            selectedListModel.clear();
+            selectedListModel.addAll(selectedIndexes);
+            selectedListModel.fireContentsChanged(
+                selectedListModel, 0,
+                selectedListModel.getSize());
           }
         }
       }
@@ -1686,7 +1590,7 @@
    * @param resetLogs whether the contents of the progress dialog should be
    * reset or not.
    */
-  protected void launchOperation(final Task task, LocalizableMessage initialSummary,
+  private void launchOperation(final Task task, LocalizableMessage initialSummary,
       final LocalizableMessage successSummary, final LocalizableMessage successDetail,
       final LocalizableMessage errorSummary,
       final LocalizableMessage errorDetail,
@@ -1730,8 +1634,7 @@
   {
     dialog.setTaskIsOver(false);
     dialog.getProgressBar().setIndeterminate(true);
-    dialog.addPrintStreamListeners(task.getOutPrintStream(),
-        task.getErrorPrintStream());
+    dialog.addPrintStreamListeners(task.getOutPrintStream(), task.getErrorPrintStream());
     if (resetLogs)
     {
       dialog.resetProgressLogs();
@@ -1751,9 +1654,8 @@
     dialog.getProgressBar().setVisible(true);
     BackgroundTask<Task> worker = new BackgroundTask<Task>()
     {
-      /**
-       * {@inheritDoc}
-       */
+      /** {@inheritDoc} */
+      @Override
       public Task processBackgroundTask() throws Throwable
       {
         task.runTask();
@@ -1764,9 +1666,8 @@
         return task;
       }
 
-      /**
-       * {@inheritDoc}
-       */
+      /** {@inheritDoc} */
+      @Override
       public void backgroundTaskCompleted(Task returnValue, Throwable t)
       {
         String summaryMsg;
@@ -1786,29 +1687,24 @@
           if (t != null)
           {
             logger.warn(LocalizableMessage.raw("Error occurred running task: "+t, t));
-            if ((task.getReturnCode() != null) &&
-                (errorDetailCode != null))
+            if (task.getReturnCode() != null && errorDetailCode != null)
             {
               String sThrowable;
               if (t instanceof OpenDsException)
               {
                 sThrowable = ((OpenDsException)t).getMessageObject().toString();
               }
+              else if (t.getMessage() != null)
+              {
+                sThrowable = t.getMessage();
+              }
               else
               {
-                if (t.getMessage() != null)
-                {
-                  sThrowable = t.getMessage();
-                }
-                else
-                {
-                  sThrowable = t.toString();
-                }
+                sThrowable = t.toString();
               }
               LocalizableMessageBuilder mb = new LocalizableMessageBuilder();
               mb.append(errorDetailCode.get(task.getReturnCode()));
-              mb.append(
-                  "  "+INFO_CTRL_PANEL_DETAILS_THROWABLE.get(sThrowable));
+              mb.append("  ").append(INFO_CTRL_PANEL_DETAILS_THROWABLE.get(sThrowable));
               summaryMsg = Utilities.getFormattedError(errorSummary,
                   ColorAndFontConstants.errorTitleFont,
                   mb.toMessage(), ColorAndFontConstants.defaultFont);
@@ -1827,8 +1723,7 @@
               summaryMsg = null;
             }
           }
-          else if ((task.getReturnCode() != null) &&
-              (errorDetailCode != null))
+          else if (task.getReturnCode() != null && errorDetailCode != null)
           {
             summaryMsg = Utilities.getFormattedError(errorSummary,
                 ColorAndFontConstants.errorTitleFont,
@@ -1879,7 +1774,7 @@
     try
     {
       int n = Integer.parseInt(stringValue);
-      if ((n > maxValue) || (n < minValue))
+      if (n > maxValue || n < minValue)
       {
         throw new RuntimeException("Invalid value");
       }
@@ -1894,7 +1789,6 @@
    * Starts the server.  This method will launch a task and open a progress
    * dialog that will start the server.  This method must be called from the
    * event thread.
-   *
    */
   protected void startServer()
   {
@@ -1951,7 +1845,7 @@
           INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(),
           INFO_CTRL_PANEL_CONFIRM_STOP_SERVER_DETAILS.get());
     }
-    if ((errors.size() == 0) && confirmed)
+    if (errors.size() == 0 && confirmed)
     {
       launchOperation(newTask,
           INFO_CTRL_PANEL_STOPPING_SERVER_SUMMARY.get(),
@@ -1982,8 +1876,7 @@
         Utilities.createFrame(),
         Utilities.getParentDialog(this),
         INFO_CTRL_PANEL_RESTART_SERVER_PROGRESS_DLG_TITLE.get(), getInfo());
-    RestartServerTask newTask = new RestartServerTask(getInfo(),
-        progressDialog);
+    RestartServerTask newTask = new RestartServerTask(getInfo(), progressDialog);
     for (Task task : getInfo().getTasks())
     {
       task.canLaunch(newTask, errors);
@@ -1995,7 +1888,7 @@
           INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(),
           INFO_CTRL_PANEL_CONFIRM_RESTART_SERVER_DETAILS.get());
     }
-    if ((errors.size() == 0) && confirmed)
+    if (errors.size() == 0 && confirmed)
     {
       launchOperation(newTask,
           INFO_CTRL_PANEL_STOPPING_SERVER_SUMMARY.get(),
@@ -2016,9 +1909,8 @@
   /**
    * Displays a dialog asking for authentication. This method must be called
    * from the event thread.
-   *
    */
-  protected void authenticate()
+  private void authenticate()
   {
     if (!getLoginDialog().isVisible())
     {
@@ -2035,22 +1927,12 @@
    */
   protected GenericDialog getLoginDialog()
   {
-    if (isLocal())
-    {
-      GenericDialog loginDialog =
-        ControlCenterMainPane.getLocalServerLoginDialog(getInfo());
-      Utilities.centerGoldenMean(loginDialog, Utilities.getFrame(this));
-      loginDialog.setModal(true);
-      return loginDialog;
-    }
-    else
-    {
-      GenericDialog localOrRemoteDialog =
-        ControlCenterMainPane.getLocalOrRemoteDialog(getInfo());
-      Utilities.centerGoldenMean(localOrRemoteDialog, Utilities.getFrame(this));
-      localOrRemoteDialog.setModal(true);
-      return localOrRemoteDialog;
-    }
+    GenericDialog dialog = isLocal()
+        ? getLocalServerLoginDialog(getInfo())
+        : getLocalOrRemoteDialog(getInfo());
+    Utilities.centerGoldenMean(dialog, Utilities.getFrame(this));
+    dialog.setModal(true);
+    return dialog;
   }
 
   /**
@@ -2194,18 +2076,6 @@
   }
 
   /**
-   * Returns the first value for a given attribute in the provided entry.
-   * @param sr the entry.  It may be <CODE>null</CODE>.
-   * @param attrName the attribute name.
-   * @return the first value for a given attribute in the provided entry.
-   */
-  protected Object getFirstMonitoringValue(CustomSearchResult sr,
-      String attrName)
-  {
-    return Utilities.getFirstMonitoringValue(sr, attrName);
-  }
-
-  /**
    * Returns the label to be used in panels (with ':') based on the definition
    * of the monitoring attribute.
    * @param attr the monitoring attribute.
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
index b1504c7..b55bbeb 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/ConfigReader.java
@@ -24,11 +24,8 @@
  *      Copyright 2008-2009 Sun Microsystems, Inc.
  *      Portions Copyright 2014 ForgeRock AS
  */
-
 package org.opends.guitools.controlpanel.util;
 
-import static org.opends.messages.AdminToolMessages.*;
-
 import java.io.File;
 import java.net.InetAddress;
 import java.util.ArrayList;
@@ -39,13 +36,12 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
-
+import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
 import org.opends.guitools.controlpanel.datamodel.ConnectionHandlerDescriptor;
 import org.opends.guitools.controlpanel.datamodel.VLVSortOrder;
 import org.opends.guitools.controlpanel.task.OfflineUpdateException;
 import org.opends.server.admin.std.meta.AdministrationConnectorCfgDefn;
-import org.forgerock.opendj.config.server.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.tools.tasks.TaskEntry;
 import org.opends.server.types.DN;
@@ -55,10 +51,11 @@
 import org.opends.server.types.OpenDsException;
 import org.opends.server.types.Schema;
 
+import static org.opends.messages.AdminToolMessages.*;
+
 /**
  * An abstract class providing some common interface for the class that read
  * the configuration (and if the server is running, the monitoring information).
- *
  */
 public abstract class ConfigReader
 {
@@ -322,19 +319,19 @@
     if (s != null)
     {
       String[] attrNames = s.split(" ");
-      for (int i=0; i<attrNames.length; i++)
+      for (String attrName : attrNames)
       {
-        if (attrNames[i].startsWith("+"))
+        if (attrName.startsWith("+"))
         {
-          sortOrder.add(new VLVSortOrder(attrNames[i].substring(1), true));
+          sortOrder.add(new VLVSortOrder(attrName.substring(1), true));
         }
-        else if (attrNames[i].startsWith("-"))
+        else if (attrName.startsWith("-"))
         {
-          sortOrder.add(new VLVSortOrder(attrNames[i].substring(1), false));
+          sortOrder.add(new VLVSortOrder(attrName.substring(1), false));
         }
         else
         {
-          sortOrder.add(new VLVSortOrder(attrNames[i], true));
+          sortOrder.add(new VLVSortOrder(attrName, true));
         }
       }
     }
diff --git a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
index f86e06d..e66abf1 100644
--- a/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
+++ b/opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -93,6 +93,7 @@
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.opendj.config.server.ConfigException;
 import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.opends.guitools.controlpanel.ControlPanel;
 import org.opends.guitools.controlpanel.browser.IconPool;
 import org.opends.guitools.controlpanel.datamodel.CategorizedComboBoxElement;
@@ -114,12 +115,17 @@
 import org.opends.quicksetup.util.Utils;
 import org.opends.server.api.AttributeSyntax;
 import org.opends.server.api.ConfigHandler;
-import org.forgerock.opendj.ldap.schema.MatchingRule;
 import org.opends.server.config.ConfigEntry;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.LockFileManager;
 import org.opends.server.schema.SchemaConstants;
-import org.opends.server.types.*;
+import org.opends.server.types.AttributeType;
+import org.opends.server.types.CommonSchemaElements;
+import org.opends.server.types.DN;
+import org.opends.server.types.OpenDsException;
+import org.opends.server.types.RDN;
+import org.opends.server.types.Schema;
+import org.opends.server.types.SchemaFileElement;
 import org.opends.server.util.ServerConstants;
 import org.opends.server.util.StaticUtils;
 
@@ -2480,16 +2486,7 @@
     }
   }
 
-
-
-  /**
-   * Returns the first value for a given attribute in the provided entry.
-   * @param sr the entry.  It may be <CODE>null</CODE>.
-   * @param attrName the attribute name.
-   * @return the first value for a given attribute in the provided entry.
-   */
-  public static Object getFirstMonitoringValue(CustomSearchResult sr,
-      String attrName)
+  private static Object getFirstMonitoringValue(CustomSearchResult sr, String attrName)
   {
     if (sr != null)
     {
@@ -2519,6 +2516,34 @@
   }
 
   /**
+   * Returns the first value as a String for a given attribute in the provided
+   * entry.
+   *
+   * @param sr
+   *          the entry. It may be <CODE>null</CODE>.
+   * @param attrName
+   *          the attribute name.
+   * @return the first value as a String for a given attribute in the provided
+   *         entry.
+   */
+  public static String getFirstValueAsString(CustomSearchResult sr, String attrName)
+  {
+    if (sr != null)
+    {
+      final List<Object> values = sr.getAttributeValues(attrName);
+      if (values != null && !values.isEmpty())
+      {
+        final Object o = values.get(0);
+        if (o != null)
+        {
+          return String.valueOf(o);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
    * Returns the monitoring value in a String form to be displayed to the user.
    * @param attr the attribute to analyze.
    * @param monitoringEntry the monitoring entry.
@@ -2527,9 +2552,7 @@
   public static String getMonitoringValue(MonitoringAttributes attr,
       CustomSearchResult monitoringEntry)
   {
-    Object monitoringValue =
-      Utilities.getFirstMonitoringValue(monitoringEntry,
-        attr.getAttributeName());
+    String monitoringValue = getFirstValueAsString(monitoringEntry, attr.getAttributeName());
     if (monitoringValue == null)
     {
       return NO_VALUE_SET.toString();
@@ -2540,46 +2563,42 @@
     }
     else if (attr.isNumericDate())
     {
-      if("0".equals(monitoringValue.toString()))
+      if ("0".equals(monitoringValue))
       {
         return NO_VALUE_SET.toString();
       }
-      else
-      {
-        Long l = Long.parseLong(monitoringValue.toString());
-        Date date = new Date(l);
-        return ConfigFromDirContext.formatter.format(date);
-      }
+      Long l = Long.parseLong(monitoringValue);
+      Date date = new Date(l);
+      return ConfigFromDirContext.formatter.format(date);
     }
     else if (attr.isTime())
     {
-      if("-1".equals(monitoringValue.toString()))
+      if ("-1".equals(monitoringValue))
       {
         return NO_VALUE_SET.toString();
       }
-      return monitoringValue.toString();
+      return monitoringValue;
     }
     else if (attr.isGMTDate())
     {
       try
       {
-        Date date = ConfigFromDirContext.utcParser.parse(
-            monitoringValue.toString());
+        Date date = ConfigFromDirContext.utcParser.parse(monitoringValue);
         return ConfigFromDirContext.formatter.format(date);
       }
       catch (Throwable t)
       {
-        return monitoringValue.toString();
+        return monitoringValue;
       }
     }
     else if (attr.isValueInBytes())
     {
-      Long l = Long.parseLong(monitoringValue.toString());
+      Long l = Long.parseLong(monitoringValue);
       long mb = l / (1024 * 1024);
       long kbs = (l - mb * 1024 * 1024) / 1024;
       return INFO_CTRL_PANEL_MEMORY_VALUE.get(mb, kbs).toString();
     }
-    return monitoringValue.toString();
+    return monitoringValue;
   }
 
   /**
@@ -2593,13 +2612,12 @@
   public static boolean isNotImplemented(MonitoringAttributes attr,
       CustomSearchResult monitoringEntry)
   {
-    Object monitoringValue = Utilities.getFirstMonitoringValue(
-        monitoringEntry, attr.getAttributeName());
+    String monitoringValue = getFirstValueAsString(monitoringEntry, attr.getAttributeName());
     if (attr.isNumeric() && monitoringValue != null)
     {
       try
       {
-        Long.parseLong(String.valueOf(monitoringValue));
+        Long.parseLong(monitoringValue);
         return false;
       }
       catch (Throwable t)
@@ -2750,4 +2768,125 @@
     return false;
   }
 
+  /**
+   * Computes the possible comparison results for monitoring information.
+   *
+   * @param monitor1
+   *          the first monitor to compare
+   * @param monitor2
+   *          the second monitor to compare
+   * @param possibleResults
+   *          where possible results are output
+   * @param attrNames
+   *          the names for which to compute possible comparison results
+   */
+  public static void computeMonitoringPossibleResults(CustomSearchResult monitor1, CustomSearchResult monitor2,
+      ArrayList<Integer> possibleResults, Collection<String> attrNames)
+  {
+    for (String attrName : attrNames)
+    {
+      int possibleResult;
+      if (monitor1 == null)
+      {
+        if (monitor2 == null)
+        {
+          possibleResult = 0;
+        }
+        else
+        {
+          possibleResult = -1;
+        }
+      }
+      else if (monitor2 == null)
+      {
+        possibleResult = 1;
+      }
+      else
+      {
+        Object v1 = getFirstValue(monitor1, attrName);
+        Object v2 = getFirstValue(monitor2, attrName);
+        if (v1 == null)
+        {
+          if (v2 == null)
+          {
+            possibleResult = 0;
+          }
+          else
+          {
+            possibleResult = -1;
+          }
+        }
+        else if (v2 == null)
+        {
+          possibleResult = 1;
+        }
+        else if (v1 instanceof Number)
+        {
+          if (v2 instanceof Number)
+          {
+            if ((v1 instanceof Double) || (v2 instanceof Double))
+            {
+              double n1 = ((Number) v1).doubleValue();
+              double n2 = ((Number) v2).doubleValue();
+              if (n1 > n2)
+              {
+                possibleResult = 1;
+              }
+              else if (n1 < n2)
+              {
+                possibleResult = -1;
+              }
+              else
+              {
+                possibleResult = 0;
+              }
+            }
+            else
+            {
+              long n1 = ((Number) v1).longValue();
+              long n2 = ((Number) v2).longValue();
+              if (n1 > n2)
+              {
+                possibleResult = 1;
+              }
+              else if (n1 < n2)
+              {
+                possibleResult = -1;
+              }
+              else
+              {
+                possibleResult = 0;
+              }
+            }
+          }
+          else
+          {
+            possibleResult = 1;
+          }
+        }
+        else if (v2 instanceof Number)
+        {
+          possibleResult = -1;
+        }
+        else
+        {
+          possibleResult = v1.toString().compareTo(v2.toString());
+        }
+      }
+      possibleResults.add(possibleResult);
+    }
+  }
+
+  private static Object getFirstValue(CustomSearchResult monitor, String attrName)
+  {
+    for (String attr : monitor.getAttributeNames())
+    {
+      if (attr.equalsIgnoreCase(attrName))
+      {
+        return getFirstMonitoringValue(monitor, attrName);
+      }
+    }
+    return null;
+  }
+
 }

--
Gitblit v1.10.0