LUCENE-1468: switch Directory.list() to Directory.listAll(), which does no filtering of returned array

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@723789 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael McCandless 2008-12-05 17:03:13 +00:00
parent 5e3cd6711a
commit 4a0a5664dd
22 changed files with 290 additions and 81 deletions

View File

@ -38,6 +38,14 @@ API Changes
These methods can be used to avoid additional calls to doc(). These methods can be used to avoid additional calls to doc().
(Michael Busch) (Michael Busch)
6. LUCENE-1468: Deprecate Directory.list(), which sometimes (in
FSDirectory) filters out files that don't look like index files, in
favor of new Directory.listAll(), which does no filtering. Also,
listAll() will never return null; instead, it throws an IOException
(or subclass). Specifically, FSDirectory.listAll() will throw the
newly added NoSuchDirectoryException if the directory does not
exist. (Marcel Reutegger, Mike McCandless)
Bug fixes Bug fixes
1. LUCENE-1415: MultiPhraseQuery has incorrect hashCode() and equals() 1. LUCENE-1415: MultiPhraseQuery has incorrect hashCode() and equals()

View File

@ -24,7 +24,6 @@ import java.io.BufferedReader;
import java.util.List; import java.util.List;
import java.util.Iterator; import java.util.Iterator;
import org.apache.lucene.benchmark.byTask.Benchmark;
import org.apache.lucene.benchmark.byTask.feeds.DocData; import org.apache.lucene.benchmark.byTask.feeds.DocData;
import org.apache.lucene.benchmark.byTask.feeds.NoMoreDataException; import org.apache.lucene.benchmark.byTask.feeds.NoMoreDataException;
import org.apache.lucene.benchmark.byTask.feeds.ReutersDocMaker; import org.apache.lucene.benchmark.byTask.feeds.ReutersDocMaker;
@ -712,7 +711,7 @@ public class TestPerfTasksLogic extends TestCase {
ir.close(); ir.close();
// Make sure we have 3 segments: // Make sure we have 3 segments:
final String[] files = benchmark.getRunData().getDirectory().list(); final String[] files = benchmark.getRunData().getDirectory().listAll();
int cfsCount = 0; int cfsCount = 0;
for(int i=0;i<files.length;i++) for(int i=0;i<files.length;i++)
if (files[i].endsWith(".cfs")) if (files[i].endsWith(".cfs"))

View File

@ -480,9 +480,7 @@ abstract class DirectoryIndexReader extends IndexReader {
/** @see IndexReader#listCommits */ /** @see IndexReader#listCommits */
public static Collection listCommits(Directory dir) throws IOException { public static Collection listCommits(Directory dir) throws IOException {
final String[] files = dir.list(); final String[] files = dir.listAll();
if (files == null)
throw new IOException("cannot read directory " + dir + ": list() returned null");
Collection commits = new ArrayList(); Collection commits = new ArrayList();

View File

@ -146,9 +146,7 @@ final class IndexFileDeleter {
long currentGen = segmentInfos.getGeneration(); long currentGen = segmentInfos.getGeneration();
IndexFileNameFilter filter = IndexFileNameFilter.getFilter(); IndexFileNameFilter filter = IndexFileNameFilter.getFilter();
String[] files = directory.list(); String[] files = directory.listAll();
if (files == null)
throw new IOException("cannot read directory " + directory + ": list() returned null");
CommitPoint currentCommitPoint = null; CommitPoint currentCommitPoint = null;
@ -306,9 +304,7 @@ final class IndexFileDeleter {
* that segment. * that segment.
*/ */
public void refresh(String segmentName) throws IOException { public void refresh(String segmentName) throws IOException {
String[] files = directory.list(); String[] files = directory.listAll();
if (files == null)
throw new IOException("cannot read directory " + directory + ": list() returned null");
IndexFileNameFilter filter = IndexFileNameFilter.getFilter(); IndexFileNameFilter filter = IndexFileNameFilter.getFilter();
String segmentPrefix1; String segmentPrefix1;
String segmentPrefix2; String segmentPrefix2;

View File

@ -620,12 +620,11 @@ final class SegmentInfo {
else else
prefix = name + "." + IndexFileNames.PLAIN_NORMS_EXTENSION; prefix = name + "." + IndexFileNames.PLAIN_NORMS_EXTENSION;
int prefixLength = prefix.length(); int prefixLength = prefix.length();
String[] allFiles = dir.list(); String[] allFiles = dir.listAll();
if (allFiles == null) final IndexFileNameFilter filter = IndexFileNameFilter.getFilter();
throw new IOException("cannot read directory " + dir + ": list() returned null");
for(int i=0;i<allFiles.length;i++) { for(int i=0;i<allFiles.length;i++) {
String fileName = allFiles[i]; String fileName = allFiles[i];
if (fileName.length() > prefixLength && Character.isDigit(fileName.charAt(prefixLength)) && fileName.startsWith(prefix)) { if (filter.accept(null, fileName) && fileName.length() > prefixLength && Character.isDigit(fileName.charAt(prefixLength)) && fileName.startsWith(prefix)) {
files.add(fileName); files.add(fileName);
} }
} }

View File

@ -17,11 +17,13 @@ package org.apache.lucene.index;
* limitations under the License. * limitations under the License.
*/ */
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput; import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.ChecksumIndexOutput; import org.apache.lucene.store.ChecksumIndexOutput;
import org.apache.lucene.store.ChecksumIndexInput; import org.apache.lucene.store.ChecksumIndexInput;
import org.apache.lucene.store.NoSuchDirectoryException;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -129,8 +131,11 @@ final class SegmentInfos extends Vector {
* @param directory -- directory to search for the latest segments_N file * @param directory -- directory to search for the latest segments_N file
*/ */
public static long getCurrentSegmentGeneration(Directory directory) throws IOException { public static long getCurrentSegmentGeneration(Directory directory) throws IOException {
String[] files = directory.list(); try {
return getCurrentSegmentGeneration(files); return getCurrentSegmentGeneration(directory.listAll());
} catch (NoSuchDirectoryException nsde) {
return -1;
}
} }
/** /**
@ -558,9 +563,9 @@ final class SegmentInfos extends Vector {
long genA = -1; long genA = -1;
if (directory != null) if (directory != null)
files = directory.list(); files = directory.listAll();
else else
files = fileDirectory.list(); files = FSDirectory.listAll(fileDirectory);
if (files != null) if (files != null)
genA = getCurrentSegmentGeneration(files); genA = getCurrentSegmentGeneration(files);

View File

@ -19,6 +19,8 @@ package org.apache.lucene.store;
import java.io.IOException; import java.io.IOException;
import org.apache.lucene.index.IndexFileNameFilter;
/** A Directory is a flat list of files. Files may be written once, when they /** A Directory is a flat list of files. Files may be written once, when they
* are created. Once a file is created it may only be opened for read, or * are created. Once a file is created it may only be opened for read, or
* deleted. Random access is permitted both when reading and writing. * deleted. Random access is permitted both when reading and writing.
@ -43,14 +45,29 @@ public abstract class Directory {
* this Directory instance). */ * this Directory instance). */
protected LockFactory lockFactory; protected LockFactory lockFactory;
/** Returns an array of strings, one for each file in the /** @deprecated For some Directory implementations ({@link
* directory. This method may return null (for example for * FSDirectory}, and its subclasses), this method
* {@link FSDirectory} if the underlying directory doesn't * silently filters its results to include only index
* exist in the filesystem or there are permissions * files. Please use {@link #listAll} instead, which
* problems).*/ * does no filtering. */
public abstract String[] list() public abstract String[] list()
throws IOException; throws IOException;
/** Returns an array of strings, one for each file in the
* directory. Unlike {@link #list} this method does no
* filtering of the contents in a directory, and it will
* never return null (throws IOException instead).
*
* Currently this method simply fallsback to {@link
* #list} for Directory impls outside of Lucene's core &
* contrib, but in 3.0 that method will be removed and
* this method will become abstract. */
public String[] listAll()
throws IOException
{
return list();
}
/** Returns true iff a file with the given name exists. */ /** Returns true iff a file with the given name exists. */
public abstract boolean fileExists(String name) public abstract boolean fileExists(String name)
throws IOException; throws IOException;
@ -173,19 +190,26 @@ public abstract class Directory {
* are undefined and you could easily hit a * are undefined and you could easily hit a
* FileNotFoundException. * FileNotFoundException.
* *
* <p><b>NOTE:</b> this method only copies files that look
* like index files (ie, have extensions matching the
* known extensions of index files).
*
* @param src source directory * @param src source directory
* @param dest destination directory * @param dest destination directory
* @param closeDirSrc if <code>true</code>, call {@link #close()} method on source directory * @param closeDirSrc if <code>true</code>, call {@link #close()} method on source directory
* @throws IOException * @throws IOException
*/ */
public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException { public static void copy(Directory src, Directory dest, boolean closeDirSrc) throws IOException {
final String[] files = src.list(); final String[] files = src.listAll();
if (files == null) IndexFileNameFilter filter = IndexFileNameFilter.getFilter();
throw new IOException("cannot read directory " + src + ": list() returned null");
byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE]; byte[] buf = new byte[BufferedIndexOutput.BUFFER_SIZE];
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
if (!filter.accept(null, files[i]))
continue;
IndexOutput os = null; IndexOutput os = null;
IndexInput is = null; IndexInput is = null;
try { try {

View File

@ -18,6 +18,7 @@ package org.apache.lucene.store;
*/ */
import java.io.File; import java.io.File;
import java.io.FilenameFilter;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@ -242,6 +243,7 @@ public class FSDirectory extends Directory {
return dir; return dir;
} }
/** @deprecated */
private void create() throws IOException { private void create() throws IOException {
if (directory.exists()) { if (directory.exists()) {
String[] files = directory.list(IndexFileNameFilter.getFilter()); // clear old files String[] files = directory.list(IndexFileNameFilter.getFilter()); // clear old files
@ -265,9 +267,6 @@ public class FSDirectory extends Directory {
final void createDir() throws IOException { final void createDir() throws IOException {
if (!checked) { if (!checked) {
if (directory.exists() && !directory.isDirectory())
throw new IOException(directory + " not a directory");
if (!directory.exists()) if (!directory.exists())
if (!directory.mkdirs()) if (!directory.mkdirs())
throw new IOException("Cannot create directory: " + directory); throw new IOException("Cannot create directory: " + directory);
@ -304,6 +303,9 @@ public class FSDirectory extends Directory {
directory = path; directory = path;
if (directory.exists() && !directory.isDirectory())
throw new NoSuchDirectoryException("file '" + directory + "' exists but is not a directory");
boolean doClearLockID = false; boolean doClearLockID = false;
if (lockFactory == null) { if (lockFactory == null) {
@ -356,12 +358,46 @@ public class FSDirectory extends Directory {
} }
} }
/** Returns an array of strings, one for each Lucene index file in the directory. */ /** Lists all files (not subdirectories) in the
* directory. This method never returns null (throws
* {@link IOException} instead).
*
* @throws NoSuchDirectoryException if the directory
* does not exist, or does exist but is not a
* directory.
* @throws IOException if list() returns null */
public static String[] listAll(File dir) throws IOException {
if (!dir.exists())
throw new NoSuchDirectoryException("directory '" + dir + "' does not exist");
else if (!dir.isDirectory())
throw new NoSuchDirectoryException("file '" + dir + "' exists but is not a directory");
// Exclude subdirs
String[] result = dir.list(new FilenameFilter() {
public boolean accept(File dir, String file) {
return !new File(dir, file).isDirectory();
}
});
if (result == null)
throw new IOException("directory '" + dir + "' exists and is a directory, but cannot be listed: list() returned null");
return result;
}
public String[] list() { public String[] list() {
ensureOpen(); ensureOpen();
return directory.list(IndexFileNameFilter.getFilter()); return directory.list(IndexFileNameFilter.getFilter());
} }
/** Lists all files (not subdirectories) in the
* directory.
* @see #listAll(File) */
public String[] listAll() throws IOException {
ensureOpen();
return listAll(directory);
}
/** Returns true iff a file with the given name exists. */ /** Returns true iff a file with the given name exists. */
public boolean fileExists(String name) { public boolean fileExists(String name) {
ensureOpen(); ensureOpen();

View File

@ -0,0 +1,31 @@
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 java.io.FileNotFoundException;
/**
* This exception is thrown when you try to list a
* non-existent directory.
*/
public class NoSuchDirectoryException extends FileNotFoundException {
public NoSuchDirectoryException(String message) {
super(message);
}
}

View File

@ -95,8 +95,11 @@ public class RAMDirectory extends Directory implements Serializable {
this(FSDirectory.getDirectory(dir), true); this(FSDirectory.getDirectory(dir), true);
} }
/** Returns an array of strings, one for each file in the directory. */
public synchronized final String[] list() { public synchronized final String[] list() {
return listAll();
}
public synchronized final String[] listAll() {
ensureOpen(); ensureOpen();
Set fileNames = fileMap.keySet(); Set fileNames = fileMap.keySet();
String[] result = new String[fileNames.size()]; String[] result = new String[fileNames.size()];

View File

@ -447,7 +447,7 @@ public class TestBackwardsCompatibility extends LuceneTestCase
"segments_3", "segments_3",
"segments.gen"}; "segments.gen"};
String[] actual = dir.list(); String[] actual = dir.listAll();
Arrays.sort(expected); Arrays.sort(expected);
Arrays.sort(actual); Arrays.sort(actual);
if (!Arrays.equals(expected, actual)) { if (!Arrays.equals(expected, actual)) {

View File

@ -333,10 +333,10 @@ public class TestDeletionPolicy extends LuceneTestCase
// should have orphan'd at least one index file. // should have orphan'd at least one index file.
// Open & close a writer and assert that it // Open & close a writer and assert that it
// actually removed something: // actually removed something:
int preCount = dir.list().length; int preCount = dir.listAll().length;
writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, policy, IndexWriter.MaxFieldLength.LIMITED); writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, policy, IndexWriter.MaxFieldLength.LIMITED);
writer.close(); writer.close();
int postCount = dir.list().length; int postCount = dir.listAll().length;
assertTrue(postCount < preCount); assertTrue(postCount < preCount);
} }
} }

View File

@ -315,6 +315,9 @@ public class TestFieldsReader extends LuceneTestCase {
public String[] list() throws IOException { public String[] list() throws IOException {
return fsDir.list(); return fsDir.list();
} }
public String[] listAll() throws IOException {
return fsDir.listAll();
}
public boolean fileExists(String name) throws IOException { public boolean fileExists(String name) throws IOException {
return fsDir.fileExists(name); return fsDir.fileExists(name);
} }

View File

@ -65,7 +65,7 @@ public class TestIndexFileDeleter extends LuceneTestCase
// Now, artificially create an extra .del file & extra // Now, artificially create an extra .del file & extra
// .s0 file: // .s0 file:
String[] files = dir.list(); String[] files = dir.listAll();
/* /*
for(int j=0;j<files.length;j++) { for(int j=0;j<files.length;j++) {
@ -142,14 +142,14 @@ public class TestIndexFileDeleter extends LuceneTestCase
// Create a bogus cfs file shadowing a non-cfs segment: // Create a bogus cfs file shadowing a non-cfs segment:
copyFile(dir, "_2.cfs", "_3.cfs"); copyFile(dir, "_2.cfs", "_3.cfs");
String[] filesPre = dir.list(); String[] filesPre = dir.listAll();
// Open & close a writer: it should delete the above 4 // Open & close a writer: it should delete the above 4
// files and nothing more: // files and nothing more:
writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED); writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false, IndexWriter.MaxFieldLength.LIMITED);
writer.close(); writer.close();
String[] files2 = dir.list(); String[] files2 = dir.listAll();
dir.close(); dir.close();
Arrays.sort(files); Arrays.sort(files);

View File

@ -48,6 +48,7 @@ import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.MockRAMDirectory; import org.apache.lucene.store.MockRAMDirectory;
import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.store.NoSuchDirectoryException;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil; import org.apache.lucene.util._TestUtil;
@ -962,11 +963,11 @@ public class TestIndexReader extends LuceneTestCase
// new IndexFileDeleter, have it delete // new IndexFileDeleter, have it delete
// unreferenced files, then verify that in fact // unreferenced files, then verify that in fact
// no files were deleted: // no files were deleted:
String[] startFiles = dir.list(); String[] startFiles = dir.listAll();
SegmentInfos infos = new SegmentInfos(); SegmentInfos infos = new SegmentInfos();
infos.read(dir); infos.read(dir);
new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null); new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null);
String[] endFiles = dir.list(); String[] endFiles = dir.listAll();
Arrays.sort(startFiles); Arrays.sort(startFiles);
Arrays.sort(endFiles); Arrays.sort(endFiles);
@ -1520,6 +1521,7 @@ public class TestIndexReader extends LuceneTestCase
} }
} }
// LUCENE-1474 // LUCENE-1474
public void testIndexReader() throws Exception { public void testIndexReader() throws Exception {
Directory dir = new RAMDirectory(); Directory dir = new RAMDirectory();
@ -1542,4 +1544,18 @@ public class TestIndexReader extends LuceneTestCase
doc.add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("id", id, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
return doc; return doc;
} }
// LUCENE-1468 -- make sure on attempting to open an
// IndexReader on a non-existent directory, you get a
// good exception
public void testNoDir() throws Throwable {
String tempDir = System.getProperty("java.io.tmpdir");
Directory dir = FSDirectory.getDirectory(new File(tempDir, "doesnotexist"), null);
try {
IndexReader.open(dir);
fail("did not hit expected exception");
} catch (NoSuchDirectoryException nsde) {
// expected
}
}
} }

View File

@ -1051,7 +1051,7 @@ public class TestIndexReaderReopen extends LuceneTestCase {
dir1.close(); dir1.close();
try { try {
dir1.list(); dir1.listAll();
fail("did not hit AlreadyClosedException"); fail("did not hit AlreadyClosedException");
} catch (AlreadyClosedException ace) { } catch (AlreadyClosedException ace) {
// expected // expected

View File

@ -170,7 +170,7 @@ public class TestIndexWriter extends LuceneTestCase
addDocWithIndex(writer, 25*i+j); addDocWithIndex(writer, 25*i+j);
} }
writer.close(); writer.close();
String[] files = dirs[i].list(); String[] files = dirs[i].listAll();
for(int j=0;j<files.length;j++) { for(int j=0;j<files.length;j++) {
inputDiskUsage += dirs[i].fileLength(files[j]); inputDiskUsage += dirs[i].fileLength(files[j]);
} }
@ -207,11 +207,11 @@ public class TestIndexWriter extends LuceneTestCase
// succeed and index should show all documents were // succeed and index should show all documents were
// added. // added.
// String[] files = startDir.list(); // String[] files = startDir.listAll();
long diskUsage = startDir.sizeInBytes(); long diskUsage = startDir.sizeInBytes();
long startDiskUsage = 0; long startDiskUsage = 0;
String[] files = startDir.list(); String[] files = startDir.listAll();
for(int i=0;i<files.length;i++) { for(int i=0;i<files.length;i++) {
startDiskUsage += startDir.fileLength(files[i]); startDiskUsage += startDir.fileLength(files[i]);
} }
@ -539,11 +539,11 @@ public class TestIndexWriter extends LuceneTestCase
} }
public static void assertNoUnreferencedFiles(Directory dir, String message) throws IOException { public static void assertNoUnreferencedFiles(Directory dir, String message) throws IOException {
String[] startFiles = dir.list(); String[] startFiles = dir.listAll();
SegmentInfos infos = new SegmentInfos(); SegmentInfos infos = new SegmentInfos();
infos.read(dir); infos.read(dir);
new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null); new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null);
String[] endFiles = dir.list(); String[] endFiles = dir.listAll();
Arrays.sort(startFiles); Arrays.sort(startFiles);
Arrays.sort(endFiles); Arrays.sort(endFiles);
@ -708,7 +708,7 @@ public class TestIndexWriter extends LuceneTestCase
writer.close(); writer.close();
long startDiskUsage = 0; long startDiskUsage = 0;
String[] files = dir.list(); String[] files = dir.listAll();
for(int i=0;i<files.length;i++) { for(int i=0;i<files.length;i++) {
startDiskUsage += dir.fileLength(files[i]); startDiskUsage += dir.fileLength(files[i]);
} }
@ -988,7 +988,7 @@ public class TestIndexWriter extends LuceneTestCase
long gen = SegmentInfos.getCurrentSegmentGeneration(dir); long gen = SegmentInfos.getCurrentSegmentGeneration(dir);
assertTrue("segment generation should be > 1 but got " + gen, gen > 1); assertTrue("segment generation should be > 1 but got " + gen, gen > 1);
String[] files = dir.list(); String[] files = dir.listAll();
for(int i=0;i<files.length;i++) { for(int i=0;i<files.length;i++) {
if (files[i].endsWith(".cfs")) { if (files[i].endsWith(".cfs")) {
dir.deleteFile(files[i]); dir.deleteFile(files[i]);
@ -1276,12 +1276,12 @@ public class TestIndexWriter extends LuceneTestCase
RAMDirectory dir = new RAMDirectory(); RAMDirectory dir = new RAMDirectory();
IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
writer.setRAMBufferSizeMB(0.000001); writer.setRAMBufferSizeMB(0.000001);
int lastNumFile = dir.list().length; int lastNumFile = dir.listAll().length;
for(int j=0;j<9;j++) { for(int j=0;j<9;j++) {
Document doc = new Document(); Document doc = new Document();
doc.add(new Field("field", "aaa" + j, Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("field", "aaa" + j, Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc); writer.addDocument(doc);
int numFile = dir.list().length; int numFile = dir.listAll().length;
// Verify that with a tiny RAM buffer we see new // Verify that with a tiny RAM buffer we see new
// segment after every doc // segment after every doc
assertTrue(numFile > lastNumFile); assertTrue(numFile > lastNumFile);
@ -4254,4 +4254,31 @@ public class TestIndexWriter extends LuceneTestCase
r.close(); r.close();
dir.close(); dir.close();
} }
// LUCENE-1468 -- make sure opening an IndexWriter with
// create=true does not remove non-index files
public void testOtherFiles() throws Throwable {
File indexDir = new File(System.getProperty("tempDir"), "otherfiles");
Directory dir = new FSDirectory(indexDir, null);
try {
// Create my own random file:
IndexOutput out = dir.createOutput("myrandomfile");
out.writeByte((byte) 42);
out.close();
new IndexWriter(dir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED).close();
assertTrue(dir.fileExists("myrandomfile"));
// Make sure this does not copy myrandomfile:
Directory dir2 = new RAMDirectory(dir);
assertTrue(!dir2.fileExists("myrandomfile"));
} finally {
dir.close();
_TestUtil.rmDir(indexDir);
}
}
} }

View File

@ -668,11 +668,11 @@ public class TestIndexWriterDelete extends LuceneTestCase {
} }
} }
String[] startFiles = dir.list(); String[] startFiles = dir.listAll();
SegmentInfos infos = new SegmentInfos(); SegmentInfos infos = new SegmentInfos();
infos.read(dir); infos.read(dir);
new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null); new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null, null);
String[] endFiles = dir.list(); String[] endFiles = dir.listAll();
if (!Arrays.equals(startFiles, endFiles)) { if (!Arrays.equals(startFiles, endFiles)) {
fail("docswriter abort() failed to delete unreferenced files:\n before delete:\n " fail("docswriter abort() failed to delete unreferenced files:\n before delete:\n "

View File

@ -239,7 +239,7 @@ public class TestIndexWriterMergePolicy extends LuceneTestCase {
assertTrue(numSegments < mergeFactor); assertTrue(numSegments < mergeFactor);
} }
String[] files = writer.getDirectory().list(); String[] files = writer.getDirectory().listAll();
int segmentCfsCount = 0; int segmentCfsCount = 0;
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".cfs")) { if (files[i].endsWith(".cfs")) {
@ -249,6 +249,7 @@ public class TestIndexWriterMergePolicy extends LuceneTestCase {
assertEquals(segmentCount, segmentCfsCount); assertEquals(segmentCount, segmentCfsCount);
} }
/*
private void printSegmentDocCounts(IndexWriter writer) { private void printSegmentDocCounts(IndexWriter writer) {
int segmentCount = writer.getSegmentCount(); int segmentCount = writer.getSegmentCount();
System.out.println("" + segmentCount + " segments total"); System.out.println("" + segmentCount + " segments total");
@ -257,4 +258,5 @@ public class TestIndexWriterMergePolicy extends LuceneTestCase {
+ " docs"); + " docs");
} }
} }
*/
} }

View File

@ -197,7 +197,7 @@ public class TestOmitTf extends LuceneTestCase {
} }
private void assertNoPrx(Directory dir) throws Throwable { private void assertNoPrx(Directory dir) throws Throwable {
final String[] files = dir.list(); final String[] files = dir.listAll();
for(int i=0;i<files.length;i++) for(int i=0;i<files.length;i++)
assertFalse(files[i].endsWith(".prx")); assertFalse(files[i].endsWith(".prx"));
} }

View File

@ -271,6 +271,11 @@ public class TestBufferedIndexInput extends LuceneTestCase {
{ {
return dir.list(); return dir.list();
} }
public String[] listAll()
throws IOException
{
return dir.listAll();
}
public long fileLength(String name) throws IOException { public long fileLength(String name) throws IOException {
return dir.fileLength(name); return dir.fileLength(name);

View File

@ -21,6 +21,8 @@ import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util._TestUtil; import org.apache.lucene.util._TestUtil;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class TestDirectory extends LuceneTestCase { public class TestDirectory extends LuceneTestCase {
@ -128,5 +130,60 @@ public class TestDirectory extends LuceneTestCase {
_TestUtil.rmDir(path); _TestUtil.rmDir(path);
} }
} }
// LUCENE-1468
public void testRAMDirectoryFilter() throws IOException {
checkDirectoryFilter(new RAMDirectory());
}
// LUCENE-1468
public void testFSDirectoryFilter() throws IOException {
checkDirectoryFilter(FSDirectory.getDirectory("test"));
}
// LUCENE-1468
private void checkDirectoryFilter(Directory dir) throws IOException {
String name = "file";
try {
dir.createOutput(name).close();
assertTrue(dir.fileExists(name));
assertTrue(Arrays.asList(dir.listAll()).contains(name));
} finally {
dir.close();
}
}
// LUCENE-1468
public void testCopySubdir() throws Throwable {
File path = new File(System.getProperty("tempDir"), "testsubdir");
try {
path.mkdirs();
new File(path, "subdir").mkdirs();
Directory fsDir = new FSDirectory(path, null);
assertEquals(0, new RAMDirectory(fsDir).listAll().length);
} finally {
_TestUtil.rmDir(path);
}
}
// LUCENE-1468
public void testNotDirectory() throws Throwable {
File path = new File(System.getProperty("tempDir"), "testnotdir");
Directory fsDir = new FSDirectory(path, null);
try {
IndexOutput out = fsDir.createOutput("afile");
out.close();
assertTrue(fsDir.fileExists("afile"));
try {
new FSDirectory(new File(path, "afile"), null);
fail("did not hit expected exception");
} catch (NoSuchDirectoryException nsde) {
// Expected
}
} finally {
fsDir.close();
_TestUtil.rmDir(path);
}
}
} }