package com.lumos.lucene.index;

import org.apache.lucene.analysis.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.document.*;
import org.apache.lucene.store.*;

import java.io.*;

/**
 * Test case that seems to show a locking bug.
 * I get this output ( it's run from ant thus the [java] prefix.
 *
    [java] LOCK EXISTS -= removing to start
    [java] Starting
    [java] LOCK: 00
    [java] read says: 7
    [java] add random
    [java] LOCK: a
    [java] add alpha
    [java] LOCK: b
    [java] LOCK: c
    [java] LOCK: d
    [java] java.io.IOException: Index locked for write: Lock@C:\tmp\luc\locktest\write.lock
    [java]     at org.apache.lucene.index.IndexReader.delete(Unknown Source)
    [java]     at org.apache.lucene.index.IndexReader.delete(Unknown Source)
    [java]     at com.lumos.lucene.index.LockTest.main(LockTest.java:59)
   
 *
 */
public class LockTest
{
	public static void main(  String[] a)
		throws Throwable
	{
		if ( new File( "c:/tmp/luc/locktest/write.lock").exists())
		{
			o.println( "LOCK EXISTS -= removing to start");
			new File( "c:/tmp/luc/locktest/write.lock").delete();
		}
				 
		o.println( "Starting");
		String indexName = "locktest";
		
		boolean create = false;
		Directory dir = FSDirectory.getDirectory( indexName, create);
		check( "0"); 
		IndexWriter writer = new IndexWriter( dir,
									IndexBase.getAnalyzer(),
									create);
		check( "00");
		//writer.infoStream = new PrintStream( System.out);
		//IndexReader reader = IndexReader.open( indexName);
		IndexReader reader = IndexReader.open( dir);
		o.println( "read says: " + reader.numDocs());
		//
		o.println( "add random");
		check( "a");
		Document doc = new Document();
		doc.add( Field.Text( "contents", new StringReader( "hi there davey")));
		doc.add( Field.Keyword( "id", ""+System.currentTimeMillis()));
		writer.addDocument( doc);

		//
		o.println( "add alpha");
		check( "b"); 
		doc = new Document();
		doc.add( Field.Text( "contents", new StringReader( "hi there davey")));
		doc.add( Field.Keyword( "id", "alpha"));
		writer.addDocument( doc);
		check( "c");		
		//
		Term t = new Term( "id", "alpha");
		check( "d");		
		int be=  reader.delete( t); // <<-- THIS CODE FAILS
		/*
		 */
		o.println( "del=" +be);

		
		//
		o.println( "close");		
		reader.close();
		writer.optimize();
		writer.close();
		o.println( "done");
	}

	private static void check( String msg)
	{
		if ( new File( "c:/tmp/luc/locktest/write.lock").exists())
			o.println( "LOCK: "+ msg);
	}

	static PrintStream o = System.out;
}
