You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2017/08/18 08:04:57 UTC

[10/20] lucenenet git commit: Lucene.Net.Replicator: Fixed member accessibility

Lucene.Net.Replicator: Fixed member accessibility


Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/73f6a4e2
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/73f6a4e2
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/73f6a4e2

Branch: refs/heads/replicator
Commit: 73f6a4e2891a42371125fe40e7bb6c9b18176456
Parents: 6788246
Author: Shad Storhaug <sh...@shadstorhaug.com>
Authored: Thu Aug 17 02:42:27 2017 +0700
Committer: Shad Storhaug <sh...@shadstorhaug.com>
Committed: Thu Aug 17 02:42:27 2017 +0700

----------------------------------------------------------------------
 .../Http/HttpClientBase.cs                      | 28 +++++-----
 .../Http/HttpReplicator.cs                      | 12 ++---
 .../Http/ReplicationService.cs                  | 10 ++--
 .../IndexAndTaxonomyReplicationHandler.cs       | 55 +++++++++++---------
 .../IndexAndTaxonomyRevision.cs                 | 52 ++++++++++--------
 .../IndexInputInputStream.cs                    |  4 +-
 .../IndexReplicationHandler.cs                  | 35 +++++++------
 src/Lucene.Net.Replicator/IndexRevision.cs      | 26 ++++-----
 src/Lucene.Net.Replicator/LocalReplicator.cs    | 30 ++++++-----
 .../PerSessionDirectoryFactory.cs               |  6 +--
 src/Lucene.Net.Replicator/ReplicationClient.cs  | 22 ++++----
 src/Lucene.Net.Replicator/RevisionFile.cs       |  2 +-
 12 files changed, 151 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/Http/HttpClientBase.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/Http/HttpClientBase.cs b/src/Lucene.Net.Replicator/Http/HttpClientBase.cs
index 8f46b98..361d0b9 100644
--- a/src/Lucene.Net.Replicator/Http/HttpClientBase.cs
+++ b/src/Lucene.Net.Replicator/Http/HttpClientBase.cs
@@ -1,12 +1,12 @@
-using System;
+using Lucene.Net.Support;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
 using System.IO;
 using System.Linq;
 using System.Net;
 using System.Net.Http;
 using System.Text;
-using Lucene.Net.Support;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
 
 namespace Lucene.Net.Replicator.Http
 {
@@ -48,8 +48,8 @@ namespace Lucene.Net.Replicator.Http
         /// </summary>
         protected string Url { get; private set; }
 
-        private readonly HttpClient httpc;
         private volatile bool isDisposed = false;
+        private readonly HttpClient httpc;
 
         /// <summary>
         /// Creates a new <see cref="HttpClientBase"/> with the given host, port and path.
@@ -106,7 +106,7 @@ namespace Lucene.Net.Replicator.Http
         /// Gets or Sets the connection timeout for this client, in milliseconds. This setting
         /// is used to modify <see cref="HttpClient.Timeout"/>.
         /// </summary>
-        public int ConnectionTimeout
+        public virtual int ConnectionTimeout
         {
             get { return (int)httpc.Timeout.TotalMilliseconds; }
             set { httpc.Timeout = TimeSpan.FromMilliseconds(value); }
@@ -139,7 +139,7 @@ namespace Lucene.Net.Replicator.Http
         /// </summary>
         /// <exception cref="IOException">IO Error happened at the server, check inner exception for details.</exception>
         /// <exception cref="HttpRequestException">Unknown error received from the server.</exception>
-        protected void VerifyStatus(HttpResponseMessage response)
+        protected virtual void VerifyStatus(HttpResponseMessage response)
         {
             if (!response.IsSuccessStatusCode)
             {
@@ -152,7 +152,7 @@ namespace Lucene.Net.Replicator.Http
         /// </summary>
         /// <exception cref="IOException">IO Error happened at the server, check inner exception for details.</exception>
         /// <exception cref="HttpRequestException">Unknown error received from the server.</exception>
-        protected void ThrowKnownError(HttpResponseMessage response)
+        protected virtual void ThrowKnownError(HttpResponseMessage response)
         {
             Stream input;
             try
@@ -199,7 +199,7 @@ namespace Lucene.Net.Replicator.Http
         /// <b>Internal:</b> Execute a request and return its result.
         /// The <paramref name="parameters"/> argument is treated as: name1,value1,name2,value2,...
         /// </summary>
-        protected HttpResponseMessage ExecutePost(string request, object entity, params string[] parameters)
+        protected virtual HttpResponseMessage ExecutePost(string request, object entity, params string[] parameters)
         {
             EnsureOpen();
             //.NET Note: No headers? No ContentType?... Bad use of Http?
@@ -219,7 +219,7 @@ namespace Lucene.Net.Replicator.Http
         /// <b>Internal:</b> Execute a request and return its result.
         /// The <paramref name="parameters"/> argument is treated as: name1,value1,name2,value2,...
         /// </summary>
-        protected HttpResponseMessage ExecuteGet(string request, params string[] parameters)
+        protected virtual HttpResponseMessage ExecuteGet(string request, params string[] parameters)
         {
             EnsureOpen();
             //Note: No headers? No ContentType?... Bad use of Http?
@@ -243,7 +243,7 @@ namespace Lucene.Net.Replicator.Http
         /// Internal utility: input stream of the provided response.
         /// </summary>
         /// <exception cref="IOException"></exception>
-        public Stream ResponseInputStream(HttpResponseMessage response)
+        public virtual Stream ResponseInputStream(HttpResponseMessage response)
         {
             return ResponseInputStream(response, false);
         }
@@ -254,7 +254,7 @@ namespace Lucene.Net.Replicator.Http
         /// consumes the response's resources when the input stream is exhausted.
         /// </summary>
         /// <exception cref="IOException"></exception>
-        public Stream ResponseInputStream(HttpResponseMessage response, bool consume)
+        public virtual Stream ResponseInputStream(HttpResponseMessage response, bool consume)
         {
             return response.Content.ReadAsStreamAsync().ConfigureAwait(false).GetAwaiter().GetResult();
         }
@@ -269,7 +269,7 @@ namespace Lucene.Net.Replicator.Http
         /// <summary>
         /// Calls the overload <see cref="DoAction{T}(HttpResponseMessage, bool, Func{T})"/> passing <c>true</c> to consume.
         /// </summary>
-        protected T DoAction<T>(HttpResponseMessage response, Func<T> call)
+        protected virtual T DoAction<T>(HttpResponseMessage response, Func<T> call)
         {
             return DoAction(response, true, call);
         }
@@ -279,7 +279,7 @@ namespace Lucene.Net.Replicator.Http
         /// and if not, attempt to extract the actual server side exception. Optionally
         /// release the response at exit, depending on <paramref name="consume"/> parameter.
         /// </summary>
-        protected T DoAction<T>(HttpResponseMessage response, bool consume, Func<T> call)
+        protected virtual T DoAction<T>(HttpResponseMessage response, bool consume, Func<T> call)
         {
             Exception error = new NotImplementedException();
             try

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/Http/HttpReplicator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/Http/HttpReplicator.cs b/src/Lucene.Net.Replicator/Http/HttpReplicator.cs
index 052450a..860ef54 100644
--- a/src/Lucene.Net.Replicator/Http/HttpReplicator.cs
+++ b/src/Lucene.Net.Replicator/Http/HttpReplicator.cs
@@ -1,7 +1,7 @@
-using System;
+using Lucene.Net.Support.IO;
+using System;
 using System.IO;
 using System.Net.Http;
-using Lucene.Net.Support.IO;
 
 namespace Lucene.Net.Replicator.Http
 {
@@ -62,7 +62,7 @@ namespace Lucene.Net.Replicator.Http
         /// <summary>
         /// Checks for updates at the remote host.
         /// </summary>
-        public SessionToken CheckForUpdate(string currentVersion)
+        public virtual SessionToken CheckForUpdate(string currentVersion)
         {
             string[] parameters = null;
             if (currentVersion != null)
@@ -81,7 +81,7 @@ namespace Lucene.Net.Replicator.Http
         /// <summary>
         /// Obtains the given file from it's source at the remote host.
         /// </summary>
-        public Stream ObtainFile(string sessionId, string source, string fileName)
+        public virtual Stream ObtainFile(string sessionId, string source, string fileName)
         {
             HttpResponseMessage response = ExecuteGet(ReplicationService.ReplicationAction.OBTAIN.ToString(),
                 ReplicationService.REPLICATE_SESSION_ID_PARAM, sessionId,
@@ -94,7 +94,7 @@ namespace Lucene.Net.Replicator.Http
         /// Not supported.
         /// </summary>
         /// <exception cref="NotSupportedException">this replicator implementation does not support remote publishing of revisions</exception>
-        public void Publish(IRevision revision)
+        public virtual void Publish(IRevision revision)
         {
             throw new NotSupportedException("this replicator implementation does not support remote publishing of revisions");
         }
@@ -102,7 +102,7 @@ namespace Lucene.Net.Replicator.Http
         /// <summary>
         /// Releases a session obtained from the remote host.
         /// </summary>
-        public void Release(string sessionId)
+        public virtual void Release(string sessionId)
         {
             HttpResponseMessage response = ExecuteGet(ReplicationService.ReplicationAction.RELEASE.ToString(), ReplicationService.REPLICATE_SESSION_ID_PARAM, sessionId);
             // do not remove this call: as it is still validating for us!

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/Http/ReplicationService.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/Http/ReplicationService.cs b/src/Lucene.Net.Replicator/Http/ReplicationService.cs
index 95c8b50..9290683 100644
--- a/src/Lucene.Net.Replicator/Http/ReplicationService.cs
+++ b/src/Lucene.Net.Replicator/Http/ReplicationService.cs
@@ -1,9 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using Lucene.Net.Replicator.Http.Abstractions;
+using Lucene.Net.Replicator.Http.Abstractions;
 using Lucene.Net.Support.IO;
 using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.IO;
 
 namespace Lucene.Net.Replicator.Http
 {
@@ -130,7 +130,7 @@ namespace Lucene.Net.Replicator.Http
         /// Executes the replication task.
         /// </summary>
         /// <exception cref="InvalidOperationException">required parameters are missing</exception>
-        public void Perform(IReplicationRequest request, IReplicationResponse response)
+        public virtual void Perform(IReplicationRequest request, IReplicationResponse response)
         {
             string[] pathElements = GetPathElements(request);
             if (pathElements.Length != 2)

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/IndexAndTaxonomyReplicationHandler.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/IndexAndTaxonomyReplicationHandler.cs b/src/Lucene.Net.Replicator/IndexAndTaxonomyReplicationHandler.cs
index d6a3ce0..80d6432 100644
--- a/src/Lucene.Net.Replicator/IndexAndTaxonomyReplicationHandler.cs
+++ b/src/Lucene.Net.Replicator/IndexAndTaxonomyReplicationHandler.cs
@@ -1,10 +1,10 @@
-using System;
+using Lucene.Net.Index;
+using Lucene.Net.Store;
+using Lucene.Net.Util;
+using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using Lucene.Net.Index;
-using Lucene.Net.Store;
-using Lucene.Net.Util;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -53,19 +53,9 @@ namespace Lucene.Net.Replicator
         private readonly Directory taxonomyDirectory;
         private readonly Func<bool?> callback;
 
-        private InfoStream infoStream = InfoStream.Default;
-
-        public string CurrentVersion { get; private set; }
-        public IDictionary<string, IList<RevisionFile>> CurrentRevisionFiles { get; private set; }
-
-        /// <summary>
-        /// Gets or sets the <see cref="Util.InfoStream"/> to use for logging messages.
-        /// </summary>
-        public InfoStream InfoStream
-        {
-            get { return infoStream; }
-            set { infoStream = value ?? InfoStream.NO_OUTPUT; }
-        }
+        private volatile IDictionary<string, IList<RevisionFile>> currentRevisionFiles;
+        private volatile string currentVersion;
+        private volatile InfoStream infoStream = InfoStream.Default;
 
         /// <summary>
         /// Constructor with the given index directory and callback to notify when the indexes were updated.
@@ -77,8 +67,8 @@ namespace Lucene.Net.Replicator
             this.taxonomyDirectory = taxonomyDirectory;
             this.callback = callback;
 
-            CurrentVersion = null;
-            CurrentRevisionFiles = null;
+            currentVersion = null;
+            currentRevisionFiles = null;
 
             bool indexExists = DirectoryReader.IndexExists(indexDirectory);
             bool taxonomyExists = DirectoryReader.IndexExists(taxonomyDirectory);
@@ -91,16 +81,19 @@ namespace Lucene.Net.Replicator
                 IndexCommit indexCommit = IndexReplicationHandler.GetLastCommit(indexDirectory);
                 IndexCommit taxonomyCommit = IndexReplicationHandler.GetLastCommit(taxonomyDirectory);
 
-                CurrentRevisionFiles = IndexAndTaxonomyRevision.RevisionFiles(indexCommit, taxonomyCommit);
-                CurrentVersion = IndexAndTaxonomyRevision.RevisionVersion(indexCommit, taxonomyCommit);
+                currentRevisionFiles = IndexAndTaxonomyRevision.RevisionFiles(indexCommit, taxonomyCommit);
+                currentVersion = IndexAndTaxonomyRevision.RevisionVersion(indexCommit, taxonomyCommit);
 
                 WriteToInfoStream(
-                    string.Format("constructor(): currentVersion={0} currentRevisionFiles={1}", CurrentVersion, CurrentRevisionFiles),
+                    string.Format("constructor(): currentVersion={0} currentRevisionFiles={1}", currentVersion, currentRevisionFiles),
                     string.Format("constructor(): indexCommit={0} taxoCommit={1}", indexCommit, taxonomyCommit));
             }
         }
 
-        public void RevisionReady(string version,
+        public virtual string CurrentVersion { get { return currentVersion; } }
+        public virtual IDictionary<string, IList<RevisionFile>> CurrentRevisionFiles { get { return currentRevisionFiles; } }
+
+        public virtual void RevisionReady(string version,
             IDictionary<string, IList<RevisionFile>> revisionFiles,
             IDictionary<string, IList<string>> copiedFiles,
             IDictionary<string, Directory> sourceDirectory)
@@ -148,10 +141,10 @@ namespace Lucene.Net.Replicator
             }
 
             // all files have been successfully copied + sync'd. update the handler's state
-            CurrentRevisionFiles = revisionFiles;
-            CurrentVersion = version;
+            currentRevisionFiles = revisionFiles;
+            currentVersion = version;
             
-            WriteToInfoStream("revisionReady(): currentVersion=" + CurrentVersion + " currentRevisionFiles=" + CurrentRevisionFiles);
+            WriteToInfoStream("revisionReady(): currentVersion=" + currentVersion + " currentRevisionFiles=" + currentRevisionFiles);
             
             // update the segments.gen file
             IndexReplicationHandler.WriteSegmentsGen(taxonomySegmentsFile, taxonomyDirectory);
@@ -176,6 +169,7 @@ namespace Lucene.Net.Replicator
             } 
         }
 
+        // LUCENENET specific utility method
         private void WriteToInfoStream(params string[] messages)
         {
             if (!InfoStream.IsEnabled(INFO_STREAM_COMPONENT))
@@ -184,5 +178,14 @@ namespace Lucene.Net.Replicator
             foreach (string message in messages)
                 InfoStream.Message(INFO_STREAM_COMPONENT, message);
         }
+
+        /// <summary>
+        /// Gets or sets the <see cref="Util.InfoStream"/> to use for logging messages.
+        /// </summary>
+        public virtual InfoStream InfoStream
+        {
+            get { return infoStream; }
+            set { infoStream = value ?? InfoStream.NO_OUTPUT; }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/IndexAndTaxonomyRevision.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/IndexAndTaxonomyRevision.cs b/src/Lucene.Net.Replicator/IndexAndTaxonomyRevision.cs
index 63040b0..e501a58 100644
--- a/src/Lucene.Net.Replicator/IndexAndTaxonomyRevision.cs
+++ b/src/Lucene.Net.Replicator/IndexAndTaxonomyRevision.cs
@@ -1,13 +1,13 @@
-using System;
+using Lucene.Net.Facet.Taxonomy.Directory;
+using Lucene.Net.Facet.Taxonomy.WriterCache;
+using Lucene.Net.Index;
+using Lucene.Net.Store;
+using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Globalization;
 using System.IO;
 using System.Linq;
-using Lucene.Net.Facet.Taxonomy.Directory;
-using Lucene.Net.Facet.Taxonomy.WriterCache;
-using Lucene.Net.Index;
-using Lucene.Net.Store;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -48,14 +48,8 @@ namespace Lucene.Net.Replicator
         /// </summary>
         public class SnapshotDirectoryTaxonomyWriter : DirectoryTaxonomyWriter
         {
-            /// <summary>
-            /// Gets the <see cref="SnapshotDeletionPolicy"/> used by the underlying <see cref="Index.IndexWriter"/>.
-            /// </summary>
-            public SnapshotDeletionPolicy DeletionPolicy { get; private set; }
-            /// <summary>
-            /// Gets the <see cref="Index.IndexWriter"/> used by this <see cref="DirectoryTaxonomyWriter"/>.
-            /// </summary>
-            public IndexWriter IndexWriter { get; private set; }
+            private SnapshotDeletionPolicy sdp;
+            private IndexWriter writer;
 
             /// <summary>
             /// <see cref="DirectoryTaxonomyWriter(Directory, OpenMode, ITaxonomyWriterCache)"/>
@@ -78,14 +72,24 @@ namespace Lucene.Net.Replicator
             protected override IndexWriterConfig CreateIndexWriterConfig(OpenMode openMode)
             {
                 IndexWriterConfig conf = base.CreateIndexWriterConfig(openMode);
-                conf.IndexDeletionPolicy = DeletionPolicy = new SnapshotDeletionPolicy(conf.IndexDeletionPolicy);
+                conf.IndexDeletionPolicy = sdp = new SnapshotDeletionPolicy(conf.IndexDeletionPolicy);
                 return conf;
             }
 
             protected override IndexWriter OpenIndexWriter(Directory directory, IndexWriterConfig config)
             {
-                return IndexWriter = base.OpenIndexWriter(directory, config);
+                return writer = base.OpenIndexWriter(directory, config);
             }
+
+            /// <summary>
+            /// Gets the <see cref="SnapshotDeletionPolicy"/> used by the underlying <see cref="Index.IndexWriter"/>.
+            /// </summary>
+            public virtual SnapshotDeletionPolicy DeletionPolicy { get { return sdp; } }
+
+            /// <summary>
+            /// Gets the <see cref="Index.IndexWriter"/> used by this <see cref="DirectoryTaxonomyWriter"/>.
+            /// </summary>
+            public virtual IndexWriter IndexWriter { get { return writer; } }
         }
 
         public const string INDEX_SOURCE = "index";
@@ -95,6 +99,8 @@ namespace Lucene.Net.Replicator
         private readonly SnapshotDirectoryTaxonomyWriter taxonomyWriter;
         private readonly IndexCommit indexCommit, taxonomyCommit;
         private readonly SnapshotDeletionPolicy indexSdp, taxonomySdp;
+        private readonly string version;
+        private readonly IDictionary<string, IList<RevisionFile>> sourceFiles;
 
         /// <summary>
         /// Returns a map of the revision files from the given <see cref="IndexCommit"/>s of the search and taxonomy indexes.
@@ -136,14 +142,14 @@ namespace Lucene.Net.Replicator
             this.taxonomySdp = taxonomyWriter.DeletionPolicy;
             this.indexCommit = indexSdp.Snapshot();
             this.taxonomyCommit = taxonomySdp.Snapshot();
-            this.Version = RevisionVersion(indexCommit, taxonomyCommit);
-            this.SourceFiles = RevisionFiles(indexCommit, taxonomyCommit);
+            this.version = RevisionVersion(indexCommit, taxonomyCommit);
+            this.sourceFiles = RevisionFiles(indexCommit, taxonomyCommit);
         }
 
         /// <summary>
         /// Compares this <see cref="IndexAndTaxonomyRevision"/> to the given <see cref="version"/>.
         /// </summary>
-        public int CompareTo(string version)
+        public virtual int CompareTo(string version)
         {
             string[] parts = version.Split(':');
             long indexGen = long.Parse(parts[0], NumberStyles.HexNumber);
@@ -160,7 +166,7 @@ namespace Lucene.Net.Replicator
             return taxonomyCommitGen < taxonomyGen ? -1 : (taxonomyCommitGen > taxonomyGen ? 1 : 0);
         }
 
-        public int CompareTo(IRevision other)
+        public virtual int CompareTo(IRevision other)
         {
             if (other == null)
                 throw new ArgumentNullException("other");
@@ -173,12 +179,12 @@ namespace Lucene.Net.Replicator
             return cmp != 0 ? cmp : taxonomyCommit.CompareTo(itr.taxonomyCommit);
         }
 
-        public string Version { get; private set; }
+        public virtual string Version { get { return version; } }
 
-        public IDictionary<string, IList<RevisionFile>> SourceFiles { get; private set; }
+        public virtual IDictionary<string, IList<RevisionFile>> SourceFiles { get { return sourceFiles; } }
 
         /// <exception cref="IOException"></exception>
-        public Stream Open(string source, string fileName)
+        public virtual Stream Open(string source, string fileName)
         {
             Debug.Assert(source.Equals(INDEX_SOURCE) || source.Equals(TAXONOMY_SOURCE), string.Format("invalid source; expected=({0} or {1}) got={2}", INDEX_SOURCE, TAXONOMY_SOURCE, source));
             IndexCommit commit = source.Equals(INDEX_SOURCE) ? indexCommit : taxonomyCommit;
@@ -186,7 +192,7 @@ namespace Lucene.Net.Replicator
         }
 
         /// <exception cref="IOException"></exception>
-        public void Release()
+        public virtual void Release()
         {
             try
             {

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/IndexInputInputStream.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/IndexInputInputStream.cs b/src/Lucene.Net.Replicator/IndexInputInputStream.cs
index df72010..d6af827 100644
--- a/src/Lucene.Net.Replicator/IndexInputInputStream.cs
+++ b/src/Lucene.Net.Replicator/IndexInputInputStream.cs
@@ -1,6 +1,6 @@
-using System;
+using Lucene.Net.Store;
+using System;
 using System.IO;
-using Lucene.Net.Store;
 
 namespace Lucene.Net.Replicator
 {

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/IndexReplicationHandler.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/IndexReplicationHandler.cs b/src/Lucene.Net.Replicator/IndexReplicationHandler.cs
index 5189e44..99d3445 100644
--- a/src/Lucene.Net.Replicator/IndexReplicationHandler.cs
+++ b/src/Lucene.Net.Replicator/IndexReplicationHandler.cs
@@ -1,11 +1,11 @@
+using Lucene.Net.Index;
+using Lucene.Net.Store;
+using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
-using Lucene.Net.Index;
-using Lucene.Net.Store;
-using Lucene.Net.Util;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -57,7 +57,10 @@ namespace Lucene.Net.Replicator
 
         private readonly Directory indexDirectory;
         private readonly Func<bool?> callback;
-        private InfoStream infoStream;
+
+        private volatile IDictionary<string, IList<RevisionFile>> currentRevisionFiles;
+        private volatile string currentVersion;
+        private volatile InfoStream infoStream;
 
         //Note: LUCENENET Specific Utility Method
         private void WriteToInfoStream(params string[] messages)
@@ -236,28 +239,28 @@ namespace Lucene.Net.Replicator
             this.callback = callback;
             this.indexDirectory = indexDirectory;
 
-            CurrentVersion = null;
-            CurrentRevisionFiles = null;
+            currentVersion = null;
+            currentRevisionFiles = null;
 
             if (DirectoryReader.IndexExists(indexDirectory))
             {
                 IList<IndexCommit> commits = DirectoryReader.ListCommits(indexDirectory);
                 IndexCommit commit = commits.Last();
 
-                CurrentVersion = IndexRevision.RevisionVersion(commit);
-                CurrentRevisionFiles = IndexRevision.RevisionFiles(commit);
+                currentVersion = IndexRevision.RevisionVersion(commit);
+                currentRevisionFiles = IndexRevision.RevisionFiles(commit);
 
                 WriteToInfoStream(
-                    string.Format("constructor(): currentVersion={0} currentRevisionFiles={1}", CurrentVersion, CurrentRevisionFiles),
+                    string.Format("constructor(): currentVersion={0} currentRevisionFiles={1}", currentVersion, currentRevisionFiles),
                     string.Format("constructor(): commit={0}", commit));
             }
         }
 
-        public string CurrentVersion { get; private set; }
+        public virtual string CurrentVersion { get { return currentVersion; } }
 
-        public IDictionary<string, IList<RevisionFile>> CurrentRevisionFiles { get; private set; }
+        public virtual IDictionary<string, IList<RevisionFile>> CurrentRevisionFiles { get { return currentRevisionFiles; } }
 
-        public void RevisionReady(string version,
+        public virtual void RevisionReady(string version,
             IDictionary<string, IList<RevisionFile>> revisionFiles,
             IDictionary<string, IList<string>> copiedFiles,
             IDictionary<string, Directory> sourceDirectory)
@@ -293,10 +296,10 @@ namespace Lucene.Net.Replicator
             }
 
             // all files have been successfully copied + sync'd. update the handler's state
-            CurrentRevisionFiles = revisionFiles;
-            CurrentVersion = version;
+            currentRevisionFiles = revisionFiles;
+            currentVersion = version;
 
-            WriteToInfoStream(string.Format("revisionReady(): currentVersion={0} currentRevisionFiles={1}", CurrentVersion, CurrentRevisionFiles));
+            WriteToInfoStream(string.Format("revisionReady(): currentVersion={0} currentRevisionFiles={1}", currentVersion, currentRevisionFiles));
 
             // update the segments.gen file
             WriteSegmentsGen(segmentsFile, indexDirectory);
@@ -326,7 +329,7 @@ namespace Lucene.Net.Replicator
         /// <summary>
         /// Gets or sets the <see cref="Util.InfoStream"/> to use for logging messages.
         /// </summary>
-        public InfoStream InfoStream
+        public virtual InfoStream InfoStream
         {
             get { return infoStream; }
             set { infoStream = value ?? InfoStream.NO_OUTPUT; }

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/IndexRevision.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/IndexRevision.cs b/src/Lucene.Net.Replicator/IndexRevision.cs
index 29ea77c..092fc3e 100644
--- a/src/Lucene.Net.Replicator/IndexRevision.cs
+++ b/src/Lucene.Net.Replicator/IndexRevision.cs
@@ -1,11 +1,11 @@
+using Lucene.Net.Index;
+using Lucene.Net.Store;
 using System;
-using System.IO;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Globalization;
+using System.IO;
 using System.Linq;
-using Lucene.Net.Index;
-using Lucene.Net.Store;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -50,8 +50,8 @@ namespace Lucene.Net.Replicator
         private readonly IndexWriter writer;
         private readonly IndexCommit commit;
         private readonly SnapshotDeletionPolicy sdp;
-
-        public IDictionary<string, IList<RevisionFile>> SourceFiles { get; private set; }
+        private readonly string version;
+        private readonly IDictionary<string, IList<RevisionFile>> sourceFiles;
 
         // returns a RevisionFile with some metadata
         private static RevisionFile CreateRevisionFile(string fileName, Directory directory)
@@ -98,11 +98,11 @@ namespace Lucene.Net.Replicator
 
             this.writer = writer;
             this.commit = sdp.Snapshot();
-            this.Version = RevisionVersion(commit);
-            this.SourceFiles = RevisionFiles(commit);
+            this.version = RevisionVersion(commit);
+            this.sourceFiles = RevisionFiles(commit);
         }
 
-        public int CompareTo(string version)
+        public virtual int CompareTo(string version)
         {
             long gen = long.Parse(version, NumberStyles.HexNumber);
             long commitGen = commit.Generation;
@@ -110,7 +110,7 @@ namespace Lucene.Net.Replicator
             return commitGen < gen ? -1 : (commitGen > gen ? 1 : 0);
         }
 
-        public int CompareTo(IRevision other)
+        public virtual int CompareTo(IRevision other)
         {
             //TODO: This breaks the contract and will fail if called with a different implementation
             //      This is a flaw inherited from the original source...
@@ -119,15 +119,17 @@ namespace Lucene.Net.Replicator
             return commit.CompareTo(or.commit);
         }
 
-        public string Version { get; private set; }
+        public virtual string Version { get { return version; } }
+
+        public virtual IDictionary<string, IList<RevisionFile>> SourceFiles { get { return sourceFiles; } }
 
-        public Stream Open(string source, string fileName)
+        public virtual Stream Open(string source, string fileName)
         {
             Debug.Assert(source.Equals(SOURCE), string.Format("invalid source; expected={0} got={1}", SOURCE, source));
             return new IndexInputStream(commit.Directory.OpenInput(fileName, IOContext.READ_ONCE));
         }
 
-        public void Release()
+        public virtual void Release()
         {
             sdp.Release(commit);
             writer.DeleteUnusedFiles();

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/LocalReplicator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/LocalReplicator.cs b/src/Lucene.Net.Replicator/LocalReplicator.cs
index 981eecb..349a088 100644
--- a/src/Lucene.Net.Replicator/LocalReplicator.cs
+++ b/src/Lucene.Net.Replicator/LocalReplicator.cs
@@ -55,7 +55,7 @@ namespace Lucene.Net.Replicator
 
             /// <summary/>
             /// <exception cref="InvalidOperationException"></exception>
-            public void DecRef()
+            public virtual void DecRef()
             {
                 if (refCount.Get() <= 0)
                 {
@@ -86,7 +86,7 @@ namespace Lucene.Net.Replicator
                 }
             }
 
-            public void IncRef()
+            public virtual void IncRef()
             {
                 refCount.IncrementAndGet();
             }
@@ -106,12 +106,12 @@ namespace Lucene.Net.Replicator
                 lastAccessTime = Stopwatch.GetTimestamp();
             }
 
-            public bool IsExpired(long expirationThreshold)
+            public virtual bool IsExpired(long expirationThreshold)
             {
                 return lastAccessTime < Stopwatch.GetTimestamp() - expirationThreshold * Stopwatch.Frequency / 1000; // LUCENENET TODO: CurrentTimeMilliseconds()
             }
 
-            public void MarkAccessed()
+            public virtual void MarkAccessed()
             {
                 lastAccessTime = Stopwatch.GetTimestamp(); // LUCENENET TODO: CurrentTimeMilliseconds()
             }
@@ -169,7 +169,7 @@ namespace Lucene.Net.Replicator
             }
         }
 
-        public SessionToken CheckForUpdate(string currentVersion)
+        public virtual SessionToken CheckForUpdate(string currentVersion)
         {
             lock (padlock)
             {
@@ -190,9 +190,9 @@ namespace Lucene.Net.Replicator
             }
         }
 
-        public void Dispose() // LUCENENET TODO: API Dispose pattern
+        protected virtual void Dispose(bool disposing)
         {
-            if (disposed)
+            if (disposed || !disposing)
                 return;
 
             lock (padlock)
@@ -204,14 +204,20 @@ namespace Lucene.Net.Replicator
             disposed = true;
         }
 
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
         /// <summary>
-        /// Gets or sets the expiration threshold.
+        /// Gets or sets the expiration threshold in milliseconds.
         /// <para/>
         /// If a replication session is inactive this
         /// long it is automatically expired, and further attempts to operate within
         /// this session will throw a <see cref="SessionExpiredException"/>.
         /// </summary>
-        public long ExpirationThreshold
+        public virtual long ExpirationThreshold
         {
             get { return expirationThreshold; }
             set
@@ -225,7 +231,7 @@ namespace Lucene.Net.Replicator
             }
         }
 
-        public Stream ObtainFile(string sessionId, string source, string fileName)
+        public virtual Stream ObtainFile(string sessionId, string source, string fileName)
         {
             lock (padlock)
             {
@@ -247,7 +253,7 @@ namespace Lucene.Net.Replicator
             }
         }
 
-        public void Publish(IRevision revision)
+        public virtual void Publish(IRevision revision)
         {
             lock (padlock)
             {
@@ -280,7 +286,7 @@ namespace Lucene.Net.Replicator
         }
 
         /// <exception cref="InvalidOperationException"></exception>
-        public void Release(string sessionId)
+        public virtual void Release(string sessionId)
         {
             lock (padlock)
             {

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/PerSessionDirectoryFactory.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/PerSessionDirectoryFactory.cs b/src/Lucene.Net.Replicator/PerSessionDirectoryFactory.cs
index 3661f71..d16ea4e 100644
--- a/src/Lucene.Net.Replicator/PerSessionDirectoryFactory.cs
+++ b/src/Lucene.Net.Replicator/PerSessionDirectoryFactory.cs
@@ -1,6 +1,6 @@
+using Lucene.Net.Store;
 using System;
 using System.IO;
-using Lucene.Net.Store;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -40,14 +40,14 @@ namespace Lucene.Net.Replicator
             this.workingDirectory = workingDirectory;
         }
 
-        public Directory GetDirectory(string sessionId, string source)
+        public virtual Directory GetDirectory(string sessionId, string source)
         {
             string sourceDirectory = Path.Combine(workingDirectory, sessionId, source);
             System.IO.Directory.CreateDirectory(sourceDirectory);
             return FSDirectory.Open(sourceDirectory);
         }
 
-        public void CleanupSession(string sessionId)
+        public virtual void CleanupSession(string sessionId)
         {
             if (string.IsNullOrEmpty(sessionId)) throw new ArgumentException("sessionID cannot be empty", "sessionId");
 

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/ReplicationClient.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/ReplicationClient.cs b/src/Lucene.Net.Replicator/ReplicationClient.cs
index 6064856..7388093 100644
--- a/src/Lucene.Net.Replicator/ReplicationClient.cs
+++ b/src/Lucene.Net.Replicator/ReplicationClient.cs
@@ -1,3 +1,6 @@
+using Lucene.Net.Store;
+using Lucene.Net.Support.Threading;
+using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
@@ -5,9 +8,6 @@ using System.Diagnostics;
 using System.IO;
 using System.Linq;
 using System.Threading;
-using Lucene.Net.Store;
-using Lucene.Net.Support.Threading;
-using Lucene.Net.Util;
 using Directory = Lucene.Net.Store.Directory;
 
 namespace Lucene.Net.Replicator
@@ -314,7 +314,7 @@ namespace Lucene.Net.Replicator
         }
 
         /// <summary>Throws <see cref="ObjectDisposedException"/> if the client has already been disposed.</summary>
-        protected virtual void EnsureOpen()
+        protected void EnsureOpen()
         {
             if (!disposed)
                 return;
@@ -350,7 +350,7 @@ namespace Lucene.Net.Replicator
         /// Returns the files required for replication. By default, this method returns
         /// all files that exist in the new revision, but not in the handler.
         /// </summary>
-        private IDictionary<string, IList<RevisionFile>> RequiredFiles(IDictionary<string, IList<RevisionFile>> newRevisionFiles)
+        protected virtual IDictionary<string, IList<RevisionFile>> RequiredFiles(IDictionary<string, IList<RevisionFile>> newRevisionFiles)
         {
             IDictionary<string, IList<RevisionFile>> handlerRevisionFiles = handler.CurrentRevisionFiles;
             if (handlerRevisionFiles == null)
@@ -375,7 +375,7 @@ namespace Lucene.Net.Replicator
 
         protected virtual void Dispose(bool disposing)
         {
-            if (disposed)
+            if (disposed || !disposing)
                 return;
 
             StopUpdateThread();
@@ -395,7 +395,7 @@ namespace Lucene.Net.Replicator
         /// will be set.
         /// </summary>
         /// <exception cref="InvalidOperationException"> if the thread has already been started </exception>
-        public void StartUpdateThread(long intervalMillis, string threadName)
+        public virtual void StartUpdateThread(long intervalMillis, string threadName)
         {
             EnsureOpen();
             if (updateThread != null && updateThread.IsAlive)
@@ -412,7 +412,7 @@ namespace Lucene.Net.Replicator
         /// Stop the update thread. If the update thread is not running, silently does
         /// nothing. This method returns after the update thread has stopped.
         /// </summary>
-        public void StopUpdateThread()
+        public virtual void StopUpdateThread()
         {
             // this will trigger the thread to terminate if it awaits the lock.
             // otherwise, if it's in the middle of replication, we wait for it to
@@ -429,7 +429,7 @@ namespace Lucene.Net.Replicator
         /// caused it to terminate (i.e. <see cref="HandleUpdateException"/>
         /// threw the exception further).
         /// </summary>
-        public bool IsUpdateThreadAlive
+        public virtual bool IsUpdateThreadAlive
         {
             get { return updateThread != null && updateThread.IsAlive; }
         }
@@ -446,7 +446,7 @@ namespace Lucene.Net.Replicator
         /// is running or not.
         /// </summary>
         /// <exception cref="IOException"></exception>
-        public void UpdateNow() 
+        public virtual void UpdateNow() 
         {
             EnsureOpen();
             if (updateThread != null)
@@ -472,7 +472,7 @@ namespace Lucene.Net.Replicator
         /// <summary> 
         /// Gets or sets the <see cref="Util.InfoStream"/> to use for logging messages. 
         /// </summary>
-        public InfoStream InfoStream
+        public virtual InfoStream InfoStream
         {
             get { return infoStream; }
             set { infoStream = value ?? InfoStream.NO_OUTPUT; }

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/73f6a4e2/src/Lucene.Net.Replicator/RevisionFile.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Replicator/RevisionFile.cs b/src/Lucene.Net.Replicator/RevisionFile.cs
index c74f057..0fa897f 100644
--- a/src/Lucene.Net.Replicator/RevisionFile.cs
+++ b/src/Lucene.Net.Replicator/RevisionFile.cs
@@ -60,7 +60,7 @@ namespace Lucene.Net.Replicator
         }
 
         // LUCENENET specific Equals overload
-        public bool Equals(RevisionFile other)
+        public virtual bool Equals(RevisionFile other)
         {
             if (ReferenceEquals(null, other)) return false;
             if (ReferenceEquals(this, other)) return true;