From 67649485a8b644abfc3f0ab7890df02d6e9fe2e8 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 22 Aug 2013 14:13:20 +0000
Subject: [PATCH] ReplicationIterator.java: Renamed releaseCursor() to close(). Now extends Closeable.

---
 opends/src/server/org/opends/server/util/StaticUtils.java                                                      |   53 +-----
 opends/src/server/org/opends/server/replication/server/MessageHandler.java                                     |   23 --
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java |   62 +++----
 opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java                  |    7 
 opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java                 |    4 
 opends/src/server/org/opends/server/replication/server/ReplicationBackend.java                                 |  279 ++++++++++++----------------------
 opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java                            |   11 -
 7 files changed, 151 insertions(+), 288 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/MessageHandler.java b/opends/src/server/org/opends/server/replication/server/MessageHandler.java
index 2e4c5d2..d63b92e 100644
--- a/opends/src/server/org/opends/server/replication/server/MessageHandler.java
+++ b/opends/src/server/org/opends/server/replication/server/MessageHandler.java
@@ -42,11 +42,13 @@
 import org.opends.server.replication.common.ChangeNumber;
 import org.opends.server.replication.common.ServerState;
 import org.opends.server.replication.protocol.UpdateMsg;
-import org.opends.server.replication.server.changelog.api.*;
+import org.opends.server.replication.server.changelog.api.ReplicationIterator;
+import org.opends.server.replication.server.changelog.api.ReplicationIteratorComparator;
 import org.opends.server.types.*;
 
 import static org.opends.messages.ReplicationMessages.*;
 import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class implements a buffering/producer/consumer mechanism of
@@ -308,7 +310,7 @@
           }
           finally
           {
-            releaseAllIterators(iteratorSortedSet);
+            close(iteratorSortedSet);
           }
 
           /*
@@ -411,7 +413,7 @@
     }
     else
     {
-      iter.releaseCursor();
+      close(iter);
     }
   }
 
@@ -461,7 +463,7 @@
             result = null;
           } finally
           {
-            releaseAllIterators(iteratorSortedSet);
+            close(iteratorSortedSet);
           }
         }
       }
@@ -495,24 +497,13 @@
         }
         else
         {
-          iter.releaseCursor();
+          close(iter);
         }
       }
     }
     return results;
   }
 
-  private void releaseAllIterators(SortedSet<ReplicationIterator> iterators)
-  {
-    if (iterators != null)
-    {
-      for (ReplicationIterator iter : iterators)
-      {
-        iter.releaseCursor();
-      }
-    }
-  }
-
   /**
    * Get the count of updates sent to this server.
    * @return  The count of update sent to this server.
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java b/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
index f1b4c56..f693b33 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationBackend.java
@@ -27,15 +27,6 @@
  */
 package org.opends.server.replication.server;
 
-import static org.opends.messages.BackendMessages.*;
-import static org.opends.messages.JebMessages.*;
-import static org.opends.messages.ReplicationMessages.*;
-import static org.opends.server.config.ConfigConstants.*;
-import static org.opends.server.loggers.ErrorLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -45,69 +36,31 @@
 import org.opends.messages.Message;
 import org.opends.server.admin.Configuration;
 import org.opends.server.admin.server.ServerManagementContext;
-import org.opends.server.admin.std.server.BackendCfg;
-import org.opends.server.admin.std.server.ReplicationServerCfg;
-import org.opends.server.admin.std.server.ReplicationSynchronizationProviderCfg;
-import org.opends.server.admin.std.server.RootCfg;
-import org.opends.server.admin.std.server.SynchronizationProviderCfg;
+import org.opends.server.admin.std.server.*;
 import org.opends.server.api.Backend;
 import org.opends.server.api.SynchronizationProvider;
 import org.opends.server.backends.jeb.BackupManager;
 import org.opends.server.config.ConfigException;
-import org.opends.server.core.AddOperation;
-import org.opends.server.core.DeleteOperation;
-import org.opends.server.core.DirectoryServer;
-import org.opends.server.core.ModifyDNOperation;
-import org.opends.server.core.ModifyOperation;
-import org.opends.server.core.SearchOperation;
+import org.opends.server.core.*;
 import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.protocols.internal.InternalClientConnection;
 import org.opends.server.protocols.internal.InternalSearchOperation;
 import org.opends.server.replication.common.ChangeNumber;
 import org.opends.server.replication.plugin.MultimasterReplication;
 import org.opends.server.replication.plugin.ReplicationServerListener;
-import org.opends.server.replication.protocol.AddMsg;
-import org.opends.server.replication.protocol.DeleteMsg;
-import org.opends.server.replication.protocol.LDAPUpdateMsg;
-import org.opends.server.replication.protocol.ModifyDNMsg;
-import org.opends.server.replication.protocol.ModifyMsg;
-import org.opends.server.replication.protocol.UpdateMsg;
+import org.opends.server.replication.protocol.*;
 import org.opends.server.replication.server.changelog.api.ReplicationIterator;
-import org.opends.server.types.Attribute;
-import org.opends.server.types.AttributeBuilder;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.Attributes;
-import org.opends.server.types.BackupConfig;
-import org.opends.server.types.BackupDirectory;
-import org.opends.server.types.ByteString;
-import org.opends.server.types.CanceledOperationException;
-import org.opends.server.types.ConditionResult;
-import org.opends.server.types.Control;
-import org.opends.server.types.DN;
-import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.DereferencePolicy;
-import org.opends.server.types.Entry;
-import org.opends.server.types.FilterType;
-import org.opends.server.types.IndexType;
-import org.opends.server.types.InitializationException;
-import org.opends.server.types.LDIFExportConfig;
-import org.opends.server.types.LDIFImportConfig;
-import org.opends.server.types.LDIFImportResult;
-import org.opends.server.types.RawAttribute;
-import org.opends.server.types.RestoreConfig;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.SearchFilter;
-import org.opends.server.types.SearchScope;
-import org.opends.server.types.SearchResultEntry;
-import org.opends.server.types.ObjectClass;
-import org.opends.server.util.AddChangeRecordEntry;
-import org.opends.server.util.DeleteChangeRecordEntry;
-import org.opends.server.util.LDIFReader;
-import org.opends.server.util.LDIFWriter;
-import org.opends.server.util.ModifyChangeRecordEntry;
-import org.opends.server.util.ModifyDNChangeRecordEntry;
-import org.opends.server.util.Validator;
+import org.opends.server.types.*;
+import org.opends.server.util.*;
+
+import static org.opends.messages.BackendMessages.*;
+import static org.opends.messages.JebMessages.*;
+import static org.opends.messages.ReplicationMessages.*;
+import static org.opends.server.config.ConfigConstants.*;
+import static org.opends.server.loggers.ErrorLogger.*;
+import static org.opends.server.loggers.debug.DebugLogger.*;
+import static org.opends.server.util.ServerConstants.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a backend that stores its information in an
@@ -370,35 +323,33 @@
   @Override()
   public synchronized Entry getEntry(DN entryDN)
   {
-    Entry e = null;
     try {
-      if(baseDNSet.contains(entryDN)) {
+      if (baseDNSet.contains(entryDN)) {
            return new Entry(entryDN, rootObjectclasses, attributes,
                             operationalAttributes);
-      } else {
-        InternalClientConnection conn =
-                InternalClientConnection.getRootConnection();
-        SearchFilter filter=
-                SearchFilter.createFilterFromString("(changetype=*)");
-        InternalSearchOperation searchOperation =
-                new InternalSearchOperation(conn,
-                        InternalClientConnection.nextOperationID(),
-                        InternalClientConnection.nextMessageID(), null, entryDN,
-                        SearchScope.BASE_OBJECT,
-                        DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
-                        filter, null, null);
-        search(searchOperation);
-        LinkedList<SearchResultEntry> resultEntries =
-                searchOperation.getSearchEntries();
-        if(resultEntries.size() != 0) {
-          e=resultEntries.getFirst();
-        }
       }
-    } catch (DirectoryException ex) {
-      e=null;
-    }
-    return e;
 
+      InternalClientConnection conn =
+          InternalClientConnection.getRootConnection();
+      SearchFilter filter =
+          SearchFilter.createFilterFromString("(changetype=*)");
+      InternalSearchOperation searchOp = new InternalSearchOperation(conn,
+              InternalClientConnection.nextOperationID(),
+              InternalClientConnection.nextMessageID(),
+              null, entryDN, SearchScope.BASE_OBJECT,
+              DereferencePolicy.NEVER_DEREF_ALIASES, 0, 0, false,
+              filter, null, null);
+      search(searchOp);
+      List<SearchResultEntry> resultEntries = searchOp.getSearchEntries();
+      if (resultEntries.size() != 0)
+      {
+        return resultEntries.get(0);
+      }
+    }
+    catch (DirectoryException ignored)
+    {
+    }
+    return null;
   }
 
 
@@ -547,9 +498,9 @@
 
     exportRootChanges(exportContainers, exportConfig, ldifWriter);
 
-    // Iterate through the containers.
     try
     {
+      // Iterate through the containers.
       for (ReplicationServerDomain exportContainer : exportContainers)
       {
         if (exportConfig.isCancelled())
@@ -563,18 +514,7 @@
     {
       timer.cancel();
 
-      // Close the LDIF writer
-      try
-      {
-        ldifWriter.close();
-      }
-      catch (Exception e)
-      {
-        if (debugEnabled())
-        {
-          TRACER.debugCaught(DebugLogLevel.ERROR, e);
-        }
-      }
+      close(ldifWriter);
     }
 
     long finishTime = System.currentTimeMillis();
@@ -628,7 +568,7 @@
    * Exports the root changes of the export, and one entry by domain.
    */
   private void exportRootChanges(List<ReplicationServerDomain> exportContainers,
-      LDIFExportConfig exportConfig, LDIFWriter ldifWriter)
+      final LDIFExportConfig exportConfig, LDIFWriter ldifWriter)
   {
     AttributeType ocType = DirectoryServer.getObjectClassAttributeType();
     AttributeBuilder builder = new AttributeBuilder(ocType);
@@ -645,47 +585,49 @@
 
     try
     {
-      AddChangeRecordEntry changeRecord =
-        new AddChangeRecordEntry(DN.decode(BASE_DN),
-                               attrs);
+      ChangeRecordEntry changeRecord =
+        new AddChangeRecordEntry(DN.decode(BASE_DN), attrs);
       ldifWriter.writeChangeRecord(changeRecord);
     }
     catch (Exception e) { /* do nothing */ }
 
+    if (exportConfig == null)
+    {
+      return;
+    }
+
     for (ReplicationServerDomain exportContainer : exportContainers)
     {
-      if (exportConfig != null && exportConfig.isCancelled())
+      if (exportConfig.isCancelled())
       {
         break;
       }
 
       attrs.clear();
 
+      // TODO JNR these multiple calls to clear() are more than suspect!
       ldapAttrList.clear();
       ldapAttrList.add(ocAttr);
       attrs.put(ocType, ldapAttrList);
 
       TRACER.debugInfo("State=" +
           exportContainer.getDbServerState());
-      Attribute stateAttr = Attributes.create("state", exportContainer
-          .getDbServerState().toString());
+      Attribute stateAttr = Attributes.create("state",
+          exportContainer.getDbServerState().toString());
       ldapAttrList.clear();
       ldapAttrList.add(stateAttr);
       attrs.put(stateAttr.getAttributeType(), ldapAttrList);
 
-      Attribute genidAttr = Attributes.create("generation-id", String
-          .valueOf(exportContainer.getGenerationId())
-          + exportContainer.getBaseDn());
+      Attribute genidAttr = Attributes.create("generation-id",
+          exportContainer.getGenerationId() + exportContainer.getBaseDn());
       ldapAttrList.clear();
       ldapAttrList.add(genidAttr);
       attrs.put(genidAttr.getAttributeType(), ldapAttrList);
 
       try
       {
-        AddChangeRecordEntry changeRecord =
-          new AddChangeRecordEntry(DN.decode(
-              exportContainer.getBaseDn() + "," + BASE_DN),
-              attrs);
+        ChangeRecordEntry changeRecord = new AddChangeRecordEntry(
+            DN.decode(exportContainer.getBaseDn() + "," + BASE_DN), attrs);
         ldifWriter.writeChangeRecord(changeRecord);
       }
       catch (Exception e)
@@ -709,7 +651,6 @@
       LDIFExportConfig exportConfig, LDIFWriter ldifWriter,
       SearchOperation searchOperation)
   {
-    // Walk through the servers
     for (int serverId : rsd.getServers())
     {
       if (exportConfig != null && exportConfig.isCancelled())
@@ -742,7 +683,6 @@
 
       ReplicationIterator ri = rsd.getChangelogIterator(serverId,
           previousChangeNumber);
-
       if (ri != null)
       {
         try
@@ -794,7 +734,7 @@
         }
         finally
         {
-          ri.releaseCursor();
+          close(ri);
         }
       }
     }
@@ -815,7 +755,6 @@
       DirectoryServer.getDefaultAttributeType(CHANGE_NUMBER);
 
     FilterType filterType = filter.getFilterType();
-
     if ( (filterType.equals(FilterType.GREATER_OR_EQUAL) ||
              filterType.equals(FilterType.EQUALITY) ) &&
              filter.getAttributeType().equals(changeNumberAttrType))
@@ -904,7 +843,7 @@
 
           if (exportConfig != null)
           {
-            AddChangeRecordEntry changeRecord =
+            ChangeRecordEntry changeRecord =
               new AddChangeRecordEntry(dn, attrs);
             ldifWriter.writeChangeRecord(changeRecord);
           }
@@ -915,76 +854,31 @@
         }
         else if (msg instanceof DeleteMsg)
         {
-          DeleteMsg delMsg = (DeleteMsg)msg;
+          dn = computeDN(msg);
 
-          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
-              CHANGE_NUMBER + "=" + delMsg.getChangeNumber() + "," +
-              msg.getDn() +","+ BASE_DN);
-
-          DeleteChangeRecordEntry changeRecord =
-            new DeleteChangeRecordEntry(dn);
-          if (exportConfig != null)
-          {
-            ldifWriter.writeChangeRecord(changeRecord);
-          }
-          else
-          {
-            Writer writer = new Writer();
-            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
-            ldifWriter2.writeChangeRecord(changeRecord);
-            LDIFReader reader = writer.getLDIFReader();
-            entry = reader.readEntry();
-          }
+          ChangeRecordEntry changeRecord = new DeleteChangeRecordEntry(dn);
+          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
         }
         else if (msg instanceof ModifyMsg)
         {
           ModifyOperation op = (ModifyOperation)msg.createOperation(conn);
-
-          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
-              CHANGE_NUMBER + "=" + msg.getChangeNumber() + "," +
-              msg.getDn() +","+ BASE_DN);
           op.setInternalOperation(true);
 
-          ModifyChangeRecordEntry changeRecord =
+          dn = computeDN(msg);
+          ChangeRecordEntry changeRecord =
             new ModifyChangeRecordEntry(dn, op.getRawModifications());
-          if (exportConfig != null)
-          {
-            ldifWriter.writeChangeRecord(changeRecord);
-          }
-          else
-          {
-            Writer writer = new Writer();
-            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
-            ldifWriter2.writeChangeRecord(changeRecord);
-            LDIFReader reader = writer.getLDIFReader();
-            entry = reader.readEntry();
-          }
+          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
         }
         else if (msg instanceof ModifyDNMsg)
         {
           ModifyDNOperation op = (ModifyDNOperation)msg.createOperation(conn);
-
-          dn = DN.decode("uuid=" + msg.getEntryUUID() + "," +
-              CHANGE_NUMBER + "=" + msg.getChangeNumber() + "," +
-              msg.getDn() +","+ BASE_DN);
           op.setInternalOperation(true);
 
-          ModifyDNChangeRecordEntry changeRecord =
+          dn = computeDN(msg);
+          ChangeRecordEntry changeRecord =
             new ModifyDNChangeRecordEntry(dn, op.getNewRDN(), op.deleteOldRDN(),
                 op.getNewSuperior());
-
-          if (exportConfig != null)
-          {
-            ldifWriter.writeChangeRecord(changeRecord);
-          }
-          else
-          {
-            Writer writer = new Writer();
-            LDIFWriter ldifWriter2 = writer.getLDIFWriter();
-            ldifWriter2.writeChangeRecord(changeRecord);
-            LDIFReader reader = writer.getLDIFReader();
-            entry = reader.readEntry();
-          }
+          entry = writeChangeRecord(exportConfig, ldifWriter, changeRecord);
         }
 
         if (exportConfig != null)
@@ -1009,9 +903,8 @@
           SearchScope  scope  = searchOperation.getScope();
           SearchFilter filter = searchOperation.getFilter();
 
-          boolean ms = entry.matchesBaseAndScope(searchBaseDN, scope);
-          boolean mf = filter.matchesEntry(entry);
-          if ( ms && mf )
+          if (entry.matchesBaseAndScope(searchBaseDN, scope)
+              && filter.matchesEntry(entry))
           {
             searchOperation.returnEntry(entry, new LinkedList<Control>());
           }
@@ -1025,7 +918,6 @@
       {
         TRACER.debugCaught(DebugLogLevel.ERROR, e);
       }
-      Message message;
       String dnStr;
       if (dn == null)
       {
@@ -1035,6 +927,7 @@
       {
         dnStr = dn.toNormalizedString();
       }
+      Message message;
       if (exportConfig != null)
       {
         message = ERR_BACKEND_EXPORT_ENTRY.get(
@@ -1049,6 +942,30 @@
     }
   }
 
+
+  private DN computeDN(LDAPUpdateMsg msg) throws DirectoryException
+  {
+    return DN.decode("uuid=" + msg.getEntryUUID() + "," + CHANGE_NUMBER + "="
+        + msg.getChangeNumber() + "," + msg.getDn() + "," + BASE_DN);
+  }
+
+  private Entry writeChangeRecord(LDIFExportConfig exportConfig,
+      LDIFWriter ldifWriter, ChangeRecordEntry changeRecord)
+      throws IOException, LDIFException
+  {
+    if (exportConfig != null)
+    {
+      ldifWriter.writeChangeRecord(changeRecord);
+      return null;
+    }
+
+    final Writer writer = new Writer();
+    final LDIFWriter ldifWriter2 = writer.getLDIFWriter();
+    ldifWriter2.writeChangeRecord(changeRecord);
+    final LDIFReader ldifReader = writer.getLDIFReader();
+    return ldifReader.readEntry();
+  }
+
   /**
    * Add an attribute to a provided Map of attribute.
    *
@@ -1326,20 +1243,16 @@
     if (server==null)
     {
       server = getReplicationServer();
-
       if (server == null)
       {
-        if (baseDNSet.contains(searchBaseDN))
+        if (!baseDNSet.contains(searchBaseDN))
         {
-          return;
-        }
-        else
-        {
-          Message message = ERR_REPLICATIONBACKEND_ENTRY_DOESNT_EXIST.
-          get(String.valueOf(searchBaseDN));
+          Message message = ERR_REPLICATIONBACKEND_ENTRY_DOESNT_EXIST.get(
+              String.valueOf(searchBaseDN));
           throw new DirectoryException(
               ResultCode.NO_SUCH_OBJECT, message, null, null);
         }
+        return;
       }
     }
 
diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
index 3b50887..7afb0d0 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServerDomain.java
@@ -1311,7 +1311,7 @@
 
     if (!it.next())
     {
-      it.releaseCursor();
+      close(it);
       return null;
     }
 
@@ -1867,11 +1867,6 @@
     }
   }
 
-  private void sleep(int millis)
-  {
-    try { Thread.sleep(millis); } catch (InterruptedException e) {}
-  }
-
   /**
    * Creates a TopologyMsg filled with information to be sent to a remote RS.
    * We send remote RS the info of every DS that are directly connected to us
@@ -2717,9 +2712,7 @@
               // there's no change older than eligibleCN (case of s3/cn31)
               result.update(new ChangeNumber(0, 0, serverId));
             } finally {
-              if (ri != null) {
-                ri.releaseCursor();
-              }
+              close(ri);
             }
           } else {
             // for this serverId, all changes in the ChangelogDb are holder
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java b/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java
index b44c16c..90383b3 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/api/ReplicationIterator.java
@@ -26,13 +26,15 @@
  */
 package org.opends.server.replication.server.changelog.api;
 
+import java.io.Closeable;
+
 import org.opends.server.replication.protocol.UpdateMsg;
 
 /**
  * This interface allows to iterate through the changes received from a given
  * LDAP Server Identifier.
  */
-public interface ReplicationIterator
+public interface ReplicationIterator extends Closeable
 {
 
   /**
@@ -55,6 +57,7 @@
    * called when the iterator is no longer used. Failure to do it could cause DB
    * deadlock.
    */
-  void releaseCursor();
+  @Override
+  void close();
 
 }
diff --git a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java
index e8dae9f..8fc4d80 100644
--- a/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java
+++ b/opends/src/server/org/opends/server/replication/server/changelog/je/JEReplicationIterator.java
@@ -133,7 +133,7 @@
 
   /** {@inheritDoc} */
   @Override
-  public void releaseCursor()
+  public void close()
   {
     synchronized (this)
     {
@@ -155,6 +155,6 @@
   @Override
   protected void finalize()
   {
-    releaseCursor();
+    close();
   }
 }
diff --git a/opends/src/server/org/opends/server/util/StaticUtils.java b/opends/src/server/org/opends/server/util/StaticUtils.java
index 2ced84c..94df1c0 100644
--- a/opends/src/server/org/opends/server/util/StaticUtils.java
+++ b/opends/src/server/org/opends/server/util/StaticUtils.java
@@ -27,42 +27,16 @@
  */
 package org.opends.server.util;
 
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.lang.reflect.InvocationTargetException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
+import java.net.*;
 import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.RandomAccess;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
+import java.util.*;
 
 import javax.naming.NamingException;
 import javax.naming.ldap.InitialLdapContext;
@@ -74,19 +48,7 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.Attribute;
-import org.opends.server.types.AttributeBuilder;
-import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
-import org.opends.server.types.ByteSequence;
-import org.opends.server.types.DN;
-import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.Entry;
-import org.opends.server.types.IdentifiedException;
-import org.opends.server.types.ObjectClass;
-import org.opends.server.types.RDN;
-import org.opends.server.types.ResultCode;
+import org.opends.server.types.*;
 import org.opends.server.util.args.Argument;
 import org.opends.server.util.args.ArgumentException;
 
@@ -4639,7 +4601,7 @@
    * @param closeables
    *          The closeables to be closed, which may be <code>null</code>.
    */
-  public static void close(Collection<Closeable> closeables)
+  public static void close(Collection<? extends Closeable> closeables)
   {
     if (closeables == null)
     {
@@ -4655,7 +4617,10 @@
         }
         catch (IOException ignored)
         {
-          // Ignore.
+          if (debugEnabled())
+          {
+            TRACER.debugCaught(DebugLogLevel.ERROR, ignored);
+          }
         }
       }
     }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java
index f36531c..bff653e 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/DbHandlerTest.java
@@ -41,6 +41,7 @@
 import org.opends.server.replication.server.ReplServerFakeConfiguration;
 import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.replication.server.changelog.api.ReplicationIterator;
+import org.opends.server.util.StaticUtils;
 import org.testng.annotations.Test;
 
 import static org.opends.server.TestCaseUtils.*;
@@ -86,9 +87,7 @@
       testRoot = createDirectory(path);
 
       dbEnv = new ReplicationDbEnv(path, replicationServer);
-
-      handler = new DbHandler(1, TEST_ROOT_DN_STRING,
-        replicationServer, dbEnv, 5000);
+      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 5000);
 
       ChangeNumberGenerator gen = new ChangeNumberGenerator( 1, 0);
       ChangeNumber changeNumber1 = gen.newChangeNumber();
@@ -182,8 +181,7 @@
   private String getReplicationDbPath()
   {
     String buildRoot = System.getProperty(TestCaseUtils.PROPERTY_BUILD_ROOT);
-    String path =
-        System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
+    String path = System.getProperty(TestCaseUtils.PROPERTY_BUILD_DIR, buildRoot
             + File.separator + "build");
     return path + File.separator + "unit-tests" + File.separator + "dbHandler";
   }
@@ -199,43 +197,51 @@
     return testRoot;
   }
 
-  private ReplicationIterator assertFoundInOrder(DbHandler handler,
+  private void assertFoundInOrder(DbHandler handler,
       ChangeNumber... changeNumbers) throws Exception
   {
     if (changeNumbers.length == 0)
     {
-      return null;
+      return;
     }
 
     ReplicationIterator it = handler.generateIterator(changeNumbers[0]);
-    for (int i = 1; i < changeNumbers.length; i++)
+    try
     {
-      assertTrue(it.next());
-      final ChangeNumber cn = it.getChange().getChangeNumber();
-      final boolean equals = cn.compareTo(changeNumbers[i]) == 0;
-      assertTrue(equals, "Actual change number=" + cn
-          + ", Expected change number=" + changeNumbers[i]);
+      for (int i = 1; i < changeNumbers.length; i++)
+      {
+        assertTrue(it.next());
+        final ChangeNumber cn = it.getChange().getChangeNumber();
+        final boolean equals = cn.compareTo(changeNumbers[i]) == 0;
+        assertTrue(equals, "Actual change number=" + cn
+            + ", Expected change number=" + changeNumbers[i]);
+      }
+      assertFalse(it.next());
+      assertNull(it.getChange(), "Actual change number=" + it.getChange()
+          + ", Expected null");
     }
-    assertFalse(it.next());
-    assertNull(it.getChange(), "Actual change number=" + it.getChange()
-        + ", Expected null");
-
-    it.releaseCursor();
-    return it;
+    finally
+    {
+      StaticUtils.close(it);
+    }
   }
 
   private void assertNotFound(DbHandler handler, ChangeNumber changeNumber)
   {
+    ReplicationIterator iter = null;
     try
     {
-      ReplicationIterator iter = handler.generateIterator(changeNumber);
-      iter.releaseCursor();
+      iter = handler.generateIterator(changeNumber);
       fail("Expected exception");
     }
     catch (Exception e)
     {
       assertEquals(e.getLocalizedMessage(), "ChangeNumber not available");
     }
+    finally
+    {
+      StaticUtils.close(iter);
+    }
   }
 
   /**
@@ -261,10 +267,7 @@
       testRoot = createDirectory(path);
 
       dbEnv = new ReplicationDbEnv(path, replicationServer);
-
-      handler =
-        new DbHandler( 1, TEST_ROOT_DN_STRING,
-        replicationServer, dbEnv, 5000);
+      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 5000);
 
       // Creates changes added to the dbHandler
       ChangeNumberGenerator gen = new ChangeNumberGenerator( 1, 0);
@@ -365,10 +368,7 @@
 
       dbEnv = new ReplicationDbEnv(path, replicationServer);
 
-      // Create the handler
-      handler =
-        new DbHandler( 1, TEST_ROOT_DN_STRING,
-            replicationServer, dbEnv, 10);
+      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 10);
       handler.setCounterWindowSize(counterWindow);
 
       // Populate the db with 'max' msg
@@ -465,9 +465,7 @@
       debugInfo(tn,"SHUTDOWN handler and recreate");
       handler.shutdown();
 
-      handler =
-        new DbHandler( 1, TEST_ROOT_DN_STRING,
-            replicationServer, dbEnv, 10);
+      handler = new DbHandler(1, TEST_ROOT_DN_STRING, replicationServer, dbEnv, 10);
       handler.setCounterWindowSize(counterWindow);
 
       // Test first and last

--
Gitblit v1.10.0