blob: 349fa110826d878d1ecccf61204f6f6dcebdf552 [file] [log] [blame]
using System;
using System.Collections.Generic;
namespace Lucene.Net.Store
{
/*
* 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.
*/
/// <summary>
/// Used by <see cref="MockDirectoryWrapper"/> to create an input stream that
/// keeps track of when it's been disposed.
/// </summary>
public class MockIndexInputWrapper : IndexInput
{
private MockDirectoryWrapper dir;
internal readonly string name;
private IndexInput @delegate;
private bool isClone;
private bool closed;
/// <summary>
/// Construct an empty output buffer. </summary>
public MockIndexInputWrapper(MockDirectoryWrapper dir, string name, IndexInput @delegate)
: base("MockIndexInputWrapper(name=" + name + " delegate=" + @delegate + ")")
{
this.name = name;
this.dir = dir;
this.@delegate = @delegate;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
try
{
// turn on the following to look for leaks closing inputs,
// after fixing TestTransactions
// Dir.MaybeThrowDeterministicException();
}
finally
{
closed = true;
@delegate.Dispose();
// Pending resolution on LUCENE-686 we may want to
// remove the conditional check so we also track that
// all clones get closed:
if (!isClone)
{
dir.RemoveIndexInput(this, name);
}
}
}
}
private void EnsureOpen()
{
if (closed)
{
throw new Exception("Abusing closed IndexInput!");
}
}
public override object Clone()
{
EnsureOpen();
dir.inputCloneCount.IncrementAndGet();
IndexInput iiclone = (IndexInput)@delegate.Clone();
MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name, iiclone);
clone.isClone = true;
// Pending resolution on LUCENE-686 we may want to
// uncomment this code so that we also track that all
// clones get closed:
/*
synchronized(dir.openFiles) {
if (dir.openFiles.containsKey(name)) {
Integer v = (Integer) dir.openFiles.get(name);
v = Integer.valueOf(v.intValue()+1);
dir.openFiles.put(name, v);
} else {
throw new RuntimeException("BUG: cloned file was not open?");
}
}
*/
return clone;
}
public override long GetFilePointer()
{
EnsureOpen();
return @delegate.GetFilePointer();
}
public override void Seek(long pos)
{
EnsureOpen();
@delegate.Seek(pos);
}
public override long Length
{
get
{
EnsureOpen();
return @delegate.Length;
}
}
public override byte ReadByte()
{
EnsureOpen();
return @delegate.ReadByte();
}
public override void ReadBytes(byte[] b, int offset, int len)
{
EnsureOpen();
@delegate.ReadBytes(b, offset, len);
}
public override void ReadBytes(byte[] b, int offset, int len, bool useBuffer)
{
EnsureOpen();
@delegate.ReadBytes(b, offset, len, useBuffer);
}
/// <summary>
/// NOTE: this was readShort() in Lucene
/// </summary>
public override short ReadInt16()
{
EnsureOpen();
return @delegate.ReadInt16();
}
/// <summary>
/// NOTE: this was readInt() in Lucene
/// </summary>
public override int ReadInt32()
{
EnsureOpen();
return @delegate.ReadInt32();
}
/// <summary>
/// NOTE: this was readLong() in Lucene
/// </summary>
public override long ReadInt64()
{
EnsureOpen();
return @delegate.ReadInt64();
}
public override string ReadString()
{
EnsureOpen();
return @delegate.ReadString();
}
public override IDictionary<string, string> ReadStringStringMap()
{
EnsureOpen();
return @delegate.ReadStringStringMap();
}
/// <summary>
/// NOTE: this was readVInt() in Lucene
/// </summary>
public override int ReadVInt32()
{
EnsureOpen();
return @delegate.ReadVInt32();
}
/// <summary>
/// NOTE: this was readVLong() in Lucene
/// </summary>
public override long ReadVInt64()
{
EnsureOpen();
return @delegate.ReadVInt64();
}
public override string ToString()
{
return "MockIndexInputWrapper(" + @delegate + ")";
}
}
}