Index: src/test/org/apache/lucene/store/TestDirectory.java =================================================================== --- src/test/org/apache/lucene/store/TestDirectory.java (revision 0) +++ src/test/org/apache/lucene/store/TestDirectory.java (revision 0) @@ -0,0 +1,42 @@ +package org.apache.lucene.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. + */ + +import org.apache.lucene.util.LuceneTestCase; + +public class TestDirectory extends LuceneTestCase { + + public void testDetectClose() throws Throwable { + Directory dir = new RAMDirectory(); + dir.close(); + try { + dir.createOutput("test"); + fail("did not hit expected exception"); + } catch (AlreadyClosedException ace) { + } + + dir = FSDirectory.getDirectory(System.getProperty("tempDir")); + dir.close(); + try { + dir.createOutput("test"); + fail("did not hit expected exception"); + } catch (AlreadyClosedException ace) { + } + } +} + Property changes on: src/test/org/apache/lucene/store/TestDirectory.java ___________________________________________________________________ Name: svn:eol-style + native Index: src/test/org/apache/lucene/index/TestDoc.java =================================================================== --- src/test/org/apache/lucene/index/TestDoc.java (revision 674858) +++ src/test/org/apache/lucene/index/TestDoc.java (working copy) @@ -22,11 +22,9 @@ import org.apache.lucene.analysis.SimpleAnalyzer; -import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.Directory; import org.apache.lucene.document.Document; -import org.apache.lucene.search.Similarity; import org.apache.lucene.demo.FileDocument; import java.io.*; @@ -115,7 +113,6 @@ SegmentInfo si2 = indexDoc(writer, "test2.txt"); printSegment(out, si2); writer.close(); - directory.close(); SegmentInfo siMerge = merge(si1, si2, "merge", false); printSegment(out, siMerge); @@ -126,6 +123,7 @@ SegmentInfo siMerge3 = merge(siMerge, siMerge2, "merge3", false); printSegment(out, siMerge3); + directory.close(); out.close(); sw.close(); String multiFileOutput = sw.getBuffer().toString(); @@ -143,7 +141,6 @@ si2 = indexDoc(writer, "test2.txt"); printSegment(out, si2); writer.close(); - directory.close(); siMerge = merge(si1, si2, "merge", true); printSegment(out, siMerge); @@ -154,6 +151,7 @@ siMerge3 = merge(siMerge, siMerge2, "merge3", true); printSegment(out, siMerge3); + directory.close(); out.close(); sw.close(); String singleFileOutput = sw.getBuffer().toString(); Index: src/java/org/apache/lucene/store/RAMDirectory.java =================================================================== --- src/java/org/apache/lucene/store/RAMDirectory.java (revision 674858) +++ src/java/org/apache/lucene/store/RAMDirectory.java (working copy) @@ -237,15 +237,7 @@ /** Closes the store to future operations, releasing associated memory. */ public void close() { + isOpen = false; fileMap = null; } - - /** - * @throws AlreadyClosedException if this IndexReader is closed - */ - protected final void ensureOpen() throws AlreadyClosedException { - if (fileMap == null) { - throw new AlreadyClosedException("this RAMDirectory is closed"); - } - } } Index: src/java/org/apache/lucene/store/Directory.java =================================================================== --- src/java/org/apache/lucene/store/Directory.java (revision 674858) +++ src/java/org/apache/lucene/store/Directory.java (working copy) @@ -38,6 +38,8 @@ */ public abstract class Directory { + volatile boolean isOpen = true; + /** Holds the LockFactory instance (implements locking for * this Directory instance). */ protected LockFactory lockFactory; @@ -210,4 +212,12 @@ if(closeDirSrc) src.close(); } + + /** + * @throws AlreadyClosedException if this Directory is closed + */ + protected final void ensureOpen() throws AlreadyClosedException { + if (!isOpen) + throw new AlreadyClosedException("this Directory is closed"); + } } Index: src/java/org/apache/lucene/store/FSDirectory.java =================================================================== --- src/java/org/apache/lucene/store/FSDirectory.java (revision 674858) +++ src/java/org/apache/lucene/store/FSDirectory.java (working copy) @@ -317,17 +317,20 @@ /** Returns an array of strings, one for each Lucene index file in the directory. */ public String[] list() { + ensureOpen(); return directory.list(IndexFileNameFilter.getFilter()); } /** Returns true iff a file with the given name exists. */ public boolean fileExists(String name) { + ensureOpen(); File file = new File(directory, name); return file.exists(); } /** Returns the time the named file was last modified. */ public long fileModified(String name) { + ensureOpen(); File file = new File(directory, name); return file.lastModified(); } @@ -340,18 +343,21 @@ /** Set the modified time of an existing file to now. */ public void touchFile(String name) { + ensureOpen(); File file = new File(directory, name); file.setLastModified(System.currentTimeMillis()); } /** Returns the length in bytes of a file in the directory. */ public long fileLength(String name) { + ensureOpen(); File file = new File(directory, name); return file.length(); } /** Removes an existing file in the directory. */ public void deleteFile(String name) throws IOException { + ensureOpen(); File file = new File(directory, name); if (!file.delete()) throw new IOException("Cannot delete " + file); @@ -363,6 +369,7 @@ */ public synchronized void renameFile(String from, String to) throws IOException { + ensureOpen(); File old = new File(directory, from); File nu = new File(directory, to); @@ -427,7 +434,7 @@ /** Creates a new, empty file in the directory with the given name. Returns a stream writing this file. */ public IndexOutput createOutput(String name) throws IOException { - + ensureOpen(); File file = new File(directory, name); if (file.exists() && !file.delete()) // delete existing, if any throw new IOException("Cannot overwrite: " + file); @@ -436,6 +443,7 @@ } public void sync(String name) throws IOException { + ensureOpen(); File fullFile = new File(directory, name); boolean success = false; int retryCount = 0; @@ -470,11 +478,13 @@ // Inherit javadoc public IndexInput openInput(String name) throws IOException { + ensureOpen(); return openInput(name, BufferedIndexInput.BUFFER_SIZE); } // Inherit javadoc public IndexInput openInput(String name, int bufferSize) throws IOException { + ensureOpen(); return new FSIndexInput(new File(directory, name), bufferSize); } @@ -486,6 +496,7 @@ public String getLockID() { + ensureOpen(); String dirName; // name to be hashed try { dirName = directory.getCanonicalPath(); @@ -510,7 +521,8 @@ /** Closes the store to future operations. */ public synchronized void close() { - if (--refCount <= 0) { + if (isOpen && --refCount <= 0) { + isOpen = false; synchronized (DIRECTORIES) { DIRECTORIES.remove(directory); } @@ -518,6 +530,7 @@ } public File getFile() { + ensureOpen(); return directory; }