From 3e879ef8897ec8c1b2dff76659e0de7bd8b4e134 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 01 Jul 2014 15:23:25 +0000
Subject: [PATCH] Code cleanups.

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java                                |   59 +-
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java                       |  767 +++++++++------------------
 opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java                |   19 
 opendj-sdk/opends/src/server/org/opends/server/replication/server/MsgQueue.java                                      |   65 +
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java   |   97 +--
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/LDAPConnectionPool.java                      |  198 +-----
 opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java                                |  116 ---
 opendj-sdk/opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java                         |   75 +-
 opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java |  218 +++-----
 9 files changed, 553 insertions(+), 1,061 deletions(-)

diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
index 5fd3a99..01884ad 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/BrowserController.java
@@ -89,20 +89,20 @@
   /**
    * The mask used to display the number of ACIs or not.
    */
-  public final static int DISPLAY_ACI_COUNT        = 0x01;
+  private static final int DISPLAY_ACI_COUNT = 0x01;
 
   /**
    * The list of attributes that are used to sort the entries (if the sorting
    * option is used).
    */
-  public static final String[] SORT_ATTRIBUTES = {"cn", "givenname", "o", "ou",
-    "sn", "uid"};
+  private static final String[] SORT_ATTRIBUTES =
+    { "cn", "givenname", "o", "ou", "sn", "uid" };
 
   /**
    * This is a key value.  It is used to specify that the attribute that should
    * be used to display the entry is the RDN attribute.
    */
-  public static final String RDN_ATTRIBUTE = "rdn attribute";
+  private static final String RDN_ATTRIBUTE = "rdn attribute";
 
   /**
    * The filter used to retrieve all the entries.
@@ -110,12 +110,12 @@
   public static final String ALL_OBJECTS_FILTER =
     "(|(objectClass=*)(objectClass=ldapsubentry))";
 
-  private JTree tree;
-  private DefaultTreeModel treeModel;
-  private RootNode rootNode;
+  private final JTree tree;
+  private final DefaultTreeModel treeModel;
+  private final RootNode rootNode;
   private int displayFlags;
   private String displayAttribute;
-  private boolean showAttributeName;
+  private final boolean showAttributeName;
   private InitialLdapContext ctxConfiguration;
   private InitialLdapContext ctxUserData;
   private boolean followReferrals;
@@ -127,12 +127,12 @@
   private NumSubordinateHacker numSubordinateHacker;
   private int queueTotalSize;
   private int maxChildren = 0;
-  private Collection<BrowserEventListener> listeners =
+  private final Collection<BrowserEventListener> listeners =
     new ArrayList<BrowserEventListener>();
-  private LDAPConnectionPool connectionPool;
-  private IconPool iconPool;
+  private final LDAPConnectionPool connectionPool;
+  private final IconPool iconPool;
 
-  private NodeSearcherQueue refreshQueue;
+  private final NodeSearcherQueue refreshQueue;
 
   private String filter;
 
@@ -159,6 +159,7 @@
     tree.addTreeExpansionListener(this);
     tree.setCellRenderer(new BrowserCellRenderer());
     displayFlags = DISPLAY_ACI_COUNT;
+    showAttributeName = false;
     displayAttribute = RDN_ATTRIBUTE;
     followReferrals = false;
     sorted = false;
@@ -260,17 +261,16 @@
   }
 
   /**
-   * Tells wether the given suffix is in the tree or not.
+   * Tells whether the given suffix is in the tree or not.
    * @param suffixDn the DN of the suffix to be analyzed.
    * @return <CODE>true</CODE> if the provided String is the DN of a suffix
    * and <CODE>false</CODE> otherwise.
    * @throws IllegalArgumentException if a node with the given dn exists but
    * is not a suffix node.
    */
-  public boolean hasSuffix(String suffixDn)
-  throws IllegalArgumentException
+  public boolean hasSuffix(String suffixDn) throws IllegalArgumentException
   {
-    return (findSuffixNode(suffixDn, rootNode) != null);
+    return findSuffixNode(suffixDn, rootNode) != null;
   }
 
   /**
@@ -328,28 +328,6 @@
     return new TreePath(treeModel.getPathToRoot(newNode));
   }
 
-
-
-  /**
-   * Remove the suffix from this controller.
-   * The controller updates the JTree and returns the TreePath
-   * of the parent node.
-   * @param suffixDn the DN of the suffix to be removed.
-   * @return the TreePath of the parent node of the removed node.
-   */
-  public TreePath removeSuffix(String suffixDn) {
-    TreePath result = null;
-    BasicNode node = findSuffixNode(suffixDn, rootNode);
-    TreeNode parentNode = node.getParent();
-    /* If the parent is null... the node is no longer in the tree */
-    if (parentNode != null) {
-      removeOneNode(node);
-      result = new TreePath(treeModel.getPathToRoot(parentNode));
-    }
-    return result;
-  }
-
-
   /**
    * Remove all the suffixes.
    * The controller removes all the nodes from the JTree except the root.
@@ -403,18 +381,6 @@
   }
 
   /**
-   * Says wether to show the attribute name or not.
-   * This routine collapses the JTree and invokes startRefresh().
-   * @param showAttributeName whether to show the attribute name or not.
-   */
-  public void showAttributeName(boolean showAttributeName) {
-    this.showAttributeName = showAttributeName;
-    stopRefresh();
-    removeAllChildNodes(rootNode, true /* Keep suffixes */);
-    startRefresh(null);
-  }
-
-  /**
    * Says wether we are showing the attribute name or not.
    * @return <CODE>true</CODE> if we are showing the attribute name and
    * <CODE>false</CODE> otherwise.
@@ -586,16 +552,6 @@
     listeners.add(l);
   }
 
-
-  /**
-   * Remove a BrowserEventListener from this controller.
-   * @param l the listener to be removed.
-   */
-  public void removeBrowserEventListener(BrowserEventListener l) {
-    listeners.remove(l);
-  }
-
-
   /**
    * Notify this controller that an entry has been added.
    * The controller adds a new node in the JTree and starts refreshing this new
@@ -635,19 +591,18 @@
    * @return the tree path associated with the parent of the deleted node.
    */
   public TreePath notifyEntryDeleted(BrowserNodeInfo nodeInfo) {
-    TreePath result = null;
     BasicNode node = nodeInfo.getNode();
     if (node == rootNode) {
       throw new IllegalArgumentException("Root node cannot be removed");
     }
-    TreeNode parentNode = node.getParent();
 
     /* If the parent is null... the node is no longer in the tree */
+    final TreeNode parentNode = node.getParent();
     if (parentNode != null) {
       removeOneNode(node);
-      result = new TreePath(treeModel.getPathToRoot(parentNode));
+      return new TreePath(treeModel.getPathToRoot(parentNode));
     }
-    return result;
+    return null;
   }
 
 
@@ -663,50 +618,10 @@
   }
 
   /**
-   * Notify this controller that a child entry has changed.
-   * The controller has to refresh the corresponding node and (if necessary)
-   * itself.
-   * @param nodeInfo the parent of the node that changed.
-   * @param dn the DN of the entry that changed.
-   */
-  public void notifyChildEntryChanged(BrowserNodeInfo nodeInfo, String dn) {
-    BasicNode node = nodeInfo.getNode();
-    startRefreshNode(node, null, true);
-  }
-
-  /**
-   * Notify this controller that a child entry has been added.
-   * The controller has to refresh the corresponding node and (if necessary)
-   * itself.
-   * @param nodeInfo the parent of the node that was added.
-   * @param dn the DN of the entry that was added.
-   */
-  public void notifyChildEntryAdded(BrowserNodeInfo nodeInfo, String dn) {
-    BasicNode node = nodeInfo.getNode();
-    startRefreshNode(node, null, true);
-  }
-
-  /**
-   * Notify this controller that a child entry has been deleted.
-   * The controller has to refresh the corresponding node and (if necessary)
-   * itself.
-   * @param nodeInfo the parent of the node that was deleted.
-   * @param dn the DN of the entry that was deleted.
-   */
-  public void notifyChildEntryDeleted(BrowserNodeInfo nodeInfo, String dn) {
-    BasicNode node = nodeInfo.getNode();
-    if (node.getParent() != null) {
-      startRefreshNode((BasicNode) node.getParent(), null, true);
-    } else {
-      startRefreshNode(node, null, true);
-    }
-  }
-
-
-  /**
    * Notify this controller that authentication data have changed in the
    * connection pool.
    */
+  @Override
   public void notifyAuthDataChanged() {
     notifyAuthDataChanged(null);
   }
@@ -718,7 +633,7 @@
    * url.
    * @param url the URL of the connection that changed.
    */
-  public void notifyAuthDataChanged(LDAPURL url) {
+  private void notifyAuthDataChanged(LDAPURL url) {
     // TODO: temporary implementation
     //    we should refresh only nodes :
     //    - whose URL matches 'url'
@@ -730,7 +645,7 @@
 
   /**
    * Start a refresh from the specified node.
-   * If some refresh are on-going on descendent nodes, they are stopped.
+   * If some refresh are on-going on descendant nodes, they are stopped.
    * If nodeInfo is null, refresh is started from the root.
    * @param nodeInfo the node to be refreshed.
    */
@@ -746,35 +661,15 @@
     startRefreshNode(node, null, true);
   }
 
-
-  /**
-   * Equivalent to startRefresh(null).
-   */
-  public void startRefresh() {
-    startRefresh(null);
-  }
-
-
   /**
    * Stop the current refreshing.
    * Nodes being expanded are collapsed.
    */
-  public void stopRefresh() {
+  private void stopRefresh() {
     stopRefreshNode(rootNode);
     // TODO: refresh must be stopped in a clean state.
   }
 
-
-  /**
-   * Shutdown the controller : all the backgroup threads are stopped.
-   * After this call, the controller is no longer usable.
-   */
-  public void shutDown() {
-    tree.removeTreeExpansionListener(this);
-    refreshQueue.shutdown();
-    connectionPool.flush();
-  }
-
   /**
    * Start refreshing the whole tree from the specified node.
    * We queue a refresh which:
@@ -784,7 +679,7 @@
    * @param localEntry the local entry corresponding to the node.
    * @param recursive whether the refresh must be executed recursively or not.
    */
-  void startRefreshNode(BasicNode node, SearchResult localEntry,
+  private void startRefreshNode(BasicNode node, SearchResult localEntry,
       boolean recursive) {
     if (node == rootNode) {
       // For the root node, readBaseEntry is meaningless.
@@ -803,7 +698,7 @@
       // The task does not *see* suffixes.
       // So we need to propagate the refresh on
       // the sub-suffixes if any.
-      if (recursive && (node instanceof SuffixNode)) {
+      if (recursive && node instanceof SuffixNode) {
         Enumeration<?> e = node.children();
         while (e.hasMoreElements()) {
           BasicNode child = (BasicNode)e.nextElement();
@@ -824,7 +719,7 @@
    * root node.
    * @param node the node where the refresh must stop.
    */
-  void stopRefreshNode(BasicNode node) {
+  private void stopRefreshNode(BasicNode node) {
     if (node == rootNode) {
       refreshQueue.cancelAll();
     }
@@ -844,11 +739,11 @@
    * Call startRefreshNode() on each referral node accessible from parentNode.
    * @param parentNode the parent node.
    */
-  void startRefreshReferralNodes(BasicNode parentNode) {
+  private void startRefreshReferralNodes(BasicNode parentNode) {
     Enumeration<?> e = parentNode.children();
     while (e.hasMoreElements()) {
       BasicNode child = (BasicNode)e.nextElement();
-      if ((child.getReferral() != null) || (child.getRemoteUrl() != null)) {
+      if (child.getReferral() != null || child.getRemoteUrl() != null) {
         startRefreshNode(child, null, true);
       }
       else {
@@ -866,10 +761,10 @@
    * @param parentNode the parent node.
    * @param keepSuffixes whether the suffixes should be kept or not.
    */
-  void removeAllChildNodes(BasicNode parentNode, boolean keepSuffixes) {
+  private void removeAllChildNodes(BasicNode parentNode, boolean keepSuffixes) {
     for (int i = parentNode.getChildCount() - 1; i >= 0; i--) {
       BasicNode child = (BasicNode)parentNode.getChildAt(i);
-      if ((child instanceof SuffixNode) && keepSuffixes) {
+      if (child instanceof SuffixNode && keepSuffixes) {
         removeAllChildNodes(child, true);
         child.setRefreshNeededOnExpansion(true);
       }
@@ -885,6 +780,7 @@
    * if it needs it (to search the children for instance).
    * @param event the tree expansion event.
    */
+  @Override
   public void treeExpanded(TreeExpansionEvent event) {
     if (!automaticallyExpandedNode)
     {
@@ -904,6 +800,7 @@
    * tasks on it are canceled.
    * @param event the tree collapse event.
    */
+  @Override
   public void treeCollapsed(TreeExpansionEvent event) {
     Object node = event.getPath().getLastPathComponent();
     if (!(node instanceof RootNode)) {
@@ -1054,32 +951,19 @@
    * @throws NamingException if there is an error retrieving the connection.
    * @return the LDAP connection to reading the base entry of a node.
    */
-  InitialLdapContext findConnectionForLocalEntry(BasicNode node,
-      boolean isConfigurationNode)
-  throws NamingException {
-    InitialLdapContext result;
+  private InitialLdapContext findConnectionForLocalEntry(BasicNode node,
+      boolean isConfigurationNode) throws NamingException
+  {
     if (node == rootNode) {
-      result = ctxConfiguration;
+      return ctxConfiguration;
     }
-    else  {
-      BasicNode parent = (BasicNode)node.getParent();
-      if ((parent != null) && (parent != rootNode))
-      {
-        result = findConnectionForDisplayedEntry(parent, isConfigurationNode);
-      }
-      else
-      {
-        if (isConfigurationNode)
-        {
-          result = ctxConfiguration;
-        }
-        else
-        {
-          result = ctxUserData;
-        }
-      }
+
+    final BasicNode parent = (BasicNode) node.getParent();
+    if (parent != null && parent != rootNode)
+    {
+      return findConnectionForDisplayedEntry(parent, isConfigurationNode);
     }
-    return result;
+    return isConfigurationNode ? ctxConfiguration : ctxUserData;
   }
 
   /**
@@ -1090,7 +974,6 @@
    */
   public boolean isConfigurationNode(BasicNode node)
   {
-    boolean isConfigurationNode = false;
     if (node instanceof SuffixNode)
     {
       String dn = node.getDN();
@@ -1103,12 +986,12 @@
           Utilities.areDnsEqual(dn, ConfigConstants.DN_BACKUP_ROOT) ||
           Utilities.areDnsEqual(dn, ServerConstants.DN_EXTERNAL_CHANGELOG_ROOT))
       {
-        isConfigurationNode = true;
+        return true;
       }
     }
     else if (node instanceof RootNode)
     {
-      isConfigurationNode = true;
+      return true;
     }
     else
     {
@@ -1116,7 +999,7 @@
       return isConfigurationNode(parentNode);
     }
 
-    return isConfigurationNode;
+    return false;
   }
 
   /**
@@ -1140,18 +1023,13 @@
    * @return the LDAP connection to search the displayed entry.
    * @throws NamingException if there is an error retrieving the connection.
    */
-  InitialLdapContext findConnectionForDisplayedEntry(BasicNode node,
-      boolean isConfigurationNode)
-  throws NamingException {
-    InitialLdapContext result;
-    if (followReferrals && (node.getRemoteUrl() != null))
+  private InitialLdapContext findConnectionForDisplayedEntry(BasicNode node,
+      boolean isConfigurationNode) throws NamingException {
+    if (followReferrals && node.getRemoteUrl() != null)
     {
-      result = connectionPool.getConnection(node.getRemoteUrl());
+      return connectionPool.getConnection(node.getRemoteUrl());
     }
-    else {
-      result = findConnectionForLocalEntry(node, isConfigurationNode);
-    }
-    return result;
+    return findConnectionForLocalEntry(node, isConfigurationNode);
   }
 
 
@@ -1162,8 +1040,7 @@
    * @param ctx the connection to be released.
    */
   void releaseLDAPConnection(InitialLdapContext ctx) {
-    if ((ctx != this.ctxConfiguration) &&
-        (ctx != this.ctxUserData))
+    if (ctx != this.ctxConfiguration && ctx != this.ctxUserData)
     {
       // Thus it comes from the connection pool
       connectionPool.releaseConnection(ctx);
@@ -1177,20 +1054,16 @@
    * @return the local entry URL for a given node.
    */
   LDAPURL findUrlForLocalEntry(BasicNode node) {
-    LDAPURL result;
     if (node == rootNode) {
-      result = LDAPConnectionPool.makeLDAPUrl(ctxConfiguration, "");
+      return LDAPConnectionPool.makeLDAPUrl(ctxConfiguration, "");
     }
-    else {
-      BasicNode parent = (BasicNode)node.getParent();
-      if (parent != null) {
-        LDAPURL parentUrl = findUrlForDisplayedEntry(parent);
-        result = LDAPConnectionPool.makeLDAPUrl(parentUrl, node.getDN());
-      } else {
-        result = LDAPConnectionPool.makeLDAPUrl(ctxConfiguration, node.getDN());
-      }
+    final BasicNode parent = (BasicNode) node.getParent();
+    if (parent != null)
+    {
+      final LDAPURL parentUrl = findUrlForDisplayedEntry(parent);
+      return LDAPConnectionPool.makeLDAPUrl(parentUrl, node.getDN());
     }
-    return result;
+    return LDAPConnectionPool.makeLDAPUrl(ctxConfiguration, node.getDN());
   }
 
 
@@ -1199,15 +1072,12 @@
    * @param node the node.
    * @return the displayed entry URL for a given node.
    */
-  LDAPURL findUrlForDisplayedEntry(BasicNode node) {
-    LDAPURL result;
-    if (followReferrals && (node.getRemoteUrl() != null)) {
-      result = node.getRemoteUrl();
+  private LDAPURL findUrlForDisplayedEntry(BasicNode node)
+  {
+    if (followReferrals && node.getRemoteUrl() != null) {
+      return node.getRemoteUrl();
     }
-    else {
-      result = findUrlForLocalEntry(node);
-    }
-    return result;
+    return findUrlForLocalEntry(node);
   }
 
 
@@ -1221,15 +1091,10 @@
    * @return the DN to use for searching children of a given node.
    */
   String findBaseDNForChildEntries(BasicNode node) {
-    String result;
-
-    if (followReferrals && (node.getRemoteUrl() != null)) {
-      result = node.getRemoteUrl().getRawBaseDN();
+    if (followReferrals && node.getRemoteUrl() != null) {
+      return node.getRemoteUrl().getRawBaseDN();
     }
-    else {
-      result = node.getDN();
-    }
-    return result;
+    return node.getDN();
   }
 
 
@@ -1240,24 +1105,20 @@
    * @return <CODE>true</CODE> if the node displays a remote entry and
    * <CODE>false</CODE> otherwise.
    */
-  boolean isDisplayedEntryRemote(BasicNode node) {
-    boolean result = false;
+  private boolean isDisplayedEntryRemote(BasicNode node) {
     if (followReferrals) {
       if (node == rootNode) {
-        result = false;
+        return false;
       }
-      else if (node.getRemoteUrl() != null) {
-        result = true;
+      if (node.getRemoteUrl() != null) {
+        return true;
       }
-      else {
-        BasicNode parent = (BasicNode)node.getParent();
-        if (parent != null) {
-          result = isDisplayedEntryRemote(parent);
-        }
+      final BasicNode parent = (BasicNode)node.getParent();
+      if (parent != null) {
+        return isDisplayedEntryRemote(parent);
       }
     }
-
-    return result;
+    return false;
   }
 
 
@@ -1275,30 +1136,11 @@
     if ((displayFlags & DISPLAY_ACI_COUNT) != 0) {
       v.add("aci");
     }
-    if (!displayAttribute.equals(RDN_ATTRIBUTE)) {
+    if (!RDN_ATTRIBUTE.equals(displayAttribute)) {
       v.add(displayAttribute);
     }
 
-    String[] result = new String[v.size()];
-    v.toArray(result);
-    return result;
-  }
-
-
-  /**
-   * Returns the list of attributes for the green search.
-   * @return the list of attributes for the green search.
-   */
-  String[] getAttrsForGreenSearch() {
-    if (!displayAttribute.equals(RDN_ATTRIBUTE)) {
-      return new String[] {
-          "aci",
-          displayAttribute};
-    } else {
-      return new String[] {
-          "aci"
-      };
-    }
+    return v.toArray(new String[v.size()]);
   }
 
   /**
@@ -1306,7 +1148,7 @@
    * @return the list of attributes for the black search.
    */
   String[] getAttrsForBlackSearch() {
-    if (!displayAttribute.equals(RDN_ATTRIBUTE)) {
+    if (!RDN_ATTRIBUTE.equals(displayAttribute)) {
       return new String[] {
           "objectClass",
           "numsubordinates",
@@ -1339,7 +1181,7 @@
    * Returns the request controls to search user data.
    * @return the request controls to search user data.
    */
-  Control[] getRequestControls()
+  private Control[] getRequestControls()
   {
     Control ctls[];
     if (followReferrals)
@@ -1378,7 +1220,7 @@
    * Returns the request controls to search configuration data.
    * @return the request controls to search configuration data.
    */
-  Control[] getConfigurationRequestControls()
+  private Control[] getConfigurationRequestControls()
   {
     return getRequestControls();
   }
@@ -1430,8 +1272,8 @@
       // tree.
       // Except when it's due a to referral resolution: we keep the node
       // in order the user can fix the referral.
-      if (isNameNotFoundException(task.getException()) &&
-          (oldState != NodeRefresher.State.SOLVING_REFERRAL)) {
+      if (isNameNotFoundException(task.getException())
+          && oldState != NodeRefresher.State.SOLVING_REFERRAL) {
         removeOneNode(node);
       }
       else {
@@ -1460,8 +1302,8 @@
         nodeChanged = updateNodeRendering(node, task.getDisplayedEntry());
       }
     }
-    else if ((newState == NodeRefresher.State.CANCELLED) &&
-        (newState == NodeRefresher.State.INTERRUPTED)) {
+    else if (newState == NodeRefresher.State.CANCELLED
+        && newState == NodeRefresher.State.INTERRUPTED) {
 
       // Let's collapse task.getNode()
       tree.collapsePath(new TreePath(treeModel.getPathToRoot(node)));
@@ -1470,8 +1312,8 @@
     }
     else {
 
-      if ((oldState != NodeRefresher.State.SEARCHING_CHILDREN) &&
-          (newState == NodeRefresher.State.SEARCHING_CHILDREN)) {
+      if (oldState != NodeRefresher.State.SEARCHING_CHILDREN
+          && newState == NodeRefresher.State.SEARCHING_CHILDREN) {
         // The children search is going to start
         if (canDoDifferentialUpdate(task)) {
           Enumeration<?> e = node.children();
@@ -1538,11 +1380,9 @@
         }
       }
 
-      if (newState == NodeRefresher.State.FINISHED) {
-        if (node.getError() != null) {
-          node.setError(null);
-          nodeChanged = updateNodeRendering(node, task.getDisplayedEntry());
-        }
+      if (newState == NodeRefresher.State.FINISHED && node.getError() != null) {
+        node.setError(null);
+        nodeChanged = updateNodeRendering(node, task.getDisplayedEntry());
       }
     }
 
@@ -1551,10 +1391,9 @@
       treeModel.nodeChanged(task.getNode());
     }
 
-    if (node.isLeaf() && (node.getChildCount() >= 1)) {
+    if (node.isLeaf() && node.getChildCount() >= 1) {
       throw new RuntimeException("Inconsistent node: " + node.getDN());
     }
-
   }
 
 
@@ -1570,8 +1409,8 @@
       final NodeRefresher.State oldState,
       final NodeRefresher.State newState)
   throws InterruptedException {
-
     Runnable r = new Runnable() {
+      @Override
       public void run() {
         try {
           refreshTaskDidProgress(task, oldState, newState);
@@ -1635,13 +1474,13 @@
         child = new BasicNode(entry.getName());
         parent.insert(child, index);
         updateNodeRendering(child, entry);
-        insertIndex.add(new Integer(index));
+        insertIndex.add(Integer.valueOf(index));
 //      System.out.println("Inserted " + child.getDN() + " at " + index);
       }
       else { // Else we update the existing one
         child = (BasicNode)parent.getChildAt(index);
         if (updateNodeRendering(child, entry)) {
-          changedIndex.add(new Integer(index));
+          changedIndex.add(Integer.valueOf(index));
         }
         // The node is no longer obsolete
         child.setObsolete(false);
@@ -1649,24 +1488,13 @@
 
       // NUMSUBORDINATE HACK
       // Let's see if child has subordinates or not.
-      // Thanks to slapd, we cannot always trust the
-      // numSubOrdinates attribute. If the child entry's DN
-      // is found in the hacker's list, then we ignore
+      // Thanks to slapd, we cannot always trust the numSubOrdinates attribute.
+      // If the child entry's DN is found in the hacker's list, then we ignore
       // the numSubordinate attribute... :((
       boolean hasNoSubOrdinates;
       if (!child.hasSubOrdinates() && dontTrust) {
         LDAPURL childUrl = findUrlForDisplayedEntry(child);
-        if (numSubordinateHacker.contains(childUrl)) {
-          // The numSubOrdinates we have is unreliable.
-          // child may potentially have subordinates.
-          hasNoSubOrdinates = false;
-//        System.out.println("numSubordinates of " + childUrl +
-//        " is not reliable");
-        }
-        else {
-          // We can trust this 0 value
-          hasNoSubOrdinates = true;
-        }
+        hasNoSubOrdinates = !numSubordinateHacker.contains(childUrl);
       }
       else {
         hasNoSubOrdinates = !child.hasSubOrdinates();
@@ -1675,7 +1503,7 @@
 
 
       // Propagate the refresh
-      // Note: logically we should unconditionaly call:
+      // Note: logically we should unconditionally call:
       //  startRefreshNode(child, false, true);
       //
       // However doing that saturates refreshQueue
@@ -1691,9 +1519,9 @@
       // node had children (in the tree).  In this case
       // we force the refresh. See bug 5015115
       //
-      if (!hasNoSubOrdinates ||
-          (child.getReferral() != null) ||
-          (child.getChildCount() > 0)) {
+      if (!hasNoSubOrdinates
+          || child.getReferral() != null
+          || child.getChildCount() > 0) {
         startRefreshNode(child, entry, true);
       }
     }
@@ -1711,16 +1539,14 @@
 
 
   /**
-   * Tells wheter a differential update can be made in the provided task.
+   * Tells whether a differential update can be made in the provided task.
    * @param task the task.
    * @return <CODE>true</CODE> if a differential update can be made and
    * <CODE>false</CODE> otherwise.
    */
   private boolean canDoDifferentialUpdate(NodeRefresher task) {
-    return (
-        (task.getNode().getChildCount() >= 1) &&
-        (task.getNode().getNumSubOrdinates() <= 100)
-    );
+    return task.getNode().getChildCount() >= 1
+        && task.getNode().getNumSubOrdinates() <= 100;
   }
 
 
@@ -1736,82 +1562,25 @@
     if (entry != null) {
       // Get the numsubordinates
       node.setNumSubOrdinates(getNumSubOrdinates(entry));
-      if (node.getNumSubOrdinates() > 0)
-      {
-        node.setHasSubOrdinates(true);
-      }
-      else
-      {
-        // Calculate based also in the hasSubordinates attribute
-        node.setHasSubOrdinates(getHasSubOrdinates(entry));
-      }
+      node.setHasSubOrdinates(
+          node.getNumSubOrdinates() > 0 || getHasSubOrdinates(entry));
       node.setReferral(getReferral(entry));
       Set<String> ocValues = ConnectionUtils.getValues(entry, "objectClass");
       if (ocValues != null) {
-        String[] array = new String[ocValues.size()];
-        ocValues.toArray(array);
-        node.setObjectClassValues(array);
+        node.setObjectClassValues(ocValues.toArray(new String[ocValues.size()]));
       }
     }
-    // Get the aci count
-    int aciCount;
-
-    if (((displayFlags & DISPLAY_ACI_COUNT) != 0) && (entry != null)) {
-      Set<String> aciValues = ConnectionUtils.getValues(entry, "aci");
-      if (aciValues != null) {
-        aciCount = aciValues.size();
-      }
-      else {
-        aciCount = 0;
-      }
-    }
-    else {
-      aciCount = 0;
-    }
 
-    // Select the icon according the objectClass,...
-    int modifiers = 0;
-    if (node.isLeaf() && !node.hasSubOrdinates()) {
-      modifiers |= IconPool.MODIFIER_LEAF;
-    }
-    if (node.getReferral() != null) {
-      modifiers |= IconPool.MODIFIER_REFERRAL;
-    }
-    if (node.getError() != null) {
-      if (node.getError().getException() != null)
-      {
-        LOG.log(Level.SEVERE, "node has error: "+node.getError().getException(),
-            node.getError().getException());
-      }
-      modifiers |= IconPool.MODIFIER_ERROR;
-    }
-    SortedSet<String> objectClasses = new TreeSet<String>();
-    if (entry != null) {
-      Set<String> ocs = ConnectionUtils.getValues(entry, "objectClass");
-      if (ocs != null)
-      {
-        objectClasses.addAll(ocs);
-      }
-    }
-    Icon newIcon;
-    if (node instanceof SuffixNode)
-    {
-      newIcon = iconPool.getSuffixIcon();
-    }
-    else
-    {
-      newIcon = iconPool.getIcon(objectClasses, modifiers);
-    }
+    int aciCount = getAciCount(entry);
+    Icon newIcon = getNewIcon(node, entry);
 
     // Construct the icon text according the dn, the aci count...
     StringBuilder sb2 = new StringBuilder();
     if (aciCount >= 1) {
-      sb2.append(String.valueOf(aciCount));
-      if (aciCount == 1) {
-        sb2.append(" aci");
-      }
-      else {
-        sb2.append(" acis");
+      sb2.append(aciCount);
+      sb2.append(" aci");
+      if (aciCount != 1) {
+        sb2.append("s");
       }
     }
 
@@ -1822,8 +1591,7 @@
       }
     } else {
       boolean useRdn = true;
-      if (!displayAttribute.equals(RDN_ATTRIBUTE) &&
-          (entry != null)) {
+      if (!RDN_ATTRIBUTE.equals(displayAttribute) && entry != null) {
         String value = ConnectionUtils.getFirstValue(entry,displayAttribute);
         if (value != null) {
           if (showAttributeName) {
@@ -1833,9 +1601,10 @@
           useRdn = false;
         }
       }
+
       if (useRdn) {
         String rdn;
-        if (followReferrals && (node.getRemoteUrl() != null)) {
+        if (followReferrals && node.getRemoteUrl() != null) {
           if (showAttributeName) {
             rdn = node.getRemoteRDNWithAttributeName();
           } else {
@@ -1866,21 +1635,66 @@
     }
 
     // Determine if the rendering needs to be updated
-    boolean changed = (
-        (node.getIcon() != newIcon) ||
-        (node.getDisplayName() != newDisplayName) ||
-        (node.getFontStyle() != newStyle)
-    );
+    boolean changed =
+        node.getIcon() != newIcon
+        || node.getDisplayName() != newDisplayName
+        || node.getFontStyle() != newStyle;
     if (changed) {
       node.setIcon(newIcon);
       node.setDisplayName(newDisplayName);
       node.setFontStyle(newStyle);
     }
 
-
     return changed;
   }
 
+  private int getAciCount(SearchResult entry) throws NamingException
+  {
+    if ((displayFlags & DISPLAY_ACI_COUNT) != 0 && entry != null) {
+      Set<String> aciValues = ConnectionUtils.getValues(entry, "aci");
+      if (aciValues != null) {
+        return aciValues.size();
+      }
+    }
+    return 0;
+  }
+
+
+  private Icon getNewIcon(BasicNode node, SearchResult entry)
+      throws NamingException
+  {
+    // Select the icon according the objectClass,...
+    int modifiers = 0;
+    if (node.isLeaf() && !node.hasSubOrdinates()) {
+      modifiers |= IconPool.MODIFIER_LEAF;
+    }
+    if (node.getReferral() != null) {
+      modifiers |= IconPool.MODIFIER_REFERRAL;
+    }
+    if (node.getError() != null) {
+      final Exception ex = node.getError().getException();
+      if (ex != null)
+      {
+        LOG.log(Level.SEVERE, "node has error: " + ex, ex);
+      }
+      modifiers |= IconPool.MODIFIER_ERROR;
+    }
+
+    SortedSet<String> objectClasses = new TreeSet<String>();
+    if (entry != null) {
+      Set<String> ocs = ConnectionUtils.getValues(entry, "objectClass");
+      if (ocs != null)
+      {
+        objectClasses.addAll(ocs);
+      }
+    }
+
+    if (node instanceof SuffixNode)
+    {
+      return iconPool.getSuffixIcon();
+    }
+    return iconPool.getIcon(objectClasses, modifiers);
+  }
 
   /**
    * Find a child node matching a given DN.
@@ -1895,14 +1709,13 @@
   public int findChildNode(BasicNode parent, String childDn) {
     int childCount = parent.getChildCount();
     int i = 0;
-    while ((i < childCount) &&
-        !childDn.equals(((BasicNode)parent.getChildAt(i)).getDN())) {
+    while (i < childCount
+        && !childDn.equals(((BasicNode)parent.getChildAt(i)).getDN())) {
       i++;
     }
     if (i >= childCount) { // Not found
       i = -(childCount + 1);
     }
-
     return i;
   }
 
@@ -1936,10 +1749,10 @@
       newSize = newSize - 1;
     }
     if (newSize != queueTotalSize) {
-      if ((queueTotalSize == 0) && (newSize >= 1)) {
+      if (queueTotalSize == 0 && newSize >= 1) {
         fireEvent(BrowserEvent.Type.UPDATE_START);
       }
-      else if ((queueTotalSize >= 1) && (newSize == 0)) {
+      else if (queueTotalSize >= 1 && newSize == 0) {
         fireEvent(BrowserEvent.Type.UPDATE_END);
       }
       queueTotalSize = newSize;
@@ -1985,46 +1798,44 @@
    * @throws IllegalArgumentException if a node with the given dn exists but
    * is not a suffix node.
    */
-  SuffixNode findSuffixNode(String suffixDn, SuffixNode suffixNode)
-  throws IllegalArgumentException
+  private SuffixNode findSuffixNode(String suffixDn, SuffixNode suffixNode)
+      throws IllegalArgumentException
   {
-    SuffixNode result;
-
     if (Utilities.areDnsEqual(suffixNode.getDN(), suffixDn)) {
-      result = suffixNode;
-    }
-    else {
-      int childCount = suffixNode.getChildCount();
-      if (childCount == 0) {
-        result = null;
-      }
-      else {
-        BasicNode child;
-        int i = 0;
-        boolean found = false;
-        do {
-          child = (BasicNode)suffixNode.getChildAt(i) ;
-          if (Utilities.areDnsEqual(child.getDN(), suffixDn)) {
-            found = true;
-          }
-          i++;
-        }
-        while ((i < childCount) && !found);
-        if (!found) {
-          result = null;
-        }
-        else if (child instanceof SuffixNode) {
-          result = (SuffixNode)child;
-        }
-        else {
-          // A node matches suffixDn however it's not a suffix node.
-          // There's a bug in the caller.
-          throw new IllegalArgumentException(suffixDn +" is not a suffix node");
-        }
-      }
+      return suffixNode;
     }
 
-    return result;
+    int childCount = suffixNode.getChildCount();
+    if (childCount == 0)
+    {
+      return null;
+    }
+    BasicNode child;
+    int i = 0;
+    boolean found = false;
+    do
+    {
+      child = (BasicNode) suffixNode.getChildAt(i);
+      if (Utilities.areDnsEqual(child.getDN(), suffixDn))
+      {
+        found = true;
+      }
+      i++;
+    }
+    while (i < childCount && !found);
+
+    if (!found)
+    {
+      return null;
+    }
+    if (child instanceof SuffixNode)
+    {
+      return (SuffixNode) child;
+    }
+
+    // A node matches suffixDn however it's not a suffix node.
+    // There's a bug in the caller.
+    throw new IllegalArgumentException(suffixDn + " is not a suffix node");
   }
 
 
@@ -2036,15 +1847,7 @@
    * NameNotFoundException.
    */
   private boolean isNameNotFoundException(Object x) {
-    boolean result;
-    if ((x != null) && (x instanceof NameNotFoundException))
-    {
-      result = true;
-    }
-    else {
-      result = false;
-    }
-    return result;
+    return x instanceof NameNotFoundException;
   }
 
 
@@ -2054,28 +1857,12 @@
    * If numsubordinates is not present, returns 0.
    * @param entry the entry to analyze.
    * @throws NamingException if an error occurs.
-   * @return the value of the numsubordinate attribute.  0 if the attribute
+   * @return the value of the numsubordinates attribute.  0 if the attribute
    * could not be found.
    */
-  public static int getNumSubOrdinates(SearchResult entry)
-  throws NamingException
+  private static int getNumSubOrdinates(SearchResult entry) throws NamingException
   {
-    int result;
-
-    String v = ConnectionUtils.getFirstValue(entry, "numsubordinates");
-    if (v == null) {
-      result = 0;
-    }
-    else {
-      try {
-        result = Integer.parseInt(v);
-      }
-      catch(NumberFormatException x) {
-        result = 0;
-      }
-    }
-
-    return result;
+    return toInt(ConnectionUtils.getFirstValue(entry, "numsubordinates"));
   }
 
   /**
@@ -2090,49 +1877,46 @@
   public static boolean getHasSubOrdinates(SearchResult entry)
   throws NamingException
   {
-    boolean result;
-
     String v = ConnectionUtils.getFirstValue(entry, "hassubordinates");
-    if (v == null) {
-      result = getNumSubOrdinates(entry) > 0;
+    if (v != null) {
+      return "true".equalsIgnoreCase(v);
     }
-    else {
-      result = "true".equalsIgnoreCase(v);
-    }
-
-    return result;
+    return getNumSubOrdinates(entry) > 0;
   }
 
   /**
    * Get the value of the numsubordinates attribute.
    * If numsubordinates is not present, returns 0.
    * @param entry the entry to analyze.
-   * @return the value of the numsubordinate attribute.  0 if the attribute
+   * @return the value of the numsubordinates attribute.  0 if the attribute
    * could not be found.
    */
-  public static int getNumSubOrdinates(CustomSearchResult entry)
+  private static int getNumSubOrdinates(CustomSearchResult entry)
   {
-    int result;
-
     List<Object> vs = entry.getAttributeValues("numsubordinates");
     String v = null;
     if (vs != null && !vs.isEmpty())
     {
       v = vs.get(0).toString();
     }
-    if (v == null) {
-      result = 0;
-    }
-    else {
-      try {
-        result = Integer.parseInt(v);
-      }
-      catch(NumberFormatException x) {
-        result = 0;
-      }
-    }
+    return toInt(v);
+  }
 
-    return result;
+
+  private static int toInt(String v)
+  {
+    if (v == null)
+    {
+      return 0;
+    }
+    try
+    {
+      return Integer.parseInt(v);
+    }
+    catch (NumberFormatException x)
+    {
+      return 0;
+    }
   }
 
   /**
@@ -2145,22 +1929,17 @@
    */
   public static boolean getHasSubOrdinates(CustomSearchResult entry)
   {
-    boolean result;
-
     List<Object> vs = entry.getAttributeValues("hassubordinates");
     String v = null;
     if (vs != null && !vs.isEmpty())
     {
       v = vs.get(0).toString();
     }
-    if (v == null) {
-      result = getNumSubOrdinates(entry) > 0;
+    if (v != null)
+    {
+      return "true".equalsIgnoreCase(v);
     }
-    else {
-      result = "true".equalsIgnoreCase(v);
-    }
-
-    return result;
+    return getNumSubOrdinates(entry) > 0;
   }
 
 
@@ -2180,7 +1959,7 @@
     {
       for (String value : values)
       {
-        boolean isReferral = value.equalsIgnoreCase("referral");
+        boolean isReferral = "referral".equalsIgnoreCase(value);
         if (isReferral)
         {
           Set<String> refValues = ConnectionUtils.getValues(entry, "ref");
@@ -2231,7 +2010,7 @@
    * @param v the Collection of Integer objects.
    * @return an array of int from a Collection of Integer objects.
    */
-  static int[] intArrayFromCollection(Collection<Integer> v) {
+  private static int[] intArrayFromCollection(Collection<Integer> v) {
     int[] result = new int[v.size()];
     int i = 0;
     for (Integer value : v)
@@ -2242,29 +2021,6 @@
     return result;
   }
 
-  /**
-   * Returns an array of SearchResult from a Collection of SearchResult objects.
-   * @param v the Collection of SearchResult objects.
-   * @return an array of SearchResult from a Collection of SearchResult objects.
-   */
-  static SearchResult[] entryArrayFromCollection(Collection<SearchResult> v) {
-    SearchResult[] result = new SearchResult[v.size()];
-    v.toArray(result);
-    return result;
-  }
-
-  /**
-   * Returns an array of BasicNode from a Collection of BasicNode objects.
-   * @param v the Collection of BasicNode objects.
-   * @return an array of BasicNode from a Collection of BasicNode objects.
-   */
-  static BasicNode[] nodeArrayFromCollection(Collection<BasicNode> v) {
-    BasicNode[] result = new BasicNode[v.size()];
-    v.toArray(result);
-    return result;
-  }
-
-
 
   /**
    * For debugging purpose: allows to switch easily
@@ -2273,8 +2029,7 @@
    * @param r the runnable to be invoked.
    * @throws InterruptedException if there is an error invoking SwingUtilities.
    */
-  static void swingInvoke(Runnable r)
-  throws InterruptedException {
+  private static void swingInvoke(Runnable r) throws InterruptedException {
     try {
       SwingUtilities.invokeAndWait(r);
     }
@@ -2289,23 +2044,23 @@
 
 
   /**
-   * The default implementaion of the BrowserNodeInfo interface.
+   * The default implementation of the BrowserNodeInfo interface.
    */
-  class BrowserNodeInfoImpl implements BrowserNodeInfo
+  private class BrowserNodeInfoImpl implements BrowserNodeInfo
   {
-    BasicNode node;
-    LDAPURL url;
-    boolean isRemote;
-    boolean isSuffix;
-    boolean isRootNode;
-    String[] referral;
-    int numSubOrdinates;
-    boolean hasSubOrdinates;
-    int errorType;
-    Exception errorException;
-    Object errorArg;
-    String[] objectClassValues;
-    String toString;
+    private BasicNode node;
+    private LDAPURL url;
+    private boolean isRemote;
+    private boolean isSuffix;
+    private boolean isRootNode;
+    private String[] referral;
+    private int numSubOrdinates;
+    private boolean hasSubOrdinates;
+    private int errorType;
+    private Exception errorException;
+    private Object errorArg;
+    private String[] objectClassValues;
+    private String toString;
 
     /**
      * The constructor of this object.
@@ -2353,6 +2108,7 @@
      * Returns the node associated with this object.
      * @return  the node associated with this object.
      */
+    @Override
     public BasicNode getNode() {
       return node;
     }
@@ -2361,6 +2117,7 @@
      * Returns the LDAP URL associated with this object.
      * @return the LDAP URL associated with this object.
      */
+    @Override
     public LDAPURL getURL() {
       return url;
     }
@@ -2370,6 +2127,7 @@
      * @return <CODE>true</CODE> if this is a root node and <CODE>false</CODE>
      * otherwise.
      */
+    @Override
     public boolean isRootNode() {
       return isRootNode;
     }
@@ -2379,6 +2137,7 @@
      * @return <CODE>true</CODE> if this is a suffix node and <CODE>false</CODE>
      * otherwise.
      */
+    @Override
     public boolean isSuffix() {
       return isSuffix;
     }
@@ -2388,6 +2147,7 @@
      * @return <CODE>true</CODE> if this is a remote node and <CODE>false</CODE>
      * otherwise.
      */
+    @Override
     public boolean isRemote() {
       return isRemote;
     }
@@ -2396,6 +2156,7 @@
      * Returns the list of referral associated with this node.
      * @return the list of referral associated with this node.
      */
+    @Override
     public String[] getReferral() {
       return referral;
     }
@@ -2406,6 +2167,7 @@
      * @return the number of subordinates of the entry associated with this
      * node.
      */
+    @Override
     public int getNumSubOrdinates() {
       return numSubOrdinates;
     }
@@ -2415,6 +2177,7 @@
      * @return {@code true} if the entry has subordinates and {@code false}
      * otherwise.
      */
+    @Override
     public boolean hasSubOrdinates() {
       return hasSubOrdinates;
     }
@@ -2425,6 +2188,7 @@
      * @return the error type associated we got when refreshing the node.
      * <CODE>null</CODE> if no error was found.
      */
+    @Override
     public int getErrorType() {
       return errorType;
     }
@@ -2435,6 +2199,7 @@
      * @return the exception associated we got when refreshing the node.
      * <CODE>null</CODE> if no exception was found.
      */
+    @Override
     public Exception getErrorException() {
       return errorException;
     }
@@ -2445,6 +2210,7 @@
      * @return the error argument associated we got when refreshing the node.
      * <CODE>null</CODE> if no error argument was found.
      */
+    @Override
     public Object getErrorArg() {
       return errorArg;
     }
@@ -2453,6 +2219,7 @@
      * Return the tree path associated with the node in the tree.
      * @return the tree path associated with the node in the tree.
      */
+    @Override
     public TreePath getTreePath() {
       return new TreePath(treeModel.getPathToRoot(node));
     }
@@ -2461,6 +2228,7 @@
      * Returns the object class values of the entry associated with the node.
      * @return the object class values of the entry associated with the node.
      */
+    @Override
     public String[] getObjectClassValues() {
       return objectClassValues;
     }
@@ -2469,6 +2237,7 @@
      * Returns a String representation of the object.
      * @return a String representation of the object.
      */
+    @Override
     public String toString() {
       return toString;
     }
@@ -2479,12 +2248,12 @@
      * @return <CODE>true</CODE> if the node info represents the same node as
      * this and <CODE>false</CODE> otherwise.
      */
+    @Override
     public boolean representsSameNode(BrowserNodeInfo node) {
-      boolean representsSameNode = false;
       if (node != null) {
-        representsSameNode = node.getNode() == node;
+        return node.getNode() == node;
       }
-      return representsSameNode;
+      return false;
     }
   }
 
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
index b970208..cbfbfb0 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
@@ -22,20 +22,10 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2013 ForgeRock AS.
+ *      Portions Copyright 2013-2014 ForgeRock AS.
  */
-
 package org.opends.guitools.controlpanel.browser;
 
-import static org.opends.messages.AdminToolMessages.*;
-
-import java.awt.Canvas;
-import java.awt.Image;
-import java.awt.MediaTracker;
-import java.awt.image.ColorModel;
-import java.awt.image.ImageObserver;
-import java.awt.image.MemoryImageSource;
-import java.awt.image.PixelGrabber;
 import java.util.HashMap;
 import java.util.Set;
 import java.util.SortedSet;
@@ -46,6 +36,8 @@
 import org.opends.quicksetup.ui.UIFactory;
 import org.opends.server.util.ServerConstants;
 
+import static org.opends.messages.AdminToolMessages.*;
+
 /**
  * This class is used as a cache containing the icons that are used by the
  * BrowserController to update the nodes.  It keeps some icons associated with
@@ -66,10 +58,11 @@
    */
   public static final int MODIFIER_ERROR    = 0x04;
 
-  private HashMap<String, ImageIcon> iconTable =
+  private final HashMap<String, ImageIcon> iconTable =
     new HashMap<String, ImageIcon>();
-  private HashMap<String, String> pathTable = new HashMap<String, String>();
-  private HashMap<String, String> descriptionTable =
+  private final HashMap<String, String> pathTable =
+      new HashMap<String, String>();
+  private final HashMap<String, String> descriptionTable =
     new HashMap<String, String>();
   private ImageIcon defaultLeafIcon;
   private ImageIcon suffixIcon;
@@ -117,12 +110,9 @@
     "passwordpolicy", INFO_PASSWORD_POLICY_ICON_DESCRIPTION.get().toString()
   };
 
-  private String GENERIC_OBJECT_DESCRIPTION = "Generic entry";
+  private final String GENERIC_OBJECT_DESCRIPTION = "Generic entry";
 
-  /**
-   * The default constructor.
-   *
-   */
+  /** The default constructor. */
   public IconPool() {
     // Recopy ICON_PATH in pathTable for fast access
     for (int i = 0; i < ICON_PATH.length; i = i+2) {
@@ -144,15 +134,12 @@
    * modifiers.
    */
   public ImageIcon getIcon(SortedSet<String> objectClasses, int modifiers) {
-    ImageIcon result;
-
     String key = makeKey(objectClasses, modifiers);
-    result = iconTable.get(key);
+    ImageIcon result = iconTable.get(key);
     if (result == null) {
       result = makeIcon(objectClasses, modifiers);
       iconTable.put(key, result);
     }
-
     return result;
   }
 
@@ -270,7 +257,7 @@
     ImageIcon result;
 
     // Find the icon associated to the object class
-    if ((objectClasses == null) || (objectClasses.size() == 0)) {
+    if (objectClasses == null || objectClasses.size() == 0) {
       result = getDefaultContainerIcon();
     }
     else {
@@ -328,87 +315,8 @@
     if(ocValues != null) {
       result.append(Utilities.getStringFromCollection(ocValues, ""));
     }
-    result.append(String.valueOf(modifiers));
+    result.append(modifiers);
     return result.toString();
   }
 
-
-
-    /**
-     * Returns a RemoteImage corresponding to the superposition of the icon
-     * Image and the mask Image.
-     *
-     * @param icon the RemoteImage that we want to bar.
-     * @param mask the ImageIcond to be used as mask.
-     * @return a RemoteImage corresponding to the superposition of the icon
-     * Image and the mask Image.
-     */
-  public static ImageIcon maskedIcon(ImageIcon icon, ImageIcon mask) {
-    ImageIcon fReturn;
-    int TRANSPARENT = 16711165;  // The value of a transparent pixel
-
-    int h = icon.getIconHeight();
-    int w = icon.getIconWidth();
-
-    if (mask.getImageLoadStatus() != MediaTracker.COMPLETE) {
-      return null;
-    }
-    Image maskImage = mask.getImage();
-
-    Image scaledMaskImage = maskImage.getScaledInstance(w, h ,
-        Image.SCALE_SMOOTH);
-
-    ImageIcon scaledMask = new ImageIcon(scaledMaskImage);
-    if (scaledMask.getImageLoadStatus() != MediaTracker.COMPLETE) {
-      return null;
-    }
-
-    int[] iconPixels = new int[w * h];
-    try {
-      PixelGrabber pg =
-        new PixelGrabber(icon.getImage(), 0, 0, w, h, iconPixels, 0, w);
-      pg.grabPixels();
-
-      if ((pg.status() & ImageObserver.ABORT) !=0) {
-        return null;
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return null;
-    }
-    int[] filterPixels = new int[w * h];
-    try {
-      PixelGrabber pgf =
-        new PixelGrabber(scaledMask.getImage(), 0, 0, w, h, filterPixels, 0, w);
-      pgf.grabPixels();
-
-      if ((pgf.status() & ImageObserver.ABORT) !=0) {
-        fReturn = null;
-        return fReturn;
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      fReturn = null;
-      return fReturn;
-    }
-
-
-    int[] newPixels = new int[w * h];
-
-    for( int i = 0; i < h; i++)
-      for (int j = 0; j < w; j++)
-        if (filterPixels[j + i*w] != TRANSPARENT) {
-          newPixels[j + i*w] = filterPixels[j + i*w];
-        } else {
-          newPixels[j + i*w] = iconPixels[j + i*w];
-        }
-    Canvas component = new Canvas();
-
-    Image newImage = component.getToolkit().createImage(
-        new MemoryImageSource(
-            w, h, ColorModel.getRGBdefault(), newPixels, 0, w));
-    fReturn = new ImageIcon(newImage, icon.getDescription());
-
-    return fReturn;
-  }
 }
diff --git a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/LDAPConnectionPool.java b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/LDAPConnectionPool.java
index 6ed2cc3..89d2275 100644
--- a/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/LDAPConnectionPool.java
+++ b/opendj-sdk/opends/src/guitools/org/opends/guitools/controlpanel/browser/LDAPConnectionPool.java
@@ -22,12 +22,11 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
+ *      Portions Copyright 2014 ForgeRock AS
  */
-
 package org.opends.guitools.controlpanel.browser;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 
 import javax.naming.NamingException;
@@ -42,6 +41,8 @@
 import org.opends.server.types.LDAPURL;
 import org.opends.server.types.SearchScope;
 
+import static org.opends.admin.ads.util.ConnectionUtils.*;
+
 /**
  * An LDAPConnectionPool is a pool of LDAPConnection.
  * <BR><BR>
@@ -71,11 +72,12 @@
  */
 public class LDAPConnectionPool {
 
-  HashMap<String, AuthRecord> authTable = new HashMap<String, AuthRecord>();
-  HashMap<String, ConnectionRecord> connectionTable =
+  private final HashMap<String, AuthRecord> authTable =
+      new HashMap<String, AuthRecord>();
+  private final HashMap<String, ConnectionRecord> connectionTable =
     new HashMap<String, ConnectionRecord>();
 
-  ArrayList<ReferralAuthenticationListener> listeners;
+  private ArrayList<ReferralAuthenticationListener> listeners;
 
   private Control[] requestControls = new Control[] {};
   private ApplicationTrustManager trustManager;
@@ -89,28 +91,20 @@
    * connection pool, <CODE>false</CODE> otherwise.
    */
   public boolean isConnectionRegistered(InitialLdapContext ctx) {
-    boolean isConnectionRegistered = false;
     for (String key : connectionTable.keySet())
     {
       ConnectionRecord cr = connectionTable.get(key);
-      if (cr.ctx != null) {
-        isConnectionRegistered =
-         ConnectionUtils.getHostName(cr.ctx).equals(
-             ConnectionUtils.getHostName(ctx)) &&
-        (ConnectionUtils.getPort(cr.ctx) == ConnectionUtils.getPort(ctx)) &&
-        ConnectionUtils.getBindDN(cr.ctx).equals(
-            ConnectionUtils.getBindDN(ctx)) &&
-        ConnectionUtils.getBindPassword(cr.ctx).equals(
-            ConnectionUtils.getBindPassword(ctx)) &&
-        (ConnectionUtils.isSSL(cr.ctx) == ConnectionUtils.isSSL(ctx)) &&
-        (ConnectionUtils.isStartTLS(cr.ctx) == ConnectionUtils.isStartTLS(ctx));
-      }
-      if (isConnectionRegistered)
-      {
-        break;
+      if (cr.ctx != null
+          && getHostName(cr.ctx).equals(getHostName(ctx))
+          && getPort(cr.ctx) == getPort(ctx)
+          && getBindDN(cr.ctx).equals(getBindDN(ctx))
+          && getBindPassword(cr.ctx).equals(getBindPassword(ctx))
+          && isSSL(cr.ctx) == isSSL(ctx)
+          && isStartTLS(cr.ctx) == isStartTLS(ctx)) {
+        return true;
       }
     }
-    return isConnectionRegistered;
+    return false;
   }
 
   /**
@@ -119,12 +113,7 @@
    */
   public void registerConnection(InitialLdapContext ctx) {
     registerAuth(ctx);
-    LDAPURL url = makeLDAPUrl(
-                  ConnectionUtils.getHostName(ctx),
-                  ConnectionUtils.getPort(ctx),
-                  "",
-                  ConnectionUtils.isSSL(ctx)
-                  );
+    LDAPURL url = makeLDAPUrl(ctx);
     String key = makeKeyFromLDAPUrl(url);
     ConnectionRecord cr = new ConnectionRecord();
     cr.ctx = ctx;
@@ -141,11 +130,7 @@
   public void unregisterConnection(InitialLdapContext ctx)
   throws NamingException
   {
-    LDAPURL url = makeLDAPUrl(
-        ConnectionUtils.getHostName(ctx),
-        ConnectionUtils.getPort(ctx),
-        "",
-        ConnectionUtils.isSSL(ctx));
+    LDAPURL url = makeLDAPUrl(ctx);
     unRegisterAuth(url);
     String key = makeKeyFromLDAPUrl(url);
     connectionTable.remove(key);
@@ -164,17 +149,6 @@
   }
 
   /**
-   * Removes a referral authentication listener.
-   * @param listener the referral authentication listener.
-   */
-  public void removeReferralAuthenticationListener(
-      ReferralAuthenticationListener listener) {
-    if (listeners != null) {
-      listeners.remove(listener);
-    }
-  }
-
-  /**
    * Returns an LDAPConnection for accessing the specified url.
    * If no connection are available for the protocol/host/port
    * of the URL, getConnection() makes a new one and call connect().
@@ -287,35 +261,17 @@
     if (targetRecord == null) { // ldc is not in _connectionTable -> bug
       throw new IllegalArgumentException("Invalid LDAP connection");
     }
-    else {
-      synchronized(targetRecord) {
-        targetRecord.counter--;
-        if ((targetRecord.counter == 0) && targetRecord.disconnectAfterUse) {
-          disconnectAndRemove(targetRecord);
-        }
-      }
-    }
-  }
 
-
-  /**
-   * Disconnect the connections which are not being used.
-   * Connections being used will be disconnected as soon
-   * as they are released.
-   */
-  public synchronized void flush() {
-    for (ConnectionRecord cr : connectionTable.values())
+    synchronized (targetRecord)
     {
-      if (cr.counter <= 0) {
-        disconnectAndRemove(cr);
-      }
-      else {
-        cr.disconnectAfterUse = true;
+      targetRecord.counter--;
+      if (targetRecord.counter == 0 && targetRecord.disconnectAfterUse)
+      {
+        disconnectAndRemove(targetRecord);
       }
     }
   }
 
-
   /**
    * Register authentication data.
    * If authentication data are already available for the protocol/host/port
@@ -331,14 +287,11 @@
    * provided authentication (for testing purposes).
    * @throws NamingException if an error occurs connecting.
    */
-  public void registerAuth(LDAPURL ldapUrl, String dn, String pw,
-      boolean connect)
-  throws NamingException {
+  private void registerAuth(LDAPURL ldapUrl, String dn, String pw,
+      boolean connect) throws NamingException {
 
     String key = makeKeyFromLDAPUrl(ldapUrl);
-    AuthRecord ar;
-    ar = new AuthRecord();
-    ar.ldapUrl  = ldapUrl;
+    final AuthRecord ar = new AuthRecord();
     ar.dn       = dn;
     ar.password = pw;
 
@@ -371,15 +324,10 @@
    * @param ctx the connection that we retrieve the authentication information
    * from.
    */
-  public void registerAuth(InitialLdapContext ctx) {
-    LDAPURL url = makeLDAPUrl(
-      ConnectionUtils.getHostName(ctx),
-      ConnectionUtils.getPort(ctx),
-      "",
-      ConnectionUtils.isSSL(ctx));
+  private void registerAuth(InitialLdapContext ctx) {
+    LDAPURL url = makeLDAPUrl(ctx);
     try {
-      registerAuth(url, ConnectionUtils.getBindDN(ctx),
-          ConnectionUtils.getBindPassword(ctx), false);
+      registerAuth(url, getBindDN(ctx), getBindPassword(ctx), false);
     }
     catch (NamingException x) {
       throw new RuntimeException("Bug");
@@ -395,7 +343,7 @@
    * unregistered.
    * @throws NamingException if the unbind fails.
    */
-  public void unRegisterAuth(LDAPURL ldapUrl) throws NamingException {
+  private void unRegisterAuth(LDAPURL ldapUrl) throws NamingException {
     String key = makeKeyFromLDAPUrl(ldapUrl);
 
     authTable.remove(key);
@@ -403,45 +351,6 @@
   }
 
   /**
-   * Get authentication DN registered for this url.
-   * @param ldapUrl the LDAP URL for which we want to get authentication DN.
-   * @return the bind DN of the authentication.
-   */
-  public synchronized String getAuthDN(LDAPURL ldapUrl) {
-    String result;
-    String key = makeKeyFromLDAPUrl(ldapUrl);
-    AuthRecord ar = authTable.get(key);
-    if (ar == null) {
-      result = null;
-    }
-    else {
-      result = ar.dn;
-    }
-    return result;
-  }
-
-
-  /**
-   * Get authentication password registered for this url.
-   * @param ldapUrl the LDAP URL for which we want to get authentication
-   * password.
-   * @return the password of the authentication.
-   */
-  public synchronized String getAuthPassword(LDAPURL ldapUrl) {
-    String result;
-    String key = makeKeyFromLDAPUrl(ldapUrl);
-    AuthRecord ar = authTable.get(key);
-    if (ar == null) {
-      result = null;
-    }
-    else {
-      result = ar.password;
-    }
-    return result;
-  }
-
-
-  /**
    * Disconnect the connection associated to a record
    * and remove the record from connectionTable.
    * @param cr the ConnectionRecord to remove.
@@ -490,8 +399,7 @@
    */
   private static String makeKeyFromRecord(ConnectionRecord rec) {
     String protocol = ConnectionUtils.isSSL(rec.ctx) ? "LDAPS" : "LDAP";
-    return protocol + ":" + ConnectionUtils.getHostName(rec.ctx) + ":" +
-    ConnectionUtils.getPort(rec.ctx);
+    return protocol + ":" + getHostName(rec.ctx) + ":" + getPort(rec.ctx);
   }
 
   /**
@@ -505,24 +413,18 @@
   private InitialLdapContext createLDAPConnection(LDAPURL ldapUrl,
       AuthRecord ar) throws NamingException
   {
-    InitialLdapContext ctx;
-
     // Take the base DN out of the URL and only keep the protocol, host and port
     ldapUrl = new LDAPURL(ldapUrl.getScheme(), ldapUrl.getHost(),
           ldapUrl.getPort(), (DN)null, null, null, null, null);
 
     if (isSecureLDAPUrl(ldapUrl))
     {
-      ctx = ConnectionUtils.createLdapsContext(ldapUrl.toString(), ar.dn,
+      return ConnectionUtils.createLdapsContext(ldapUrl.toString(), ar.dn,
           ar.password, getConnectTimeout(), null,
-          getTrustManager() , getKeyManager());
+          getTrustManager(), getKeyManager());
     }
-    else
-    {
-      ctx = ConnectionUtils.createLdapContext(ldapUrl.toString(), ar.dn,
-          ar.password, getConnectTimeout(), null);
-    }
-    return ctx;
+    return ConnectionUtils.createLdapContext(ldapUrl.toString(), ar.dn,
+        ar.password, getConnectTimeout(), null);
   }
 
   /**
@@ -579,26 +481,16 @@
    * @return <CODE>true</CODE> if the LDAP URL is secure and <CODE>false</CODE>
    * otherwise.
    */
-  public static boolean isSecureLDAPUrl(LDAPURL url) {
+  private static boolean isSecureLDAPUrl(LDAPURL url) {
     return !LDAPURL.DEFAULT_SCHEME.equalsIgnoreCase(url.getScheme());
   }
 
-
-  /**
-   * Make an url from the specified arguments.
-   * @param host the host.
-   * @param port the port.
-   * @param dn the dn.
-   * @param secure whether it is a secure URL or not.
-   * @return an LDAP URL from the specified arguments.
-   */
-  public static LDAPURL makeLDAPUrl(String host, int port, String dn,
-      boolean secure) {
+  private LDAPURL makeLDAPUrl(InitialLdapContext ctx) {
     return new LDAPURL(
-        secure ? "ldaps" : LDAPURL.DEFAULT_SCHEME,
-            host,
-            port,
-            dn,
+        isSSL(ctx) ? "ldaps" : LDAPURL.DEFAULT_SCHEME,
+            getHostName(ctx),
+            getPort(ctx),
+            "",
             null, // no attributes
             SearchScope.BASE_OBJECT,
             null, // No filter
@@ -643,20 +535,12 @@
         null); // No extensions
   }
 
-  /**
-   * Returns a collection of AuthRecord.
-   * @return a collection of AuthRecord.
-   */
-  Collection<?> getRegisteredAuthentication() {
-    return authTable.values();
-  }
 }
 
 /**
  * A structure representing authentication data.
  */
 class AuthRecord {
-  LDAPURL ldapUrl;
   String dn;
   String password;
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java b/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java
index 8e35331..be0d9a6 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java
@@ -27,7 +27,7 @@
 package org.opends.server.replication.plugin;
 
 import java.util.ArrayList;
-import java.util.LinkedHashSet;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -51,7 +51,7 @@
  */
 class PersistentServerState
 {
-   private final DN baseDn;
+   private final DN baseDN;
    private final int serverId;
    private final ServerState state;
 
@@ -64,13 +64,13 @@
    * Create a new PersistentServerState based on an already existing
    * ServerState.
    *
-   * @param baseDn    The baseDN for which the ServerState is created.
+   * @param baseDN    The baseDN for which the ServerState is created.
    * @param serverId  The serverId.
    * @param state     The serverState.
    */
-  PersistentServerState(DN baseDn, int serverId, ServerState state)
+  PersistentServerState(DN baseDN, int serverId, ServerState state)
   {
-    this.baseDn = baseDn;
+    this.baseDN = baseDN;
     this.serverId = serverId;
     this.state = state;
     loadState();
@@ -108,7 +108,7 @@
   {
     if (!state.isSaved())
     {
-      state.setSaved(updateStateEntry() == ResultCode.SUCCESS);
+      state.setSaved(updateStateEntry());
     }
   }
 
@@ -158,18 +158,16 @@
        * Search the database entry that is used to periodically
        * save the ServerState
        */
-      LinkedHashSet<String> attributes = new LinkedHashSet<String>(1);
-      attributes.add(REPLICATION_STATE);
       final InternalSearchOperation search = getRootConnection().processSearch(
-          baseDn,
-          SearchScope.BASE_OBJECT, DereferencePolicy.NEVER_DEREF_ALIASES,
-          0, 0, false, filter, attributes);
-      if (((search.getResultCode() != ResultCode.SUCCESS)) &&
-          ((search.getResultCode() != ResultCode.NO_SUCH_OBJECT)))
+          baseDN, SearchScope.BASE_OBJECT, DereferencePolicy.NEVER_DEREF_ALIASES,
+          0, 0, false, filter, Collections.singleton(REPLICATION_STATE));
+      final ResultCode resultCode = search.getResultCode();
+      if (resultCode != ResultCode.SUCCESS
+          && resultCode != ResultCode.NO_SUCH_OBJECT)
       {
         logError(ERR_ERROR_SEARCHING_RUV.get(
-            search.getResultCode().getResultCodeName(), search.toString(),
-            search.getErrorMessage(), baseDn.toString()));
+            resultCode.getResultCodeName(), search.toString(),
+            search.getErrorMessage(), baseDN.toString()));
         return null;
       }
       return getFirstResult(search);
@@ -193,15 +191,13 @@
     {
       SearchFilter filter = SearchFilter.createFilterFromString(
           "(&(objectclass=ds-cfg-replication-domain)"
-          + "(ds-cfg-base-dn=" + baseDn + "))");
+          + "(ds-cfg-base-dn=" + baseDN + "))");
 
-      LinkedHashSet<String> attributes = new LinkedHashSet<String>(1);
-      attributes.add(REPLICATION_STATE);
       final InternalSearchOperation op = getRootConnection().processSearch(
           DN.decode("cn=config"),
           SearchScope.SUBORDINATE_SUBTREE,
           DereferencePolicy.NEVER_DEREF_ALIASES,
-          1, 0, false, filter, attributes);
+          1, 0, false, filter, Collections.singleton(REPLICATION_STATE));
       return getFirstResult(op);
     }
     catch (DirectoryException e)
@@ -234,12 +230,10 @@
   {
     AttributeType synchronizationStateType =
       DirectoryServer.getAttributeType(REPLICATION_STATE);
-    List<Attribute> attrs =
-      resultEntry.getAttribute(synchronizationStateType);
+    List<Attribute> attrs = resultEntry.getAttribute(synchronizationStateType);
     if (attrs != null)
     {
-      Attribute attr = attrs.get(0);
-      for (AttributeValue value : attr)
+      for (AttributeValue value : attrs.get(0))
       {
         update(new CSN(value.toString()));
       }
@@ -250,12 +244,12 @@
    * Save the current values of this PersistentState object
    * in the appropriate entry of the database.
    *
-   * @return a ResultCode indicating if the method was successful.
+   * @return a boolean indicating if the method was successful.
    */
-  private ResultCode updateStateEntry()
+  private boolean updateStateEntry()
   {
     // Generate a modify operation on the Server State baseDN Entry.
-    ResultCode result = runUpdateStateEntry(baseDn);
+    ResultCode result = runUpdateStateEntry(baseDN);
     if (result == ResultCode.NO_SUCH_OBJECT)
     {
       // The base entry does not exist yet in the database or has been deleted,
@@ -263,11 +257,10 @@
       SearchResultEntry configEntry = searchConfigEntry();
       if (configEntry != null)
       {
-        DN configDN = configEntry.getDN();
-        result = runUpdateStateEntry(configDN);
+        result = runUpdateStateEntry(configEntry.getDN());
       }
     }
-    return result;
+    return result == ResultCode.SUCCESS;
   }
 
   /**
@@ -283,14 +276,12 @@
     ArrayList<ByteString> values = state.toASN1ArrayList();
 
     LDAPAttribute attr = new LDAPAttribute(REPLICATION_STATE, values);
-    LDAPModification mod = new LDAPModification(ModificationType.REPLACE, attr);
-    ArrayList<RawModification> mods = new ArrayList<RawModification>(1);
-    mods.add(mod);
+    RawModification mod = new LDAPModification(ModificationType.REPLACE, attr);
 
     ModifyOperationBasis op = new ModifyOperationBasis(getRootConnection(),
           nextOperationID(), nextMessageID(), null,
           ByteString.valueOf(serverStateEntryDN.toString()),
-          mods);
+          Collections.singletonList(mod));
     op.setInternalOperation(true);
     op.setSynchronizationOperation(true);
     op.setDontSynchronize(true);
@@ -301,7 +292,7 @@
               op.getResultCode().getResultCodeName().toString(),
               op.toString(),
               op.getErrorMessage().toString(),
-              baseDn.toString()));
+              baseDN.toString()));
     }
     return op.getResultCode();
   }
@@ -356,7 +347,7 @@
       InternalSearchOperation op;
       try
       {
-        op = LDAPReplicationDomain.searchForChangedEntries(baseDn,
+        op = LDAPReplicationDomain.searchForChangedEntries(baseDN,
                 serverStateMaxCSN, null);
       }
       catch (Exception  e)
@@ -368,7 +359,7 @@
       {
         // An error happened trying to search for the updates
         // Log an error
-        logError(ERR_CANNOT_RECOVER_CHANGES.get(baseDn.toNormalizedString()));
+        logError(ERR_CANNOT_RECOVER_CHANGES.get(baseDN.toNormalizedString()));
         return;
       }
 
@@ -394,7 +385,7 @@
       {
         // Update the serverState with the new maxCSN present in the database
         update(dbMaxCSN);
-        logError(NOTE_SERVER_STATE_RECOVERY.get(baseDn.toNormalizedString(),
+        logError(NOTE_SERVER_STATE_RECOVERY.get(baseDN.toNormalizedString(),
             dbMaxCSN.toString()));
       }
     }
@@ -411,4 +402,14 @@
   {
     return state.getCSN(serverId);
   }
+
+  /** {@inheritDoc} */
+  @Override
+  public String toString()
+  {
+    return getClass().getSimpleName()
+        + " baseDN=" + baseDN
+        + " serverId=" + serverId
+        + " " + REPLICATION_STATE + "=" + state;
+  }
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
index 7d283f1..72060f9 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MessageHandler.java
@@ -295,31 +295,11 @@
            *           restart as usual
            *   load this change on the delayList
            */
-          DBCursor<UpdateMsg> cursor = null;
-          try
-          {
-            // fill the lateQueue
-            cursor = replicationServerDomain.getCursorFrom(serverState);
-            while (cursor.next() && isLateQueueBelowThreshold())
-            {
-              lateQueue.add(cursor.getRecord());
-            }
-          }
-          catch (ChangelogException e)
-          {
-            TRACER.debugCaught(DebugLogLevel.ERROR, e);
-          }
-          finally
-          {
-            close(cursor);
-          }
-
-          /*
-           * If the late queue is empty then we could not find any messages in
-           * the replication log so the remote server is not late anymore.
-           */
+          fillLateQueue();
           if (lateQueue.isEmpty())
           {
+            // we could not find any messages in the changelog
+            // so the remote server is not late anymore.
             synchronized (msgQueue)
             {
               // Ensure we are below threshold so this server will follow the
@@ -333,8 +313,8 @@
           else
           {
             /*
-             * if the first change in the lateQueue is also on the regular
-             * queue, we can resume the processing from the regular queue
+             * if the first change in the lateQueue is also on the regular queue,
+             * we can resume the processing from the regular queue
              * -> set following to true and empty the lateQueue.
              */
             UpdateMsg msg = lateQueue.first();
@@ -356,7 +336,7 @@
         {
           // get the next change from the lateQueue
           UpdateMsg msg;
-          synchronized (msgQueue)
+          synchronized (msgQueue) // TODO JNR why synchronize(msgQueue) here?
           {
             msg = lateQueue.removeFirst();
           }
@@ -409,6 +389,27 @@
     return null;
   }
 
+  private void fillLateQueue()
+  {
+    DBCursor<UpdateMsg> cursor = null;
+    try
+    {
+      cursor = replicationServerDomain.getCursorFrom(serverState);
+      while (cursor.next() && isLateQueueBelowThreshold())
+      {
+        lateQueue.add(cursor.getRecord());
+      }
+    }
+    catch (ChangelogException e)
+    {
+      TRACER.debugCaught(DebugLogLevel.ERROR, e);
+    }
+    finally
+    {
+      close(cursor);
+    }
+  }
+
   private boolean isLateQueueBelowThreshold()
   {
     return lateQueue.count() < 100 && lateQueue.bytesCount() < 50000;
@@ -428,16 +429,14 @@
       {
         if (!msgQueue.isEmpty())
         {
-          UpdateMsg msg = msgQueue.first();
-          result = msg.getCSN();
+          result = msgQueue.first().getCSN();
         }
       }
       else
       {
         if (!lateQueue.isEmpty())
         {
-          UpdateMsg msg = lateQueue.first();
-          result = msg.getCSN();
+          result = lateQueue.first().getCSN();
         }
         else
         {
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MsgQueue.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MsgQueue.java
index b6040f7..b91f5aa 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/MsgQueue.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/MsgQueue.java
@@ -22,14 +22,12 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions copyright 2012-2013 ForgeRock AS.
+ *      Portions copyright 2012-2014 ForgeRock AS.
  */
 package org.opends.server.replication.server;
 
-import java.util.NavigableMap;
 import java.util.TreeMap;
 
-import org.opends.messages.Message;
 import org.opends.server.replication.common.CSN;
 import org.opends.server.replication.protocol.UpdateMsg;
 
@@ -39,10 +37,18 @@
 /**
  * This class is used to build ordered lists of UpdateMsg.
  * The order is defined by the order of the CSN of the UpdateMsg.
+ * @ThreadSafe
  */
 public class MsgQueue
 {
-  private NavigableMap<CSN, UpdateMsg> map = new TreeMap<CSN, UpdateMsg>();
+  private TreeMap<CSN, UpdateMsg> map = new TreeMap<CSN, UpdateMsg>();
+  /**
+   * FIXME JNR to be investigated:
+   * I strongly suspect that we could replace this field
+   * by using the synchronized keyword on each method.
+   * However, MessageHandler is weirdly synchronizing on msgQueue field
+   * even though it is touching the lateQueue field (?!?).
+   */
   private final Object lock = new Object();
 
   /** The total number of bytes for all the message in the queue. */
@@ -110,7 +116,7 @@
   {
     synchronized (lock)
     {
-      UpdateMsg msgSameCSN = map.put(update.getCSN(), update);
+      final UpdateMsg msgSameCSN = map.put(update.getCSN(), update);
       if (msgSameCSN != null)
       {
         try
@@ -121,14 +127,13 @@
           {
             // Adding 2 msgs with the same CSN is ok only when
             // the 2 msgs are the same
-            bytesCount += (update.size() - msgSameCSN.size());
-            Message errMsg = ERR_RSQUEUE_DIFFERENT_MSGS_WITH_SAME_CN.get(
+            bytesCount += update.size() - msgSameCSN.size();
+            logError(ERR_RSQUEUE_DIFFERENT_MSGS_WITH_SAME_CN.get(
                 msgSameCSN.getCSN().toString(),
-                msgSameCSN.toString(), update.toString());
-            logError(errMsg);
+                msgSameCSN.toString(), update.toString()));
           }
         }
-        catch(Exception e)
+        catch (Exception e)
         {}
       }
       else
@@ -148,14 +153,15 @@
   {
     synchronized (lock)
     {
-      UpdateMsg update = map.get(map.firstKey());
+      // FIXME JNR replace next 2 lines with just that one:
+      // final UpdateMsg update = map.pollFirstEntry().getValue();
+      final UpdateMsg update = map.get(map.firstKey());
       map.remove(update.getCSN());
       bytesCount -= update.size();
-      if ((map.size() == 0) && (bytesCount != 0))
+      if (map.isEmpty() && bytesCount != 0)
       {
         // should never happen
-        Message msg = ERR_BYTE_COUNT.get(Integer.toString(bytesCount));
-        logError(msg);
+        logError(ERR_BYTE_COUNT.get(Integer.toString(bytesCount)));
         bytesCount = 0;
       }
       return update;
@@ -197,18 +203,33 @@
    * message. If the passed in message is not contained in the current queue,
    * then all messages will be removed from it.
    *
-   * @param msg
+   * @param finalMsg
    *          the final message to reach when consuming messages from this queue
    */
-  public void consumeUpTo(UpdateMsg msg)
+  public void consumeUpTo(UpdateMsg finalMsg)
   {
-    UpdateMsg msg1;
+    // FIXME this code could be more efficient if the msgQueue could call the
+    // following code (to be tested):
+    // if (!map.containsKey(finalMsg.getCSN())) {
+    // map.clear();
+    // } else {
+    // map.headMap(finalMsg.getCSN(), true).clear();
+    // }
+
+    final CSN finalCSN = finalMsg.getCSN();
+    UpdateMsg msg;
     do
     {
-      // FIXME this code could be more efficient if the msgQueue could call the
-      // following code (to be tested):
-      // map.headMap(msg.getCSN(), true).clear()
-      msg1 = removeFirst();
-    } while (!msg.getCSN().equals(msg1.getCSN()));
+      msg = removeFirst();
+    }
+    while (!finalCSN.equals(msg.getCSN()));
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public String toString()
+  {
+    return getClass().getSimpleName() + " bytesCount=" + bytesCount + " queue="
+        + map.values();
   }
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
index 27b0175..d5ed710 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicaDBCursor.java
@@ -30,7 +30,7 @@
 import org.opends.server.replication.protocol.UpdateMsg;
 import org.opends.server.replication.server.changelog.api.ChangelogException;
 import org.opends.server.replication.server.changelog.api.DBCursor;
-import org.opends.server.replication.server.changelog.je.ReplicationDB.*;
+import org.opends.server.replication.server.changelog.je.ReplicationDB.ReplServerDBCursor;
 
 /**
  * Berkeley DB JE implementation of {@link DBCursor}.
@@ -89,11 +89,7 @@
     final ReplServerDBCursor localCursor = cursor;
     currentChange = localCursor != null ? localCursor.next() : null;
 
-    if (currentChange != null)
-    {
-      lastNonNullCurrentCSN = currentChange.getCSN();
-    }
-    else
+    if (currentChange == null)
     {
       synchronized (this)
       {
@@ -105,13 +101,14 @@
         // and fixing such issue with unit tests.
         cursor = db.openReadCursor(lastNonNullCurrentCSN);
         currentChange = cursor.next();
-        if (currentChange != null)
-        {
-          lastNonNullCurrentCSN = currentChange.getCSN();
-        }
       }
     }
-    return currentChange != null;
+    if (currentChange != null)
+    {
+      lastNonNullCurrentCSN = currentChange.getCSN();
+      return true;
+    }
+    return false;
   }
 
   /** {@inheritDoc} */
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
index 7c3efc6..556e4db 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/monitors/InternalSearchMonitorTestCase.java
@@ -22,33 +22,33 @@
  *
  *
  *      Copyright 2006-2008 Sun Microsystems, Inc.
- *      Portions copyright 2013 ForgeRock AS.
+ *      Portions copyright 2013-2014 ForgeRock AS.
  */
 package org.opends.server.monitors;
 
-
-
-import java.util.ArrayList;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import org.testng.annotations.AfterClass;
+import java.util.Iterator;
+import java.util.Set;
 
 import org.opends.server.TestCaseUtils;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.types.*;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
 
+import static org.opends.server.protocols.internal.InternalClientConnection.*;
+import static org.opends.server.types.SearchFilter.*;
+import static org.opends.server.types.SearchScope.*;
 import static org.testng.Assert.*;
 
-
-
 /**
  * Interacts with the Directory Server monitor providers by retrieving the
  * monitor entries with internal searches.
  */
+@SuppressWarnings("javadoc")
 public class InternalSearchMonitorTestCase
        extends MonitorTestCase
 {
@@ -56,20 +56,15 @@
 
   /**
    * Ensures that the Directory Server is started.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
-  @BeforeClass()
-  public void startServer()
-         throws Exception
+  @BeforeClass
+  public void startServer() throws Exception
   {
     TestCaseUtils.startServer();
     DirectoryServer.registerMonitorProvider(testMonitorProvider);
   }
 
-
-
-  @AfterClass()
+  @AfterClass
   public void deregisterTestMonitor()
   {
     DirectoryServer.deregisterMonitorProvider(testMonitorProvider);
@@ -77,19 +72,13 @@
 
   /**
    * Uses an internal subtree search to retrieve the monitor entries.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
   @Test
-  public void testWithSubtreeMonitorSearch()
-         throws Exception
+  public void testWithSubtreeMonitorSearch() throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch(DN.decode("cn=monitor"), SearchScope.WHOLE_SUBTREE,
-              SearchFilter.createFilterFromString("(objectClass=*)"));
-    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    InternalSearchOperation op = getRootConnection().processSearch(
+        "cn=monitor", WHOLE_SUBTREE, "(objectClass=*)");
+    assertEquals(op.getResultCode(), ResultCode.SUCCESS);
   }
 
 
@@ -102,18 +91,14 @@
   @DataProvider(name = "monitorNames")
   public Object[][] getMonitorNames()
   {
-    ArrayList<String> monitorNames = new ArrayList<String>();
-    for (String name : DirectoryServer.getMonitorProviders().keySet())
-    {
-      monitorNames.add(name);
-    }
+    Set<String> monitorNames = DirectoryServer.getMonitorProviders().keySet();
+    Iterator<String> it = monitorNames.iterator();
 
     Object[][] nameArray = new Object[monitorNames.size()][1];
     for (int i=0; i < nameArray.length; i++)
     {
-      nameArray[i] = new Object[] { monitorNames.get(i) };
+      nameArray[i] = new Object[] { it.next() };
     }
-
     return nameArray;
   }
 
@@ -123,52 +108,36 @@
    * Uses a set of internal base-level searches to retrieve the monitor entries.
    *
    * @param  monitorName  The name of the monitor entry to retrieve.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
   @Test(dataProvider = "monitorNames")
-  public void testWithBaseObjectMonitorSearch(String monitorName)
-         throws Exception
+  public void testWithBaseObjectMonitorSearch(String monitorName) throws Exception
   {
     // could be more than one level
-    DN monitorDN = DN.decode("cn="+monitorName+",cn=monitor");
-
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch(monitorDN,
-              SearchScope.BASE_OBJECT,
-              SearchFilter.createFilterFromString("(objectClass=*)"));
-    assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+    final String monitorDN = "cn="+monitorName+",cn=monitor";
+    InternalSearchOperation op = getRootConnection().processSearch(
+        monitorDN, BASE_OBJECT, "(objectClass=*)");
+    assertEquals(op.getResultCode(), ResultCode.SUCCESS);
   }
 
   /**
    * Uses an internal subtree search to retrieve the monitor entries, then
    * verifies that the resulting entry DNs can be used to get the same
    * entries with a base object search.
-   *
-   * @throws  Exception  If an unexpected problem occurs.
    */
   @Test
-  public void testWithSubtreeAndBaseMonitorSearch()
-         throws Exception
+  public void testWithSubtreeAndBaseMonitorSearch() throws Exception
   {
-    InternalClientConnection conn =
-         InternalClientConnection.getRootConnection();
-    InternalSearchOperation searchOperation =
-         conn.processSearch(DN.decode("cn=monitor"), SearchScope.WHOLE_SUBTREE,
-              SearchFilter.createFilterFromString("(objectClass=*)"));
+    final InternalClientConnection conn = getRootConnection();
+    InternalSearchOperation searchOperation = conn.processSearch(
+        "cn=monitor", WHOLE_SUBTREE, "(objectClass=*)");
     assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
 
     for (SearchResultEntry sre : searchOperation.getSearchEntries())
     {
-      SearchFilter filter =
-           SearchFilter.createFilterFromString("(objectClass=*)");
-      searchOperation =
-           conn.processSearch(sre.getDN(), SearchScope.BASE_OBJECT, filter);
-      assertEquals(searchOperation.getResultCode(), ResultCode.SUCCESS);
+      final InternalSearchOperation op = conn.processSearch(
+          sre.getDN(), BASE_OBJECT, createFilterFromString("(objectClass=*)"));
+      assertEquals(op.getResultCode(), ResultCode.SUCCESS);
     }
   }
 
 }
-
diff --git a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java
index 431f226..cdaae64 100644
--- a/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java
+++ b/opendj-sdk/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/ExternalChangeLogTest.java
@@ -28,7 +28,6 @@
 
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.io.StringReader;
 import java.net.Socket;
 import java.util.*;
@@ -159,17 +158,7 @@
     debugInfo("configure", "ReplicationServer created"+replicationServer);
   }
 
-  /**
-   * Launcher.
-   */
-  @Test(enabled=true)
-  public void PreTest() throws Exception
-  {
-    // No RSDomain created yet => RS only case => ECL is not a supported
-    ECLIsNotASupportedSuffix();
-  }
-
-  @Test(enabled=true, dependsOnMethods = { "PreTest"})
+  @Test(enabled = true, dependsOnMethods = { "TestECLIsNotASupportedSuffix" })
   public void PrimaryTest() throws Exception
   {
     replicationServer.getChangelogDB().setPurgeDelay(0);
@@ -190,29 +179,6 @@
     ECLCompatTestLimits(1,4,true);
   }
 
-  @Test(enabled=false, dependsOnMethods = { "PrimaryTest"})
-  public void TestWithTwoDomains() throws Exception
-  {
-    replicationServer.getChangelogDB().setPurgeDelay(0);
-    // Test with a mix of domains, a mix of DSes
-    ECLTwoDomains();
-  }
-
-  @Test(enabled=false, dependsOnMethods = { "PrimaryTest"})
-  public void TestAfterChangelogTrim() throws Exception
-  {
-    // Test ECL after changelog trimming
-    ECLAfterChangelogTrim();
-  }
-
-  @Test(enabled=true, dependsOnMethods = { "PrimaryTest"})
-  public void TestAfterDomainIsRemoved() throws Exception
-  {
-    ECLAfterDomainIsRemoved();
-  }
-
-
-
   @Test(enabled=true, dependsOnMethods = { "PrimaryTest"})
   public void TestWithAndWithoutControl() throws Exception
   {
@@ -226,27 +192,6 @@
     ECLCompatWriteReadAllOps(5);
   }
 
-  @Test(enabled = true, dependsOnMethods = { "TestWithAndWithoutControl" })
-  public void TestWithIncludeAttributes() throws Exception
-  {
-    ECLIncludeAttributes();
-  }
-
-  @Test(enabled=true, dependsOnMethods = { "PrimaryTest"})
-  public void TestChangeTimeHeartBeat() throws Exception
-  {
-    ChangeTimeHeartbeatTest();
-  }
-
-  @Test(enabled=true, dependsOnMethods = { "PrimaryTest"})
-  public void TestOperationalAttributesNotVisibleOutsideRootDSE() throws Exception
-  {
-    // Test that ECL Operational, virtual attributes are not visible
-    // outside rootDSE. Next test will test access in RootDSE.
-    // This one checks in data.
-    ECLOperationalAttributesFailTest();
-  }
-
   @Test(enabled=false, dependsOnMethods = { "PrimaryTest"})
   public void PrimaryFullTest() throws Exception
   {
@@ -279,10 +224,8 @@
     // Test all types of ops.
     ECLAllOps(); // Do not clean the db for the next test
 
-    // Test that ECL Operational, virtual attributes are not visible
-    // outside rootDSE. Next test will test access in RootDSE.
-    // This one checks in data.
-    ECLOperationalAttributesFailTest();
+    // Test after this one will test access in RootDSE. This one checks in data.
+    TestECLOperationalAttributesNotVisibleOutsideRootDSE();
 
     // First and last should be ok whenever a request has been done or not
     // in compat mode.
@@ -296,27 +239,20 @@
     ECLRemoteNonEmpty();
   }
 
+  /** Persistent search with changesOnly request */
   @Test(enabled=false, groups="slow", dependsOnMethods = { "PrimaryTest"})
   public void FullTestPersistentSearchWithChangesOnlyRequest() throws Exception
   {
-    // Persistent search with changesOnly request
     ECLPsearch(true, false);
   }
 
+  /** Persistent search with init values request */
   @Test(enabled=false, groups="slow", dependsOnMethods = { "PrimaryTest"})
   public void FullTestPersistentSearchWithInitValuesRequest() throws Exception
   {
-    // Persistent search with init values request
     ECLPsearch(false, false);
   }
 
-  @Test(enabled=false, groups="slow", dependsOnMethods = { "PrimaryTest"})
-  public void FullTestSimultaneousPersistentSearches() throws Exception
-  {
-    // Simultaneous psearches
-    ECLSimultaneousPsearches();
-  }
-
   // TODO:ECL Test SEARCH abandon and check everything shutdown and cleaned
   // TODO:ECL Test PSEARCH abandon and check everything shutdown and cleaned
   // TODO:ECL Test invalid DN in cookie returns UNWILLING + message
@@ -410,7 +346,9 @@
     assertEquals(ico.getErrorMessage().toMessage(), NOTE_SEARCH_CHANGELOG_INSUFFICIENT_PRIVILEGES.get());
   }
 
-  private void ECLIsNotASupportedSuffix() throws Exception
+  /** No RSDomain created yet => RS only case => ECL is not a supported. */
+  @Test(enabled = true)
+  public void TestECLIsNotASupportedSuffix() throws Exception
   {
     ECLCompatTestLimits(0,0, false);
   }
@@ -470,11 +408,15 @@
   }
 
   /**
-   * Objectives
-   *   - Test that everything is ok with changes on 2 suffixes
-   * Procedure
-   *   - From 1 remote ECL session,
-   *   - Test simple update to be received from 2 suffixes
+   * Objectives:
+   * <ul>
+   * <li>Test that everything is ok with changes on 2 suffixes</li>
+   * </ul>
+   * Procedure:
+   * <ul>
+   * <li>From 1 remote ECL session,</li>
+   * <li>Test simple update to be received from 2 suffixes</li>
+   * </ul>
    */
   private void ECLRemoteNonEmpty() throws Exception
   {
@@ -558,7 +500,7 @@
     debugInfo(tn, "Starting test\n\n");
 
     // root entry returned
-    searchOnChangelog("(objectclass=*)", Collections.<String> emptySet(), createControls(""),
+    searchOnChangelog("(objectclass=*)", Collections.<String> emptySet(), createCookieControl(""),
         1, ResultCode.SUCCESS, tn);
 
     debugInfo(tn, "Ending test successfully");
@@ -569,12 +511,11 @@
    * @param cookie The provided cookie.
    * @return The built list of controls.
    */
-  private List<Control> createControls(String cookie) throws DirectoryException
+  private List<Control> createCookieControl(String cookie) throws DirectoryException
   {
     final MultiDomainServerState state = new MultiDomainServerState(cookie);
-    final List<Control> controls = new ArrayList<Control>(1);
-    controls.add(new ExternalChangelogRequestControl(true, state));
-    return controls;
+    final Control cookieControl = new ExternalChangelogRequestControl(true, state);
+    return newList(cookieControl);
   }
 
   /**
@@ -666,11 +607,16 @@
   }
 
   /**
-   * From embedded ECL Search ECL with 4 messages on 2 suffixes from 2 brokers
+   * From embedded ECL Search ECL with 4 messages on 2 suffixes from 2 brokers.
+   * Test with a mix of domains, a mix of DSes.
    */
-  private void ECLTwoDomains() throws Exception
+  @Test(enabled=false, dependsOnMethods = { "PrimaryTest"})
+  public void TestECLWithTwoDomains() throws Exception
   {
-    String tn = "ECLTwoDomains";
+    replicationServer.getChangelogDB().setPurgeDelay(0);
+
+
+    String tn = "TestECLWithTwoDomains";
     debugInfo(tn, "Starting test");
 
     ReplicationBroker s1test = null;
@@ -880,7 +826,7 @@
       throws Exception
   {
     debugInfo(testName, "Search with cookie=[" + cookie + "] filter=[" + filterString + "]");
-    return searchOnChangelog(filterString, ALL_ATTRIBUTES, createControls(cookie),
+    return searchOnChangelog(filterString, ALL_ATTRIBUTES, createCookieControl(cookie),
         expectedNbEntries, expectedResultCode, testName);
   }
 
@@ -925,9 +871,10 @@
   }
 
   /** Test ECL content after replication changelogDB trimming */
-  private void ECLAfterChangelogTrim() throws Exception
+  @Test(enabled=false, dependsOnMethods = { "PrimaryTest"})
+  public void testECLAfterChangelogTrim() throws Exception
   {
-    String testName = "ECLAfterChangelogTrim";
+    String testName = "testECLAfterChangelogTrim";
     debugInfo(testName, "Starting test");
 
     ReplicationBroker server01 = null;
@@ -992,9 +939,10 @@
   }
 
   /** Test ECL content after a domain has been removed. */
-  private void ECLAfterDomainIsRemoved() throws Exception
+  @Test(enabled=true, dependsOnMethods = { "PrimaryTest"})
+  public void testECLAfterDomainIsRemoved() throws Exception
   {
-    String testName = "ECLAfterDomainIsRemoved";
+    String testName = "testECLAfterDomainIsRemoved";
     debugInfo(testName, "Starting test");
 
     ReplicationBroker server01 = null;
@@ -1131,7 +1079,7 @@
           baseUUID,
           entry.getObjectClassAttribute(),
           entry.getAttributes(),
-          new ArrayList<Attribute>());
+          Collections.<Attribute> emptyList());
       server01.publish(addMsg);
       debugInfo(tn, " publishes " + addMsg.getCSN());
 
@@ -1248,31 +1196,27 @@
     assertThat(actualDN).isEqualToIgnoringCase(expectedDN);
   }
 
-  private List<String> getControls(String resultString)
+  private List<String> getControls(String resultString) throws Exception
   {
-    StringReader r=new StringReader(resultString);
-    BufferedReader br=new BufferedReader(r);
-    List<String> ctrlList = new ArrayList<String>();
-    try {
-      while(true) {
-        String s = br.readLine();
-        if(s == null)
-        {
-          break;
-        }
-        if(!s.startsWith("#"))
-        {
-          continue;
-        }
-        String[] a=s.split(": ");
-        if(a.length != 2)
-        {
-          break;
-        }
-        ctrlList.add(a[1]);
+    final BufferedReader br = new BufferedReader(new StringReader(resultString));
+    final List<String> ctrlList = new ArrayList<String>();
+    while (true)
+    {
+      final String s = br.readLine();
+      if (s == null)
+      {
+        break;
       }
-    } catch (IOException e) {
-      assertEquals(0, 1, e.getMessage());
+      if (!s.startsWith("#"))
+      {
+        continue;
+      }
+      final String[] a = s.split(": ");
+      if (a.length != 2)
+      {
+        break;
+      }
+      ctrlList.add(a[1]);
     }
     return ctrlList;
   }
@@ -1432,7 +1376,7 @@
 
       // Creates cookie control
       String cookie = "";
-      List<Control> controls = createControls(cookie);
+      List<Control> controls = createCookieControl(cookie);
       if (compatMode)
       {
         cookie = null;
@@ -1574,7 +1518,7 @@
             createSearchRequest("(targetDN=*directpsearch*,o=test)", null);
 
         debugInfo(tn, "ACI test : sending search");
-        message = new LDAPMessage(2, searchRequest, createControls(""));
+        message = new LDAPMessage(2, searchRequest, createCookieControl(""));
         w.writeMessage(message);
 
         searchesDone=0;
@@ -1653,11 +1597,12 @@
   }
 
   /**
-   * Test parallel simultaneous psearch with different filters.
+   * Test parallel simultaneous persistent search with different filters.
    */
-  private void ECLSimultaneousPsearches() throws Exception
+  @Test(enabled = false, groups = "slow", dependsOnMethods = { "PrimaryTest" })
+  public void FullTestSimultaneousPersistentSearches() throws Exception
   {
-    String tn = "ECLSimultaneousPsearches";
+    String tn = "FullTestSimultaneousPersistentSearches";
     debugInfo(tn, "Starting test \n\n");
     Socket s1 = null, s2 = null, s3 = null;
     ReplicationBroker server01 = null;
@@ -1723,7 +1668,7 @@
 
       // Creates cookie control
       String cookie = "";
-      List<Control> controls = createControls(cookie);
+      List<Control> controls = createCookieControl(cookie);
       if (compatMode)
       {
         cookie = null;
@@ -2162,9 +2107,10 @@
   /**
    * FIXME this test actually tests nothing: there are no asserts.
    */
-  private void ChangeTimeHeartbeatTest() throws Exception
+  @Test(enabled = true, dependsOnMethods = { "PrimaryTest" })
+  public void testChangeTimeHeartbeat() throws Exception
   {
-    String tn = "ChangeTimeHeartbeatTest";
+    String tn = "testChangeTimeHeartbeat";
     debugInfo(tn, "Starting test");
     ReplicationBroker s1test = null;
     ReplicationBroker s2test = null;
@@ -2291,7 +2237,7 @@
           baseUUID,
           entry.getObjectClassAttribute(),
           entry.getAttributes(),
-          new ArrayList<Attribute>());
+          Collections.<Attribute> emptyList());
       server01.publish(addMsg);
       debugInfo(tn, " publishes " + addMsg.getCSN());
 
@@ -2603,9 +2549,13 @@
     debugInfo(tn, "Ending test with success");
   }
 
-  private void ECLOperationalAttributesFailTest() throws Exception
+  /**
+   * Test that ECL Operational, virtual attributes are not visible outside rootDSE.
+   */
+  @Test(enabled = true, dependsOnMethods = { "PrimaryTest" })
+  public void TestECLOperationalAttributesNotVisibleOutsideRootDSE() throws Exception
   {
-    String tn = "ECLOperationalAttributesFailTest";
+    String tn = "TestECLOperationalAttributesNotVisibleOutsideRootDSE";
     // The goal is to verify that the Changelog attributes are not
     // available in other entries. We u
     debugInfo(tn, "Starting test \n\n");
@@ -2622,9 +2572,7 @@
             0, // Time limit
             false, // Types only
             "(objectclass=*)",
-            attributes,
-            NO_CONTROL,
-            null);
+            attributes);
     waitOpResult(searchOp, ResultCode.SUCCESS);
 
     final List<SearchResultEntry> entries = searchOp.getSearchEntries();
@@ -2720,9 +2668,7 @@
         0, // Time limit
         false, // Types only
         "(objectclass=*)",
-        attributes,
-        NO_CONTROL,
-        null);
+        attributes);
     waitOpResult(searchOp, ResultCode.SUCCESS);
     return searchOp;
   }
@@ -2773,11 +2719,12 @@
   }
 
   /**
-   * Test ECl entry attributes, and there configuration.
+   * Test ECl entry attributes, and their configuration.
    */
-  private void ECLIncludeAttributes() throws Exception
+  @Test(enabled = true, dependsOnMethods = { "TestWithAndWithoutControl" })
+  public void TestECLWithIncludeAttributes() throws Exception
   {
-    String tn = "ECLIncludeAttributes";
+    String tn = "TestECLWithIncludeAttributes";
     debugInfo(tn, "Starting test\n\n");
 
     final String backendId3 = "test3";
@@ -2952,9 +2899,7 @@
   private List<Modification> createMods(String attributeName, String valueString)
   {
     Attribute attr = Attributes.create(attributeName, valueString);
-    List<Modification> mods = new ArrayList<Modification>();
-    mods.add(new Modification(ModificationType.REPLACE, attr));
-    return mods;
+    return newList(new Modification(ModificationType.REPLACE, attr));
   }
 
   private Entry parseIncludedAttributes(SearchResultEntry resultEntry,
@@ -2969,8 +2914,7 @@
     return TestCaseUtils.makeEntry(ldif);
   }
 
-  private void waitOpResult(Operation operation, ResultCode expectedResult)
-      throws Exception
+  private void waitOpResult(Operation operation, ResultCode expectedResult) throws Exception
   {
     int i = 0;
     while (operation.getResultCode() == ResultCode.UNDEFINED

--
Gitblit v1.10.0