You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by cc...@apache.org on 2013/03/27 20:50:21 UTC
git commit: LUCENENET-518 - Changed exceptions to be serializable and
added unit tests to verify Contributor: Simon Fenton
Updated Branches:
refs/heads/master 02b2430ad -> c7f9cab71
LUCENENET-518 - Changed exceptions to be serializable and added unit tests to verify
Contributor: Simon Fenton <si...@justgiving.com>
Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/c7f9cab7
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/c7f9cab7
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/c7f9cab7
Branch: refs/heads/master
Commit: c7f9cab71f2ec241fcaa07e3d6fc8eb0a4807992
Parents: 02b2430
Author: ccurrens <cu...@gmail.com>
Authored: Wed Mar 27 12:49:58 2013 -0700
Committer: ccurrens <cu...@gmail.com>
Committed: Wed Mar 27 12:49:58 2013 -0700
----------------------------------------------------------------------
src/core/Index/CorruptIndexException.cs | 46 ++-
src/core/Index/FieldReaderException.cs | 130 +++---
src/core/Index/MergePolicy.cs | 53 ++-
src/core/Index/StaleReaderException.cs | 44 ++-
src/core/QueryParser/ParseException.cs | 9 +-
src/core/QueryParser/QueryParser.cs | 20 +-
src/core/QueryParser/TokenMgrError.cs | 6 +
src/core/Search/BooleanQuery.cs | 22 +
src/core/Search/FieldCacheImpl.cs | 31 ++-
src/core/Search/TimeLimitingCollector.cs | 392 +++++++++---------
src/core/Store/LockObtainFailedException.cs | 39 ++-
src/core/Store/LockReleaseFailedException.cs | 42 ++-
src/core/Store/NoSuchDirectoryException.cs | 39 ++-
test/core/Lucene.Net.Test.csproj | 1 +
test/core/Support/TestExceptionSerialization.cs | 102 +++++
test/core/Util/LocalizedTestCase.cs | 10 +-
16 files changed, 651 insertions(+), 335 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Index/CorruptIndexException.cs
----------------------------------------------------------------------
diff --git a/src/core/Index/CorruptIndexException.cs b/src/core/Index/CorruptIndexException.cs
index d846cb3..7ff9cef 100644
--- a/src/core/Index/CorruptIndexException.cs
+++ b/src/core/Index/CorruptIndexException.cs
@@ -16,21 +16,39 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Index
{
-
- /// <summary> This exception is thrown when Lucene detects
- /// an inconsistency in the index.
- /// </summary>
- [Serializable]
- public class CorruptIndexException:System.IO.IOException
- {
- public CorruptIndexException(String message):base(message)
- {
- }
- public CorruptIndexException(String message, Exception exp):base(message, exp)
- {
- }
- }
+ /// <summary> This exception is thrown when Lucene detects
+ /// an inconsistency in the index.
+ /// </summary>
+ [Serializable]
+ public class CorruptIndexException : System.IO.IOException
+ {
+ //
+ // For guidelines regarding the creation of new exception types, see
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
+ // and
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
+ //
+
+ public CorruptIndexException()
+ {
+ }
+
+ public CorruptIndexException(string message) : base(message)
+ {
+ }
+
+ public CorruptIndexException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected CorruptIndexException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Index/FieldReaderException.cs
----------------------------------------------------------------------
diff --git a/src/core/Index/FieldReaderException.cs b/src/core/Index/FieldReaderException.cs
index 7654fb4..816d67b 100644
--- a/src/core/Index/FieldReaderException.cs
+++ b/src/core/Index/FieldReaderException.cs
@@ -16,75 +16,81 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Index
{
-
- /// <summary>
- ///
- ///
- /// </summary>
- [Serializable]
- public class FieldReaderException:System.SystemException
- {
- /// <summary> Constructs a new runtime exception with <c>null</c> as its
- /// detail message. The cause is not initialized, and may subsequently be
+ /// <summary>
+ ///
+ ///
+ /// </summary>
+ [Serializable]
+ public class FieldReaderException:System.SystemException
+ {
+ /// <summary> Constructs a new runtime exception with <c>null</c> as its
+ /// detail message. The cause is not initialized, and may subsequently be
/// initialized by a call to <see cref="Exception.InnerException" />.
- /// </summary>
- public FieldReaderException()
- {
- }
-
- /// <summary> Constructs a new runtime exception with the specified cause and a
- /// detail message of <tt>(cause==null ? null : cause.toString())</tt>
- /// (which typically contains the class and detail message of
- /// <tt>cause</tt>).
- /// <p/>
- /// This constructor is useful for runtime exceptions
- /// that are little more than wrappers for other throwables.
- ///
- /// </summary>
- /// <param name="cause">the cause (which is saved for later retrieval by the
+ /// </summary>
+ public FieldReaderException()
+ {
+ }
+
+ /// <summary> Constructs a new runtime exception with the specified cause and a
+ /// detail message of <tt>(cause==null ? null : cause.toString())</tt>
+ /// (which typically contains the class and detail message of
+ /// <tt>cause</tt>).
+ /// <p/>
+ /// This constructor is useful for runtime exceptions
+ /// that are little more than wrappers for other throwables.
+ ///
+ /// </summary>
+ /// <param name="cause">the cause (which is saved for later retrieval by the
/// <see cref="Exception.InnerException" />). (A <tt>null</tt> value is
- /// permitted, and indicates that the cause is nonexistent or
- /// unknown.)
- /// </param>
- /// <since> 1.4
- /// </since>
- public FieldReaderException(System.Exception cause):base((cause == null)?null:cause.Message, cause)
- {
- }
-
- /// <summary> Constructs a new runtime exception with the specified detail message.
- /// The cause is not initialized, and may subsequently be initialized by a
+ /// permitted, and indicates that the cause is nonexistent or
+ /// unknown.)
+ /// </param>
+ /// <since> 1.4
+ /// </since>
+ public FieldReaderException(System.Exception cause):base((cause == null)?null:cause.Message, cause)
+ {
+ }
+
+ /// <summary> Constructs a new runtime exception with the specified detail message.
+ /// The cause is not initialized, and may subsequently be initialized by a
/// call to <see cref="Exception.InnerException" />.
- ///
- /// </summary>
- /// <param name="message">the detail message. The detail message is saved for
+ ///
+ /// </summary>
+ /// <param name="message">the detail message. The detail message is saved for
/// later retrieval by the <see cref="Exception.Message" /> method.
- /// </param>
- public FieldReaderException(System.String message):base(message)
- {
- }
-
- /// <summary> Constructs a new runtime exception with the specified detail message and
- /// cause. <p/>Note that the detail message associated with
- /// <c>cause</c> is <i>not</i> automatically incorporated in
- /// this runtime exception's detail message.
- ///
- /// </summary>
- /// <param name="message">the detail message (which is saved for later retrieval
+ /// </param>
+ public FieldReaderException(System.String message):base(message)
+ {
+ }
+
+ /// <summary> Constructs a new runtime exception with the specified detail message and
+ /// cause. <p/>Note that the detail message associated with
+ /// <c>cause</c> is <i>not</i> automatically incorporated in
+ /// this runtime exception's detail message.
+ ///
+ /// </summary>
+ /// <param name="message">the detail message (which is saved for later retrieval
/// by the <see cref="Exception.Message" /> method).
- /// </param>
- /// <param name="cause"> the cause (which is saved for later retrieval by the
+ /// </param>
+ /// <param name="cause"> the cause (which is saved for later retrieval by the
/// <see cref="Exception.InnerException" /> method). (A <tt>null</tt> value is
- /// permitted, and indicates that the cause is nonexistent or
- /// unknown.)
- /// </param>
- /// <since> 1.4
- /// </since>
- public FieldReaderException(System.String message, System.Exception cause):base(message, cause)
- {
- }
- }
+ /// permitted, and indicates that the cause is nonexistent or
+ /// unknown.)
+ /// </param>
+ /// <since> 1.4
+ /// </since>
+ public FieldReaderException(System.String message, System.Exception cause):base(message, cause)
+ {
+ }
+
+ protected FieldReaderException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Index/MergePolicy.cs
----------------------------------------------------------------------
diff --git a/src/core/Index/MergePolicy.cs b/src/core/Index/MergePolicy.cs
index 59b4817..cdc2060 100644
--- a/src/core/Index/MergePolicy.cs
+++ b/src/core/Index/MergePolicy.cs
@@ -17,6 +17,7 @@
using System;
using System.Collections.Generic;
+using System.Runtime.Serialization;
using Directory = Lucene.Net.Store.Directory;
namespace Lucene.Net.Index
@@ -218,6 +219,24 @@ namespace Lucene.Net.Index
this.dir = dir;
}
+ public MergeException()
+ {
+ }
+
+ public MergeException(string message) : base(message)
+ {
+ }
+
+ public MergeException(string message, Exception ex) : base(message, ex)
+ {
+ }
+
+ protected MergeException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+
/// <summary>Returns the <see cref="Directory" /> of the index that hit
/// the exception.
/// </summary>
@@ -226,17 +245,29 @@ namespace Lucene.Net.Index
get { return dir; }
}
}
-
- [Serializable]
- public class MergeAbortedException:System.IO.IOException
- {
- public MergeAbortedException():base("merge is aborted")
- {
- }
- public MergeAbortedException(System.String message):base(message)
- {
- }
- }
+
+ [Serializable]
+ public class MergeAbortedException : System.IO.IOException
+ {
+ public MergeAbortedException()
+ : base("merge is aborted")
+ {
+ }
+
+ public MergeAbortedException(string message) : base(message)
+ {
+ }
+
+ public MergeAbortedException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected MergeAbortedException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
protected internal IndexWriter writer;
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Index/StaleReaderException.cs
----------------------------------------------------------------------
diff --git a/src/core/Index/StaleReaderException.cs b/src/core/Index/StaleReaderException.cs
index 271070f..f2e5760 100644
--- a/src/core/Index/StaleReaderException.cs
+++ b/src/core/Index/StaleReaderException.cs
@@ -16,24 +16,34 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Index
{
-
- /// <summary> This exception is thrown when an <see cref="IndexReader" />
- /// tries to make changes to the index (via <see cref="IndexReader.DeleteDocument" />
- ///, <see cref="IndexReader.UndeleteAll" />
- /// or <see cref="IndexReader.SetNorm(int,string,float)" />)
- /// but changes have already been committed to the index
- /// since this reader was instantiated. When this happens
- /// you must open a new reader on the current index to make
- /// the changes.
- /// </summary>
- [Serializable]
- public class StaleReaderException:System.IO.IOException
- {
- public StaleReaderException(System.String message):base(message)
- {
- }
- }
+ /// <summary> This exception is thrown when an <see cref="IndexReader" />
+ /// tries to make changes to the index (via <see cref="IndexReader.DeleteDocument" />
+ ///, <see cref="IndexReader.UndeleteAll" />
+ /// or <see cref="IndexReader.SetNorm(int,string,float)" />)
+ /// but changes have already been committed to the index
+ /// since this reader was instantiated. When this happens
+ /// you must open a new reader on the current index to make
+ /// the changes.
+ /// </summary>
+ [Serializable]
+ public class StaleReaderException : System.IO.IOException
+ {
+ public StaleReaderException(string message) : base(message)
+ {
+ }
+
+ public StaleReaderException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected StaleReaderException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/QueryParser/ParseException.cs
----------------------------------------------------------------------
diff --git a/src/core/QueryParser/ParseException.cs b/src/core/QueryParser/ParseException.cs
index ab0fbca..39a18fd 100644
--- a/src/core/QueryParser/ParseException.cs
+++ b/src/core/QueryParser/ParseException.cs
@@ -19,11 +19,11 @@
/* JavaCCOptions:KEEP_LINE_COL=null */
using System;
+using System.Runtime.Serialization;
using Lucene.Net.Support;
namespace Lucene.Net.QueryParsers
{
-
/// <summary> This exception is thrown when parse errors are encountered.
/// You can explicitly create objects of this exception type by
/// calling the method generateParseException in the generated
@@ -147,6 +147,13 @@ namespace Lucene.Net.QueryParsers
{
specialConstructor = false;
}
+
+ protected ParseException(
+ SerializationInfo info,
+ StreamingContext context)
+ : base(info, context)
+ {
+ }
/// <summary> This variable determines which constructor was used to create
/// this object and thereby affects the semantics of the
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/QueryParser/QueryParser.cs
----------------------------------------------------------------------
diff --git a/src/core/QueryParser/QueryParser.cs b/src/core/QueryParser/QueryParser.cs
index e58ecea..1e04228 100644
--- a/src/core/QueryParser/QueryParser.cs
+++ b/src/core/QueryParser/QueryParser.cs
@@ -24,6 +24,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
+using System.Runtime.Serialization;
using System.Text;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Tokenattributes;
@@ -1862,8 +1863,25 @@ namespace Lucene.Net.QueryParsers
}
[Serializable]
- private sealed class LookaheadSuccess : System.Exception
+ public class LookaheadSuccess : Exception
{
+ public LookaheadSuccess()
+ {
+ }
+
+ public LookaheadSuccess(string message) : base(message)
+ {
+ }
+
+ public LookaheadSuccess(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected LookaheadSuccess(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
}
private LookaheadSuccess jj_ls = new LookaheadSuccess();
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/QueryParser/TokenMgrError.cs
----------------------------------------------------------------------
diff --git a/src/core/QueryParser/TokenMgrError.cs b/src/core/QueryParser/TokenMgrError.cs
index d69f88c..1f95636 100644
--- a/src/core/QueryParser/TokenMgrError.cs
+++ b/src/core/QueryParser/TokenMgrError.cs
@@ -19,6 +19,7 @@
/* JavaCCOptions: */
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.QueryParsers
{
@@ -164,6 +165,11 @@ namespace Lucene.Net.QueryParsers
public TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, System.String errorAfter, char curChar, int reason):this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason)
{
}
+
+ public TokenMgrError(SerializationInfo info, StreamingContext context)
+ : base(info, context)
+ {
+ }
}
/* JavaCC - OriginalChecksum=1c94e13236c7e0121e49427992341ee3 (do not edit this line) */
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Search/BooleanQuery.cs
----------------------------------------------------------------------
diff --git a/src/core/Search/BooleanQuery.cs b/src/core/Search/BooleanQuery.cs
index 22b6371..dee4def 100644
--- a/src/core/Search/BooleanQuery.cs
+++ b/src/core/Search/BooleanQuery.cs
@@ -17,6 +17,7 @@
using System;
using System.Collections;
+using System.Runtime.Serialization;
using Lucene.Net.Index;
using Lucene.Net.Support;
using IndexReader = Lucene.Net.Index.IndexReader;
@@ -77,6 +78,27 @@ namespace Lucene.Net.Search
}
}
+
+
+ public TooManyClauses()
+ {
+
+ }
+
+ public TooManyClauses(string message) : base(message)
+ {
+
+ }
+
+ public TooManyClauses(string message, Exception inner) : base(message, inner)
+ {
+
+ }
+
+ public TooManyClauses(SerializationInfo info, StreamingContext context)
+ : base(info, context)
+ {
+ }
}
/// <summary>Gets or sets the maximum number of clauses permitted, 1024 by default.
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Search/FieldCacheImpl.cs
----------------------------------------------------------------------
diff --git a/src/core/Search/FieldCacheImpl.cs b/src/core/Search/FieldCacheImpl.cs
index 6c24dcc..87195ae 100644
--- a/src/core/Search/FieldCacheImpl.cs
+++ b/src/core/Search/FieldCacheImpl.cs
@@ -19,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Runtime.Serialization;
using Lucene.Net.Support;
using NumericField = Lucene.Net.Documents.NumericField;
using IndexReader = Lucene.Net.Index.IndexReader;
@@ -165,14 +166,38 @@ namespace Lucene.Net.Search
get { return value; }
}
}
-
+
/// <summary> Hack: When thrown from a Parser (NUMERIC_UTILS_* ones), this stops
/// processing terms and returns the current FieldCache
/// array.
/// </summary>
[Serializable]
- internal sealed class StopFillCacheException:System.SystemException
- {
+ internal sealed class StopFillCacheException : SystemException
+ {
+ //
+ // For guidelines regarding the creation of new exception types, see
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
+ // and
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
+ //
+
+ public StopFillCacheException()
+ {
+ }
+
+ public StopFillCacheException(string message) : base(message)
+ {
+ }
+
+ public StopFillCacheException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected StopFillCacheException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
}
/// <summary>Expert: Internal cache. </summary>
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Search/TimeLimitingCollector.cs
----------------------------------------------------------------------
diff --git a/src/core/Search/TimeLimitingCollector.cs b/src/core/Search/TimeLimitingCollector.cs
index 2917df3..11ce614 100644
--- a/src/core/Search/TimeLimitingCollector.cs
+++ b/src/core/Search/TimeLimitingCollector.cs
@@ -16,137 +16,157 @@
*/
using System;
+using System.Runtime.Serialization;
using Lucene.Net.Support;
using IndexReader = Lucene.Net.Index.IndexReader;
namespace Lucene.Net.Search
{
-
- /// <summary> The <see cref="TimeLimitingCollector" /> is used to timeout search requests that
- /// take longer than the maximum allowed search time limit. After this time is
- /// exceeded, the search thread is stopped by throwing a
- /// <see cref="TimeExceededException" />.
- /// </summary>
- public class TimeLimitingCollector:Collector
- {
- private void InitBlock()
- {
- greedy = DEFAULT_GREEDY;
- }
-
- /// <summary> Default timer resolution.</summary>
- /// <seealso cref="Resolution">
- /// </seealso>
- public const int DEFAULT_RESOLUTION = 20;
-
- /// <summary> Default for <see cref="IsGreedy()" />.</summary>
- /// <seealso cref="IsGreedy()">
- /// </seealso>
- public bool DEFAULT_GREEDY = false;
-
- private static uint resolution = DEFAULT_RESOLUTION;
-
- private bool greedy;
-
- private sealed class TimerThread:ThreadClass
- {
-
- // NOTE: we can avoid explicit synchronization here for several reasons:
- // * updates to volatile long variables are atomic
- // * only single thread modifies this value
- // * use of volatile keyword ensures that it does not reside in
- // a register, but in main memory (so that changes are visible to
- // other threads).
- // * visibility of changes does not need to be instantanous, we can
- // afford losing a tick or two.
- //
- // See section 17 of the Java Language Specification for details.
- private volatile uint time = 0;
-
- /// <summary> TimerThread provides a pseudo-clock service to all searching
- /// threads, so that they can count elapsed time with less overhead
- /// than repeatedly calling System.currentTimeMillis. A single
- /// thread should be created to be used for all searches.
- /// </summary>
- internal TimerThread():base("TimeLimitedCollector timer thread")
- {
- this.IsBackground = true;
- }
-
- override public void Run()
- {
- while (true)
- {
- // TODO: Use System.nanoTime() when Lucene moves to Java SE 5.
- time += Lucene.Net.Search.TimeLimitingCollector.resolution;
- System.Threading.Thread.Sleep(new System.TimeSpan((System.Int64) 10000 * Lucene.Net.Search.TimeLimitingCollector.resolution));
-
- }
- }
-
- /// <summary> Get the timer value in milliseconds.</summary>
- public long Milliseconds
- {
- get { return time; }
- }
- }
-
- /// <summary>Thrown when elapsed search time exceeds allowed search time. </summary>
- [Serializable]
- public class TimeExceededException:System.SystemException
- {
- private long timeAllowed;
- private long timeElapsed;
- private int lastDocCollected;
- internal TimeExceededException(long timeAllowed, long timeElapsed, int lastDocCollected):base("Elapsed time: " + timeElapsed + "Exceeded allowed search time: " + timeAllowed + " ms.")
- {
- this.timeAllowed = timeAllowed;
- this.timeElapsed = timeElapsed;
- this.lastDocCollected = lastDocCollected;
- }
-
- /// <summary>Returns allowed time (milliseconds). </summary>
- public virtual long TimeAllowed
- {
- get { return timeAllowed; }
- }
-
- /// <summary>Returns elapsed time (milliseconds). </summary>
- public virtual long TimeElapsed
- {
- get { return timeElapsed; }
- }
-
- /// <summary>Returns last doc(absolute doc id) that was collected when the search time exceeded. </summary>
- public virtual int LastDocCollected
- {
- get { return lastDocCollected; }
- }
- }
-
- // Declare and initialize a single static timer thread to be used by
- // all TimeLimitedCollector instances. The JVM assures that
- // this only happens once.
- private static readonly TimerThread TIMER_THREAD = new TimerThread();
-
- private long t0;
- private long timeout;
- private Collector collector;
+
+ /// <summary> The <see cref="TimeLimitingCollector" /> is used to timeout search requests that
+ /// take longer than the maximum allowed search time limit. After this time is
+ /// exceeded, the search thread is stopped by throwing a
+ /// <see cref="TimeExceededException" />.
+ /// </summary>
+ public class TimeLimitingCollector:Collector
+ {
+ private void InitBlock()
+ {
+ greedy = DEFAULT_GREEDY;
+ }
+
+ /// <summary> Default timer resolution.</summary>
+ /// <seealso cref="Resolution">
+ /// </seealso>
+ public const int DEFAULT_RESOLUTION = 20;
+
+ /// <summary> Default for <see cref="IsGreedy()" />.</summary>
+ /// <seealso cref="IsGreedy()">
+ /// </seealso>
+ public bool DEFAULT_GREEDY = false;
+
+ private static uint resolution = DEFAULT_RESOLUTION;
+
+ private bool greedy;
+
+ private sealed class TimerThread:ThreadClass
+ {
+
+ // NOTE: we can avoid explicit synchronization here for several reasons:
+ // * updates to volatile long variables are atomic
+ // * only single thread modifies this value
+ // * use of volatile keyword ensures that it does not reside in
+ // a register, but in main memory (so that changes are visible to
+ // other threads).
+ // * visibility of changes does not need to be instantanous, we can
+ // afford losing a tick or two.
+ //
+ // See section 17 of the Java Language Specification for details.
+ private volatile uint time = 0;
+
+ /// <summary> TimerThread provides a pseudo-clock service to all searching
+ /// threads, so that they can count elapsed time with less overhead
+ /// than repeatedly calling System.currentTimeMillis. A single
+ /// thread should be created to be used for all searches.
+ /// </summary>
+ internal TimerThread():base("TimeLimitedCollector timer thread")
+ {
+ this.IsBackground = true;
+ }
+
+ override public void Run()
+ {
+ while (true)
+ {
+ // TODO: Use System.nanoTime() when Lucene moves to Java SE 5.
+ time += Lucene.Net.Search.TimeLimitingCollector.resolution;
+ System.Threading.Thread.Sleep(new System.TimeSpan((System.Int64) 10000 * Lucene.Net.Search.TimeLimitingCollector.resolution));
+
+ }
+ }
+
+ /// <summary> Get the timer value in milliseconds.</summary>
+ public long Milliseconds
+ {
+ get { return time; }
+ }
+ }
+
+ /// <summary>Thrown when elapsed search time exceeds allowed search time. </summary>
+ [Serializable]
+ public class TimeExceededException:System.SystemException
+ {
+ private long timeAllowed;
+ private long timeElapsed;
+ private int lastDocCollected;
+ internal TimeExceededException(long timeAllowed, long timeElapsed, int lastDocCollected):base("Elapsed time: " + timeElapsed + "Exceeded allowed search time: " + timeAllowed + " ms.")
+ {
+ this.timeAllowed = timeAllowed;
+ this.timeElapsed = timeElapsed;
+ this.lastDocCollected = lastDocCollected;
+ }
+
+ internal TimeExceededException()
+ {
+ }
+
+ public TimeExceededException(string message) : base(message)
+ {
+ }
+
+ public TimeExceededException(string message, Exception inner)
+ : base(message, inner)
+ {
+ }
+
+ protected TimeExceededException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+
+ /// <summary>Returns allowed time (milliseconds). </summary>
+ public virtual long TimeAllowed
+ {
+ get { return timeAllowed; }
+ }
+
+ /// <summary>Returns elapsed time (milliseconds). </summary>
+ public virtual long TimeElapsed
+ {
+ get { return timeElapsed; }
+ }
+
+ /// <summary>Returns last doc(absolute doc id) that was collected when the search time exceeded. </summary>
+ public virtual int LastDocCollected
+ {
+ get { return lastDocCollected; }
+ }
+ }
+
+ // Declare and initialize a single static timer thread to be used by
+ // all TimeLimitedCollector instances. The JVM assures that
+ // this only happens once.
+ private static readonly TimerThread TIMER_THREAD = new TimerThread();
+
+ private long t0;
+ private long timeout;
+ private Collector collector;
private int docBase;
-
- /// <summary> Create a TimeLimitedCollector wrapper over another <see cref="Collector" /> with a specified timeout.</summary>
- /// <param name="collector">the wrapped <see cref="Collector" />
- /// </param>
- /// <param name="timeAllowed">max time allowed for collecting hits after which <see cref="TimeExceededException" /> is thrown
- /// </param>
- public TimeLimitingCollector(Collector collector, long timeAllowed)
- {
- InitBlock();
- this.collector = collector;
- t0 = TIMER_THREAD.Milliseconds;
- this.timeout = t0 + timeAllowed;
- }
+
+ /// <summary> Create a TimeLimitedCollector wrapper over another <see cref="Collector" /> with a specified timeout.</summary>
+ /// <param name="collector">the wrapped <see cref="Collector" />
+ /// </param>
+ /// <param name="timeAllowed">max time allowed for collecting hits after which <see cref="TimeExceededException" /> is thrown
+ /// </param>
+ public TimeLimitingCollector(Collector collector, long timeAllowed)
+ {
+ InitBlock();
+ this.collector = collector;
+ t0 = TIMER_THREAD.Milliseconds;
+ this.timeout = t0 + timeAllowed;
+ }
/// <summary>
/// Gets or sets the timer resolution.
@@ -162,73 +182,73 @@ namespace Lucene.Net.Search
/// then it can take up to 20 milliseconds for the change to have effect.</item>
/// </list>
/// </summary>
- public static long Resolution
- {
- get { return resolution; }
+ public static long Resolution
+ {
+ get { return resolution; }
set
{
// 5 milliseconds is about the minimum reasonable time for a Object.wait(long) call.
resolution = (uint)System.Math.Max(value, 5);
}
- }
-
- /// <summary> Checks if this time limited collector is greedy in collecting the last hit.
- /// A non greedy collector, upon a timeout, would throw a <see cref="TimeExceededException" />
- /// without allowing the wrapped collector to collect current doc. A greedy one would
- /// first allow the wrapped hit collector to collect current doc and only then
- /// throw a <see cref="TimeExceededException" />.
- /// </summary>
- public virtual bool IsGreedy
- {
- get { return greedy; }
- set { this.greedy = value; }
- }
-
- /// <summary> Calls <see cref="Collector.Collect(int)" /> on the decorated <see cref="Collector" />
- /// unless the allowed time has passed, in which case it throws an exception.
- ///
- /// </summary>
- /// <throws> TimeExceededException </throws>
- /// <summary> if the time allowed has exceeded.
- /// </summary>
- public override void Collect(int doc)
- {
- long time = TIMER_THREAD.Milliseconds;
- if (timeout < time)
- {
- if (greedy)
- {
- //System.out.println(this+" greedy: before failing, collecting doc: "+doc+" "+(time-t0));
- collector.Collect(doc);
- }
- //System.out.println(this+" failing on: "+doc+" "+(time-t0));
+ }
+
+ /// <summary> Checks if this time limited collector is greedy in collecting the last hit.
+ /// A non greedy collector, upon a timeout, would throw a <see cref="TimeExceededException" />
+ /// without allowing the wrapped collector to collect current doc. A greedy one would
+ /// first allow the wrapped hit collector to collect current doc and only then
+ /// throw a <see cref="TimeExceededException" />.
+ /// </summary>
+ public virtual bool IsGreedy
+ {
+ get { return greedy; }
+ set { this.greedy = value; }
+ }
+
+ /// <summary> Calls <see cref="Collector.Collect(int)" /> on the decorated <see cref="Collector" />
+ /// unless the allowed time has passed, in which case it throws an exception.
+ ///
+ /// </summary>
+ /// <throws> TimeExceededException </throws>
+ /// <summary> if the time allowed has exceeded.
+ /// </summary>
+ public override void Collect(int doc)
+ {
+ long time = TIMER_THREAD.Milliseconds;
+ if (timeout < time)
+ {
+ if (greedy)
+ {
+ //System.out.println(this+" greedy: before failing, collecting doc: "+doc+" "+(time-t0));
+ collector.Collect(doc);
+ }
+ //System.out.println(this+" failing on: "+doc+" "+(time-t0));
throw new TimeExceededException(timeout - t0, time - t0, docBase + doc);
- }
- //System.out.println(this+" collecting: "+doc+" "+(time-t0));
- collector.Collect(doc);
- }
-
- public override void SetNextReader(IndexReader reader, int base_Renamed)
- {
- collector.SetNextReader(reader, base_Renamed);
+ }
+ //System.out.println(this+" collecting: "+doc+" "+(time-t0));
+ collector.Collect(doc);
+ }
+
+ public override void SetNextReader(IndexReader reader, int base_Renamed)
+ {
+ collector.SetNextReader(reader, base_Renamed);
this.docBase = base_Renamed;
- }
-
- public override void SetScorer(Scorer scorer)
- {
- collector.SetScorer(scorer);
- }
-
- public override bool AcceptsDocsOutOfOrder
- {
- get { return collector.AcceptsDocsOutOfOrder; }
- }
-
- static TimeLimitingCollector()
- {
- {
- TIMER_THREAD.Start();
- }
- }
- }
+ }
+
+ public override void SetScorer(Scorer scorer)
+ {
+ collector.SetScorer(scorer);
+ }
+
+ public override bool AcceptsDocsOutOfOrder
+ {
+ get { return collector.AcceptsDocsOutOfOrder; }
+ }
+
+ static TimeLimitingCollector()
+ {
+ {
+ TIMER_THREAD.Start();
+ }
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Store/LockObtainFailedException.cs
----------------------------------------------------------------------
diff --git a/src/core/Store/LockObtainFailedException.cs b/src/core/Store/LockObtainFailedException.cs
index 065b362..2cfd733 100644
--- a/src/core/Store/LockObtainFailedException.cs
+++ b/src/core/Store/LockObtainFailedException.cs
@@ -16,26 +16,37 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Store
{
-
- /// <summary> This exception is thrown when the <c>write.lock</c>
- /// could not be acquired. This
- /// happens when a writer tries to open an index
- /// that another writer already has open.
- /// </summary>
- /// <seealso cref="Lock.Obtain(long)">
- /// </seealso>
- [Serializable]
- public class LockObtainFailedException:System.IO.IOException
- {
- public LockObtainFailedException(System.String message):base(message)
- {
- }
+
+ /// <summary> This exception is thrown when the <c>write.lock</c>
+ /// could not be acquired. This
+ /// happens when a writer tries to open an index
+ /// that another writer already has open.
+ /// </summary>
+ /// <seealso cref="Lock.Obtain(long)">
+ /// </seealso>
+ [Serializable]
+ public class LockObtainFailedException:System.IO.IOException
+ {
+ public LockObtainFailedException(System.String message):base(message)
+ {
+ }
public LockObtainFailedException(System.String message, System.Exception ex) : base(message, ex)
{
}
+
+ internal LockObtainFailedException()
+ {
+ }
+
+ protected LockObtainFailedException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Store/LockReleaseFailedException.cs
----------------------------------------------------------------------
diff --git a/src/core/Store/LockReleaseFailedException.cs b/src/core/Store/LockReleaseFailedException.cs
index 121283e..58d311e 100644
--- a/src/core/Store/LockReleaseFailedException.cs
+++ b/src/core/Store/LockReleaseFailedException.cs
@@ -16,20 +16,36 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Store
{
-
- /// <summary> This exception is thrown when the <c>write.lock</c>
- /// could not be released.
- /// </summary>
- /// <seealso cref="Lock.Release()">
- /// </seealso>
- [Serializable]
- public class LockReleaseFailedException:System.IO.IOException
- {
- public LockReleaseFailedException(System.String message):base(message)
- {
- }
- }
+
+ /// <summary> This exception is thrown when the <c>write.lock</c>
+ /// could not be released.
+ /// </summary>
+ /// <seealso cref="Lock.Release()">
+ /// </seealso>
+ [Serializable]
+ public class LockReleaseFailedException:System.IO.IOException
+ {
+ public LockReleaseFailedException(System.String message):base(message)
+ {
+ }
+
+ internal LockReleaseFailedException()
+ {
+ }
+
+ internal LockReleaseFailedException(string message, Exception inner)
+ : base(message, inner)
+ {
+ }
+
+ protected LockReleaseFailedException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/src/core/Store/NoSuchDirectoryException.cs
----------------------------------------------------------------------
diff --git a/src/core/Store/NoSuchDirectoryException.cs b/src/core/Store/NoSuchDirectoryException.cs
index c3b01ae..b3ff9f4 100644
--- a/src/core/Store/NoSuchDirectoryException.cs
+++ b/src/core/Store/NoSuchDirectoryException.cs
@@ -16,19 +16,34 @@
*/
using System;
+using System.Runtime.Serialization;
namespace Lucene.Net.Store
{
-
- /// <summary> This exception is thrown when you try to list a
- /// non-existent directory.
- /// </summary>
-
- [Serializable]
- public class NoSuchDirectoryException:System.IO.FileNotFoundException
- {
- public NoSuchDirectoryException(System.String message):base(message)
- {
- }
- }
+
+ /// <summary> This exception is thrown when you try to list a
+ /// non-existent directory.
+ /// </summary>
+
+ [Serializable]
+ public class NoSuchDirectoryException : System.IO.FileNotFoundException
+ {
+ public NoSuchDirectoryException()
+ {
+ }
+
+ public NoSuchDirectoryException(string message) : base(message)
+ {
+ }
+
+ public NoSuchDirectoryException(string message, Exception inner) : base(message, inner)
+ {
+ }
+
+ protected NoSuchDirectoryException(
+ SerializationInfo info,
+ StreamingContext context) : base(info, context)
+ {
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/test/core/Lucene.Net.Test.csproj
----------------------------------------------------------------------
diff --git a/test/core/Lucene.Net.Test.csproj b/test/core/Lucene.Net.Test.csproj
index 39eeacd..6f64384 100644
--- a/test/core/Lucene.Net.Test.csproj
+++ b/test/core/Lucene.Net.Test.csproj
@@ -506,6 +506,7 @@
<Compile Include="SupportClassException.cs" />
<Compile Include="Support\BigObject.cs" />
<Compile Include="Support\CollisionTester.cs" />
+ <Compile Include="Support\TestExceptionSerialization.cs" />
<Compile Include="Support\TestWeakDictionaryBehavior.cs" />
<Compile Include="Support\TestWeakDictionary.cs" />
<Compile Include="Support\SmallObject.cs" />
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/test/core/Support/TestExceptionSerialization.cs
----------------------------------------------------------------------
diff --git a/test/core/Support/TestExceptionSerialization.cs b/test/core/Support/TestExceptionSerialization.cs
new file mode 100644
index 0000000..8691d9d
--- /dev/null
+++ b/test/core/Support/TestExceptionSerialization.cs
@@ -0,0 +1,102 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using Lucene.Net.Store;
+using NUnit.Framework;
+
+namespace Lucene.Net.Support
+{
+ [TestFixture]
+ public class TestExceptionSerialization
+ {
+ public IEnumerable<object> ExceptionTestData
+ {
+ get
+ {
+ return typeof(NoSuchDirectoryException).Assembly.GetTypes().Where(t => typeof(Exception).IsAssignableFrom(t)).Cast<object>();
+ }
+ }
+
+ [Test]
+ public void NoSuchDirectoryExceptionCanBeDeserialized()
+ {
+ var exception = new NoSuchDirectoryException("Message text");
+ Assert.That(TypeCanSerialize(exception));
+ }
+
+ [Test]
+ public void AllExceptionsInLuceneNamespaceCanSerialize([ValueSource("ExceptionTestData")]Type luceneException)
+ {
+ var instance = TryInstantiate(luceneException);
+ Assert.That(TypeCanSerialize(instance), string.Format("Unable to serialize {0}", luceneException.FullName));
+ }
+
+ private static bool TypeCanSerialize<T>(T exception)
+ {
+ T clone;
+
+ try
+ {
+ var binaryFormatter = new BinaryFormatter();
+ using (var serializationStream = new MemoryStream())
+ {
+ binaryFormatter.Serialize(serializationStream, exception);
+ serializationStream.Seek(0, SeekOrigin.Begin);
+ clone = (T)binaryFormatter.Deserialize(serializationStream);
+ }
+ }
+ catch (SerializationException)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ private static object TryInstantiate(Type type)
+ {
+ object instance = null;
+ try
+ {
+ instance = Activator.CreateInstance(type, new object[] { "A message" });
+ }
+ catch (MissingMethodException)
+ {
+ try
+ {
+ instance = Activator.CreateInstance(type);
+ }
+ catch (MissingMethodException)
+ {
+ Assert.Fail("Can't instantiate type {0}, it's missing the necessary constructors.", type.FullName);
+ }
+ }
+ return instance;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/c7f9cab7/test/core/Util/LocalizedTestCase.cs
----------------------------------------------------------------------
diff --git a/test/core/Util/LocalizedTestCase.cs b/test/core/Util/LocalizedTestCase.cs
index b815686..998bde6 100644
--- a/test/core/Util/LocalizedTestCase.cs
+++ b/test/core/Util/LocalizedTestCase.cs
@@ -113,9 +113,17 @@ namespace Lucene.Net.Util
{
test.Invoke(this, null);
}
- catch (Exception)
+ catch (Exception e)
{
+ // Culture hsb fails on Windows 8. see http://stackoverflow.com/questions/12482772/net-4-5-datetime-format-convert-bug-with-upper-sorbian-culture
+ if(t.Name.StartsWith("hsb", StringComparison.InvariantCulture) && Environment.OSVersion.Version == new System.Version(6, 2, 9200, 0))
+ {
+ continue;
+ }
+
Console.Out.WriteLine("Test failure of '" + test.Name + "' occurred under a different Locale " + t.Name);
+
+ Console.Out.WriteLine(e);
throw;
}
}