package org.infinispan.lucene.impl; import java.io.IOException; import org.apache.lucene.store.IndexInput; /** * Wraps an InfinispanIndexInput to expose only a slice of it. * Such slices are dependent on the parent IndexInput and will not handle readlocks. * * @author Sanne Grinovero <sanne@hibernate.org> (C) 2014 Red Hat Inc. * @since 7.0 */ final class SlicingInfinispanIndexInput extends IndexInput { private final long offset; private final long length; private InfinispanIndexInput delegate; public SlicingInfinispanIndexInput(String sliceDescription, long offset, long length, InfinispanIndexInput delegate) { super(sliceDescription); this.offset = offset; this.length = length; this.delegate = delegate; delegate.seek(offset); } @Override public void close() throws IOException { delegate.close(); } @Override public long getFilePointer() { return delegate.getFilePointer() - offset; } @Override public void seek(long pos) throws IOException { delegate.seek(pos + offset); } @Override public long length() { return length; } public IndexInput slice(String sliceDescription, long offset, long length) throws IOException { return new SlicingInfinispanIndexInput(sliceDescription, offset + this.offset, length, delegate.copyAndReset()); } @Override public IndexInput clone() { SlicingInfinispanIndexInput clone = (SlicingInfinispanIndexInput) super.clone(); //This is important! the cloned IndexInput needs to be able to move the current read position //independently from the original one, but starting at the same read position at the moment of cloning. clone.delegate = delegate.clone(); return clone; } @Override public byte readByte() throws IOException { return delegate.readByte(); } @Override public void readBytes(byte[] b, int offset, int len) throws IOException { delegate.readBytes(b, offset, len); } }