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 2022/11/07 13:07:01 UTC

[lucenenet] branch master updated: BREAKING: Lucene.Net.Index.IndexReader: De-nested IReaderClosedListener and renamed to IReaderDisposedListener.

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git


The following commit(s) were added to refs/heads/master by this push:
     new 3a1ced448 BREAKING: Lucene.Net.Index.IndexReader: De-nested IReaderClosedListener and renamed to IReaderDisposedListener.
3a1ced448 is described below

commit 3a1ced448ed9e14264ec3b6af1cd093c28070287
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Mon Nov 7 19:06:55 2022 +0700

    BREAKING: Lucene.Net.Index.IndexReader: De-nested IReaderClosedListener and renamed to IReaderDisposedListener.
---
 .../Util/LuceneTestCase.cs                         |  6 +-
 src/Lucene.Net.Tests/Index/TestDirectoryReader.cs  | 10 +--
 src/Lucene.Net.Tests/Index/TestIndexReaderClose.cs | 16 ++---
 .../Index/TestParallelCompositeReader.cs           | 13 ++--
 src/Lucene.Net.Tests/Support/TestIDisposable.cs    |  4 +-
 src/Lucene.Net/Index/IndexReader.cs                | 66 ++++++++++--------
 src/Lucene.Net/Search/FieldCacheImpl.cs            | 10 +--
 src/Lucene.Net/Support/ObsoleteAPI/IndexReader.cs  | 79 ++++++++++++++++++++++
 8 files changed, 145 insertions(+), 59 deletions(-)

diff --git a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
index c8e92fa14..7992e19dd 100644
--- a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
@@ -2018,7 +2018,7 @@ namespace Lucene.Net.Util
                     {
                         Console.WriteLine("NOTE: newSearcher using ExecutorService with " + threads + " threads");
                     }
-                    r.AddReaderClosedListener(new ReaderClosedListenerAnonymousClass(ex));
+                    r.AddReaderDisposedListener(new ReaderClosedListenerAnonymousClass(ex));
                 }
                 IndexSearcher ret;
                 if (wrapWithAssertions)
@@ -3171,7 +3171,7 @@ namespace Lucene.Net.Util
             return Random.NextGaussian();
         }
 
-        private sealed class ReaderClosedListenerAnonymousClass : IndexReader.IReaderClosedListener
+        private sealed class ReaderClosedListenerAnonymousClass : IReaderDisposedListener
         {
             private readonly LimitedConcurrencyLevelTaskScheduler ex;
 
@@ -3180,7 +3180,7 @@ namespace Lucene.Net.Util
                 this.ex = ex;
             }
 
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 ex?.Shutdown();
                 //TestUtil.ShutdownExecutorService(ex);
diff --git a/src/Lucene.Net.Tests/Index/TestDirectoryReader.cs b/src/Lucene.Net.Tests/Index/TestDirectoryReader.cs
index 856abc0bf..42ade8a9e 100644
--- a/src/Lucene.Net.Tests/Index/TestDirectoryReader.cs
+++ b/src/Lucene.Net.Tests/Index/TestDirectoryReader.cs
@@ -1089,9 +1089,9 @@ namespace Lucene.Net.Index
             writer.Commit();
             DirectoryReader reader = writer.GetReader();
             int[] closeCount = new int[1];
-            IndexReader.IReaderClosedListener listener = new ReaderClosedListenerAnonymousClass(this, reader, closeCount);
+            IReaderDisposedListener listener = new ReaderClosedListenerAnonymousClass(this, reader, closeCount);
 
-            reader.AddReaderClosedListener(listener);
+            reader.AddReaderDisposedListener(listener);
 
             reader.Dispose();
 
@@ -1100,7 +1100,7 @@ namespace Lucene.Net.Index
             writer.Dispose();
 
             DirectoryReader reader2 = DirectoryReader.Open(dir);
-            reader2.AddReaderClosedListener(listener);
+            reader2.AddReaderDisposedListener(listener);
 
             closeCount[0] = 0;
             reader2.Dispose();
@@ -1108,7 +1108,7 @@ namespace Lucene.Net.Index
             dir.Dispose();
         }
 
-        private sealed class ReaderClosedListenerAnonymousClass : IndexReader.IReaderClosedListener
+        private sealed class ReaderClosedListenerAnonymousClass : IReaderDisposedListener
         {
             private readonly TestDirectoryReader outerInstance;
 
@@ -1122,7 +1122,7 @@ namespace Lucene.Net.Index
                 this.closeCount = closeCount;
             }
 
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 closeCount[0]++;
             }
diff --git a/src/Lucene.Net.Tests/Index/TestIndexReaderClose.cs b/src/Lucene.Net.Tests/Index/TestIndexReaderClose.cs
index ac06ae234..b6f195089 100644
--- a/src/Lucene.Net.Tests/Index/TestIndexReaderClose.cs
+++ b/src/Lucene.Net.Tests/Index/TestIndexReaderClose.cs
@@ -47,7 +47,7 @@ namespace Lucene.Net.Index
                 bool throwOnClose = !Rarely();
                 AtomicReader wrap = SlowCompositeReaderWrapper.Wrap(open);
                 FilterAtomicReader reader = new FilterAtomicReaderAnonymousClass(this, wrap, throwOnClose);
-                //IList<IndexReader.IReaderClosedListener> listeners = new JCG.List<IndexReader.IReaderClosedListener>(); // LUCENENET: This list is unused (and was unused in Java)
+                //IList<IReaderDisposedListener> listeners = new JCG.List<IReaderDisposedListener>(); // LUCENENET: This list is unused (and was unused in Java)
                 int listenerCount = Random.Next(20);
                 AtomicInt32 count = new AtomicInt32();
                 bool faultySet = false;
@@ -56,17 +56,17 @@ namespace Lucene.Net.Index
                     if (Rarely())
                     {
                         faultySet = true;
-                        reader.AddReaderClosedListener(new FaultyListener());
+                        reader.AddReaderDisposedListener(new FaultyListener());
                     }
                     else
                     {
                         count.IncrementAndGet();
-                        reader.AddReaderClosedListener(new CountListener(count));
+                        reader.AddReaderDisposedListener(new CountListener(count));
                     }
                 }
                 if (!faultySet && !throwOnClose)
                 {
-                    reader.AddReaderClosedListener(new FaultyListener());
+                    reader.AddReaderDisposedListener(new FaultyListener());
                 }
                 try
                 {
@@ -127,7 +127,7 @@ namespace Lucene.Net.Index
             }
         }
 
-        private sealed class CountListener : IndexReader.IReaderClosedListener
+        private sealed class CountListener : IReaderDisposedListener
         {
             internal readonly AtomicInt32 count;
 
@@ -136,15 +136,15 @@ namespace Lucene.Net.Index
                 this.count = count;
             }
 
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 count.DecrementAndGet();
             }
         }
 
-        private sealed class FaultyListener : IndexReader.IReaderClosedListener
+        private sealed class FaultyListener : IReaderDisposedListener
         {
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 throw IllegalStateException.Create("GRRRRRRRRRRRR!");
             }
diff --git a/src/Lucene.Net.Tests/Index/TestParallelCompositeReader.cs b/src/Lucene.Net.Tests/Index/TestParallelCompositeReader.cs
index dff35e115..e44403963 100644
--- a/src/Lucene.Net.Tests/Index/TestParallelCompositeReader.cs
+++ b/src/Lucene.Net.Tests/Index/TestParallelCompositeReader.cs
@@ -31,7 +31,6 @@ namespace Lucene.Net.Index
     using LuceneTestCase = Lucene.Net.Util.LuceneTestCase;
     using MockAnalyzer = Lucene.Net.Analysis.MockAnalyzer;
     using Occur = Lucene.Net.Search.Occur;
-    using IReaderClosedListener = Lucene.Net.Index.IndexReader.IReaderClosedListener;
 
     [TestFixture]
     public class TestParallelCompositeReader : LuceneTestCase
@@ -161,7 +160,7 @@ namespace Lucene.Net.Index
 
             foreach (AtomicReaderContext cxt in pr.Leaves)
             {
-                cxt.Reader.AddReaderClosedListener(new ReaderClosedListenerAnonymousClass(this, listenerClosedCount));
+                cxt.Reader.AddReaderDisposedListener(new ReaderClosedListenerAnonymousClass(this, listenerClosedCount));
             }
             pr.Dispose();
             ir1.Dispose();
@@ -169,7 +168,7 @@ namespace Lucene.Net.Index
             dir1.Dispose();
         }
 
-        private sealed class ReaderClosedListenerAnonymousClass : IReaderClosedListener
+        private sealed class ReaderClosedListenerAnonymousClass : IReaderDisposedListener
         {
             private readonly TestParallelCompositeReader outerInstance;
 
@@ -181,7 +180,7 @@ namespace Lucene.Net.Index
                 this.listenerClosedCount = listenerClosedCount;
             }
 
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 listenerClosedCount[0]++;
             }
@@ -203,14 +202,14 @@ namespace Lucene.Net.Index
 
             foreach (AtomicReaderContext cxt in pr.Leaves)
             {
-                cxt.Reader.AddReaderClosedListener(new ReaderClosedListenerAnonymousClass2(this, listenerClosedCount));
+                cxt.Reader.AddReaderDisposedListener(new ReaderClosedListenerAnonymousClass2(this, listenerClosedCount));
             }
             pr.Dispose();
             Assert.AreEqual(3, listenerClosedCount[0]);
             dir1.Dispose();
         }
 
-        private sealed class ReaderClosedListenerAnonymousClass2 : IReaderClosedListener
+        private sealed class ReaderClosedListenerAnonymousClass2 : IReaderDisposedListener
         {
             private readonly TestParallelCompositeReader outerInstance;
 
@@ -222,7 +221,7 @@ namespace Lucene.Net.Index
                 this.listenerClosedCount = listenerClosedCount;
             }
 
-            public void OnClose(IndexReader reader)
+            public void OnDispose(IndexReader reader)
             {
                 listenerClosedCount[0]++;
             }
diff --git a/src/Lucene.Net.Tests/Support/TestIDisposable.cs b/src/Lucene.Net.Tests/Support/TestIDisposable.cs
index 10ca6f5b8..3af48634d 100644
--- a/src/Lucene.Net.Tests/Support/TestIDisposable.cs
+++ b/src/Lucene.Net.Tests/Support/TestIDisposable.cs
@@ -1,4 +1,4 @@
-using Lucene.Net.Analysis.Core;
+using Lucene.Net.Analysis.Core;
 using Lucene.Net.Attributes;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
@@ -58,7 +58,7 @@ namespace Lucene.Net.Support
                     {
                     }
 
-                    Assert.Throws<ObjectDisposedException>(() => reader.RemoveReaderClosedListener(null), "IndexReader shouldn't be open here");
+                    Assert.Throws<ObjectDisposedException>(() => reader.RemoveReaderDisposedListener(null), "IndexReader shouldn't be open here");
                 }
                 
                 Assert.Throws<ObjectDisposedException>(() => writer.AddDocument(doc), "IndexWriter shouldn't be open here");
diff --git a/src/Lucene.Net/Index/IndexReader.cs b/src/Lucene.Net/Index/IndexReader.cs
index ab19154e7..d1e355e0f 100644
--- a/src/Lucene.Net/Index/IndexReader.cs
+++ b/src/Lucene.Net/Index/IndexReader.cs
@@ -75,7 +75,7 @@ namespace Lucene.Net.Index
     /// <see cref="IndexReader"/> instance; use your own
     /// (non-Lucene) objects instead.
     /// </summary>
-    public abstract class IndexReader : IDisposable
+    public abstract partial class IndexReader : IDisposable
     {
         private bool closed = false;
         private bool closedByChild = false;
@@ -94,20 +94,9 @@ namespace Lucene.Net.Index
         private readonly IEventAggregator eventAggregator = new EventAggregator();
 #endif
 
-        /// <summary>
-        /// A custom listener that's invoked when the <see cref="IndexReader"/>
-        /// is closed.
-        /// <para/>
-        /// @lucene.experimental
-        /// </summary>
-        public interface IReaderClosedListener
-        {
-            /// <summary>
-            /// Invoked when the <see cref="IndexReader"/> is closed. </summary>
-            void OnClose(IndexReader reader);
-        }
+        // LUCENENET specific - de-nested IReaderClosedListener and renamed to IReaderDisposedListener
 
-        private readonly ISet<IReaderClosedListener> readerClosedListeners = new JCG.LinkedHashSet<IReaderClosedListener>().AsConcurrent();
+        private readonly ISet<IReaderDisposedListener> readerDisposedListeners = new JCG.LinkedHashSet<IReaderDisposedListener>().AsConcurrent();
 
         private readonly ConditionalWeakTable<IndexReader, object> parentReaders = new ConditionalWeakTable<IndexReader, object>();
 
@@ -116,26 +105,30 @@ namespace Lucene.Net.Index
         private readonly object parentReadersLock = new object();
 
         /// <summary>
-        /// Expert: adds a <see cref="IReaderClosedListener"/>.  The
-        /// provided listener will be invoked when this reader is closed.
+        /// Expert: adds a <see cref="IReaderDisposedListener"/>.  The
+        /// provided listener will be invoked when this reader is disposed.
+        /// <para/>
+        /// <b>NOTE:</b> This was addReaderClosedListener() in Lucene.
         /// <para/>
         /// @lucene.experimental
         /// </summary>
-        public void AddReaderClosedListener(IReaderClosedListener listener)
+        public void AddReaderDisposedListener(IReaderDisposedListener listener)
         {
             EnsureOpen();
-            readerClosedListeners.Add(listener);
+            readerDisposedListeners.Add(listener);
         }
 
         /// <summary>
-        /// Expert: remove a previously added <see cref="IReaderClosedListener"/>.
+        /// Expert: remove a previously added <see cref="IReaderDisposedListener"/>.
+        /// <para/>
+        /// <b>NOTE:</b> This was removeReaderClosedListener() in Lucene.
         /// <para/>
         /// @lucene.experimental
         /// </summary>
-        public void RemoveReaderClosedListener(IReaderClosedListener listener)
+        public void RemoveReaderDisposedListener(IReaderDisposedListener listener)
         {
             EnsureOpen();
-            readerClosedListeners.Remove(listener);
+            readerDisposedListeners.Remove(listener);
         }
 
         /// <summary>
@@ -174,17 +167,17 @@ namespace Lucene.Net.Index
             }
         }
 
-        private void NotifyReaderClosedListeners(Exception th)
+        private void NotifyReaderDisposedListeners(Exception th) // LUCENENET: Renamed from notifyReaderClosedListeners()
         {
-            object syncRoot = ((ICollection)readerClosedListeners).SyncRoot;
+            object syncRoot = ((ICollection)readerDisposedListeners).SyncRoot;
             UninterruptableMonitor.Enter(syncRoot); // LUCENENET: Ensure we sync on the SyncRoot of ConcurrentSet<T>
             try
             {
-                foreach (IReaderClosedListener listener in readerClosedListeners)
+                foreach (IReaderDisposedListener listener in readerDisposedListeners)
                 {
                     try
                     {
-                        listener.OnClose(this);
+                        listener.OnDispose(this);
                     }
                     catch (Exception t) when (t.IsThrowable())
                     {
@@ -206,7 +199,7 @@ namespace Lucene.Net.Index
             }
         }
 
-        private void ReportCloseToParentReaders()
+        private void ReportDisposeToParentReaders() // LUCENENET: Renamed from reportCloseToParentReaders()
         {
             // LUCENENET specific - since ConditionalWeakTable doesn't synchronize
             // on the enumerator, we need to do external synchronization to make them threadsafe.
@@ -231,7 +224,7 @@ namespace Lucene.Net.Index
                         // cross memory barrier by a fake write:
                         target.refCount.AddAndGet(0);
                         // recurse:
-                        target.ReportCloseToParentReaders();
+                        target.ReportDisposeToParentReaders();
                     }
                 }
             }
@@ -341,11 +334,11 @@ namespace Lucene.Net.Index
                 {
                     try
                     {
-                        ReportCloseToParentReaders();
+                        ReportDisposeToParentReaders();
                     }
                     finally
                     {
-                        NotifyReaderClosedListeners(throwable);
+                        NotifyReaderDisposedListeners(throwable);
                     }
                 }
             }
@@ -773,4 +766,19 @@ namespace Lucene.Net.Index
         /// <seealso cref="Terms.SumTotalTermFreq"/>
         public abstract long GetSumTotalTermFreq(string field);
     }
+
+    /// <summary>
+    /// A custom listener that's invoked when the <see cref="IndexReader"/>
+    /// is disposed.
+    /// <para/>
+    /// <b>NOTE:</b> This was IndexReader.ReaderClosedListener in Lucene.
+    /// <para/>
+    /// @lucene.experimental
+    /// </summary>
+    public interface IReaderDisposedListener
+    {
+        /// <summary>
+        /// Invoked when the <see cref="IndexReader"/> is disposed. </summary>
+        void OnDispose(IndexReader reader);
+    }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net/Search/FieldCacheImpl.cs b/src/Lucene.Net/Search/FieldCacheImpl.cs
index 7b400fe16..07e490a3d 100644
--- a/src/Lucene.Net/Search/FieldCacheImpl.cs
+++ b/src/Lucene.Net/Search/FieldCacheImpl.cs
@@ -228,9 +228,9 @@ namespace Lucene.Net.Search
         }
 
         // composite/SlowMultiReaderWrapper fieldcaches don't purge until composite reader is closed.
-        internal readonly IndexReader.IReaderClosedListener purgeReader;
+        internal readonly IReaderDisposedListener purgeReader;
 
-        private sealed class ReaderClosedListenerAnonymousClass : IndexReader.IReaderClosedListener
+        private sealed class ReaderClosedListenerAnonymousClass : IReaderDisposedListener
         {
             private readonly FieldCacheImpl outerInstance;
 
@@ -239,7 +239,7 @@ namespace Lucene.Net.Search
                 this.outerInstance = outerInstance;
             }
 
-            public void OnClose(IndexReader owner)
+            public void OnDispose(IndexReader owner)
             {
                 if (Debugging.AssertsEnabled) Debugging.Assert(owner is AtomicReader);
                 outerInstance.PurgeByCacheKey(((AtomicReader)owner).CoreCacheKey);
@@ -259,12 +259,12 @@ namespace Lucene.Net.Search
                 object key = reader.CoreCacheKey;
                 if (key is AtomicReader atomicReader)
                 {
-                    atomicReader.AddReaderClosedListener(purgeReader);
+                    atomicReader.AddReaderDisposedListener(purgeReader);
                 }
                 else
                 {
                     // last chance
-                    reader.AddReaderClosedListener(purgeReader);
+                    reader.AddReaderDisposedListener(purgeReader);
                 }
             }
 #if !FEATURE_CONDITIONALWEAKTABLE_ENUMERATOR
diff --git a/src/Lucene.Net/Support/ObsoleteAPI/IndexReader.cs b/src/Lucene.Net/Support/ObsoleteAPI/IndexReader.cs
new file mode 100644
index 000000000..806fb58e6
--- /dev/null
+++ b/src/Lucene.Net/Support/ObsoleteAPI/IndexReader.cs
@@ -0,0 +1,79 @@
+using System;
+
+namespace Lucene.Net.Index
+{
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF licenses this file to You under the Apache License, Version 2.0
+     * (the "License"); you may not use this file except in compliance with
+     * the License.  You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+
+    public abstract partial class IndexReader
+    {
+        /// <summary>
+        /// A custom listener that's invoked when the <see cref="IndexReader"/>
+        /// is closed.
+        /// <para/>
+        /// @lucene.experimental
+        /// </summary>
+        [Obsolete("Use IReaderDisposedListener interface instead. This method will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
+        public interface IReaderClosedListener
+        {
+            /// <summary>
+            /// Invoked when the <see cref="IndexReader"/> is closed. </summary>
+            void OnClose(IndexReader reader);
+        }
+
+        [Obsolete("This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
+        private sealed class ReaderCloseListenerWrapper : IReaderDisposedListener
+        {
+            private readonly IReaderClosedListener listener;
+            public ReaderCloseListenerWrapper(IReaderClosedListener listener)
+            {
+                this.listener = listener ?? throw new ArgumentNullException(nameof(listener));
+            }
+
+            public void OnDispose(IndexReader reader) => listener.OnClose(reader);
+
+            public override bool Equals(object obj) => listener.Equals(obj);
+            public override int GetHashCode() => listener.GetHashCode();
+            public override string ToString() => listener.ToString();
+        }
+
+        /// <summary>
+        /// Expert: adds a <see cref="IReaderClosedListener"/>.  The
+        /// provided listener will be invoked when this reader is closed.
+        /// <para/>
+        /// @lucene.experimental
+        /// </summary>
+        [Obsolete("Use AddReaderDisposedListerner method instead. This method will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
+        public void AddReaderClosedListener(IReaderClosedListener listener)
+        {
+            EnsureOpen();
+            readerDisposedListeners.Add(new ReaderCloseListenerWrapper(listener));
+        }
+
+        /// <summary>
+        /// Expert: remove a previously added <see cref="IReaderClosedListener"/>.
+        /// <para/>
+        /// @lucene.experimental
+        /// </summary>
+        [Obsolete("Use RemoveReaderDisposedListerner method instead. This method will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
+        public void RemoveReaderClosedListener(IReaderClosedListener listener)
+        {
+            EnsureOpen();
+            readerDisposedListeners.Remove(new ReaderCloseListenerWrapper(listener));
+        }
+    }
+}