FileDocCategorySizeDatePackage
MockRAMDirectory.javaAPI DocApache Lucene 2.2.06512Sat Jun 16 22:20:24 BST 2007org.apache.lucene.store

MockRAMDirectory

public class MockRAMDirectory extends RAMDirectory
This is a subclass of RAMDirectory that adds methods intented to be used only by unit tests.
version
$Id: RAMDirectory.java 437897 2006-08-29 01:13:10Z yonik $

Fields Summary
long
maxSize
long
maxUsedSize
double
randomIOExceptionRate
Random
randomState
boolean
noDeleteOpenFile
Map
openFiles
Constructors Summary
public MockRAMDirectory()


      
    super();
    if (openFiles == null) {
      openFiles = new HashMap();
    }
  
public MockRAMDirectory(String dir)

    super(dir);
    if (openFiles == null) {
      openFiles = new HashMap();
    }
  
public MockRAMDirectory(Directory dir)

    super(dir);
    if (openFiles == null) {
      openFiles = new HashMap();
    }
  
public MockRAMDirectory(File dir)

    super(dir);
    if (openFiles == null) {
      openFiles = new HashMap();
    }
  
Methods Summary
public voidclose()

    if (openFiles == null) {
      openFiles = new HashMap();
    }
    synchronized(openFiles) {
      if (noDeleteOpenFile && openFiles.size() > 0) {
        // RuntimeException instead of IOException because
        // super() does not throw IOException currently:
        throw new RuntimeException("MockRAMDirectory: cannot close: there are still open files: " + openFiles);
      }
    }
  
public org.apache.lucene.store.IndexOutputcreateOutput(java.lang.String name)

    if (openFiles == null) {
      openFiles = new HashMap();
    }
    synchronized(openFiles) {
      if (noDeleteOpenFile && openFiles.containsKey(name)) {
        // RuntimeException instead of IOException because
        // super() does not throw IOException currently:
        throw new RuntimeException("MockRAMDirectory: file \"" + name + "\" is still open: cannot overwrite");
      }
    }
    RAMFile file = new RAMFile(this);
    synchronized (this) {
      RAMFile existing = (RAMFile)fileMap.get(name);
      if (existing!=null) {
        sizeInBytes -= existing.sizeInBytes;
        existing.directory = null;
      }
      fileMap.put(name, file);
    }

    return new MockRAMOutputStream(this, file);
  
public synchronized voiddeleteFile(java.lang.String name)

    synchronized(openFiles) {
      if (noDeleteOpenFile && openFiles.containsKey(name)) {
        throw new IOException("MockRAMDirectory: file \"" + name + "\" is still open: cannot delete");
      }
    }
    super.deleteFile(name);
  
public longgetMaxSizeInBytes()

    return this.maxSize;
  
public longgetMaxUsedSizeInBytes()
Returns the peek actual storage used (bytes) in this directory.

    return this.maxUsedSize;
  
public booleangetNoDeleteOpenFile()

    return noDeleteOpenFile;
  
public doublegetRandomIOExceptionRate()

    return randomIOExceptionRate;
  
final longgetRecomputedActualSizeInBytes()
Like getRecomputedSizeInBytes(), but, uses actual file lengths rather than buffer allocations (which are quantized up to nearest RAMOutputStream.BUFFER_SIZE (now 1024) bytes.

    long size = 0;
    Iterator it = fileMap.values().iterator();
    while (it.hasNext())
      size += ((RAMFile) it.next()).length;
    return size;
  
public final synchronized longgetRecomputedSizeInBytes()
Provided for testing purposes. Use sizeInBytes() instead.

    long size = 0;
    Iterator it = fileMap.values().iterator();
    while (it.hasNext())
      size += ((RAMFile) it.next()).getSizeInBytes();
    return size;
  
voidmaybeThrowIOException()

    if (randomIOExceptionRate > 0.0) {
      int number = Math.abs(randomState.nextInt() % 1000);
      if (number < randomIOExceptionRate*1000) {
        throw new IOException("a random IOException");
      }
    }
  
public org.apache.lucene.store.IndexInputopenInput(java.lang.String name)

    RAMFile file;
    synchronized (this) {
      file = (RAMFile)fileMap.get(name);
    }
    if (file == null)
      throw new FileNotFoundException(name);
    else {
      synchronized(openFiles) {
        if (openFiles.containsKey(name)) {
          Integer v = (Integer) openFiles.get(name);
          v = new Integer(v.intValue()+1);
          openFiles.put(name, v);
        } else {
          openFiles.put(name, new Integer(1));
        }
      }
    }
    return new MockRAMInputStream(this, name, file);
  
public voidresetMaxUsedSizeInBytes()

    this.maxUsedSize = getRecomputedActualSizeInBytes();
  
public voidsetMaxSizeInBytes(long maxSize)

    this.maxSize = maxSize;
  
public voidsetNoDeleteOpenFile(boolean value)
Emulate windows whereby deleting an open file is not allowed (raise IOException).

    this.noDeleteOpenFile = value;
  
public voidsetRandomIOExceptionRate(double rate, long seed)
If 0.0, no exceptions will be thrown. Else this should be a double 0.0 - 1.0. We will randomly throw an IOException on the first write to an OutputStream based on this probability.

    randomIOExceptionRate = rate;
    // seed so we have deterministic behaviour:
    randomState = new Random(seed);