lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erik Hatcher <e...@ehatchersolutions.com>
Subject Re: NullPointerException: FSDirectory.create(FSDirectory.java:174)
Date Tue, 09 Aug 2005 01:00:22 GMT
Mike,

I have committed your patch and a slightly modified (reformatted,  
added Apache Software License) test case.  Thanks for the patch AND  
test case!

     Erik


On Aug 8, 2005, at 11:12 AM, Michael Goddard wrote:

> Hi All,
>
> To follow up that earlier post: here is a JUnit test to illustrate  
> why I felt the patch was worthwhile.  The test, along with the  
> suggested patch, are attached to this message.
>
> Thanks.
>
>    Mike
>
>
> Michael Goddard wrote:
>
>
>> Hello,
>>
>> Today, while using Lucene 1.9-rc1-dev, I encountered this exception:
>>
>> java.lang.NullPointerException
>>  at org.apache.lucene.store.FSDirectory.create(FSDirectory.java:174)
>>  at org.apache.lucene.store.FSDirectory.init(FSDirectory.java:150)
>>  at org.apache.lucene.store.FSDirectory.getDirectory 
>> (FSDirectory.java:122)
>>  at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:225)
>>
>> Puzzled, I added some debugging println() statements in  
>> FSDirectory and found out that java.io.tmpdir did not exist in my  
>> setup.  It may be that I am in a unique situation, having  
>> accidentally changed that value to some non-existent directory.   
>> If I'm not, someone else might encounter the same problem.  Just  
>> in case, below is the little patch I generated from the change I  
>> came up with.
>>
>>    Mike
>>
>> Index: org/apache/lucene/store/FSDirectory.java
>> ===================================================================
>> --- org/apache/lucene/store/FSDirectory.java    (revision 230511)
>> +++ org/apache/lucene/store/FSDirectory.java    (working copy)
>> @@ -146,6 +146,13 @@
>>     else {
>>       lockDir = new File(LOCK_DIR);
>>     }
>> +    // Ensure that lockDir exists and is a directory.
>> +    if (!lockDir.exists()) {
>> +      if (!lockDir.mkdirs())
>> +        throw new IOException("Cannot create directory: " +  
>> lockDir);
>> +    } else if (!lockDir.isDirectory()) {
>> +      throw new IOException("Found regular file where directory  
>> expected: " + lockDir);
>> +    }
>>     if (create) {
>>       create();
>>     }
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
>> For additional commands, e-mail: java-dev-help@lucene.apache.org
>>
>
>
> import java.io.File;
> import java.io.IOException;
>
> import junit.framework.TestCase;
>
> import org.apache.lucene.analysis.standard.StandardAnalyzer;
> import org.apache.lucene.index.IndexWriter;
>
> /**
>  * Test to illustrate the problem I found when trying to open an  
> IndexWriter in
>  * a situation where the the property  
> <code>org.apache.lucene.lockDir</code>
>  * was not set and the one specified by <code>java.io.tmpdir</code>  
> had been
>  * set to a non-existent path. What I observed is that this  
> combination of
>  * conditions resulted in a <code>NullPointerException</code> being  
> thrown in
>  * the <code>create()</code> method in <code>FSDirectory</code>,
where
>  * <code>files.length</code> is de-referenced, but <code>files</

> code> is
>  * </code>null</code>.
>  *
>  * @author Michael Goddard
>  *
>  */
>
> public class FSDirectoryNullPointerExceptionTest extends TestCase {
>
>     /**
>      * What happens if the Lucene lockDir doesn't exist?
>      *
>      * @throws Exception
>      */
>     public void testNonExistentTmpDir() throws Exception {
>         orgApacheLuceneLockDir = System.setProperty(
>                 "org.apache.lucene.lockDir", NON_EXISTENT_DIRECTORY);
>         String exceptionClassName = openIndexWriter();
>         if (exceptionClassName == null
>                 || exceptionClassName.equals("java.io.IOException"))
>             assertTrue(true);
>         else
>             fail("Caught an unexpected Exception");
>     }
>
>     /**
>      * What happens if the Lucene lockDir is a regular file instead  
> of a
>      * directory?
>      *
>      * @throws Exception
>      */
>     public void testTmpDirIsPlainFile() throws Exception {
>         shouldBeADirectory = new File(NON_EXISTENT_DIRECTORY);
>         shouldBeADirectory.createNewFile();
>         String exceptionClassName = openIndexWriter();
>         if (exceptionClassName == null
>                 || exceptionClassName.equals("java.io.IOException"))
>             assertTrue(true);
>         else
>             fail("Caught an unexpected Exception");
>     }
>
>     public static final String FILE_SEP = System.getProperty 
> ("file.separator");
>
>     public static final String NON_EXISTENT_DIRECTORY = System
>             .getProperty("java.io.tmpdir")
>             + FILE_SEP + "highly_improbable_directory_name";
>
>     public static final String TEST_INDEX_DIR = System
>             .getProperty("java.io.tmpdir")
>             + FILE_SEP + "temp_index";
>
>     private String orgApacheLuceneLockDir;
>
>     private File shouldBeADirectory;
>
>     public FSDirectoryNullPointerExceptionTest(String name) {
>         super(name);
>     }
>
>     public void setUp() {
>     }
>
>     public void tearDown() {
>         if (orgApacheLuceneLockDir != null)
>             System.setProperty("org.apache.lucene.lockDir",
>                     orgApacheLuceneLockDir);
>         if (shouldBeADirectory != null && shouldBeADirectory.exists 
> ()) {
>             try {
>                 shouldBeADirectory.delete();
>             } catch (Exception e) {
>                 e.printStackTrace();
>             }
>         }
>         File deletableIndex = new File(TEST_INDEX_DIR);
>         if (deletableIndex.exists())
>             try {
>                 rmDir(deletableIndex);
>             } catch (Exception e) {
>                 e.printStackTrace();
>             }
>     }
>
>     /**
>      * Open an IndexWriter<br>
>      * Catch any (expected) IOException<br>
>      * Close the IndexWriter
>      */
>     private static String openIndexWriter() {
>         IndexWriter iw = null;
>         String ret = null;
>         try {
>             iw = new IndexWriter(TEST_INDEX_DIR, new  
> StandardAnalyzer(), true);
>         } catch (IOException e) {
>             ret = e.toString();
>             e.printStackTrace();
>         } catch (NullPointerException e) {
>             ret = e.toString();
>             e.printStackTrace();
>         } finally {
>             if (iw != null) {
>                 try {
>                     iw.close();
>                 } catch (IOException ioe) {
>                     // ignore this
>                 }
>             }
>         }
>         return ret;
>     }
>
>     private static void rmDir(File dirName) throws Exception {
>         if (dirName.exists()) {
>             if (dirName.isDirectory()) {
>                 File[] contents = dirName.listFiles();
>                 for (int i = 0; i < contents.length; i++)
>                     rmDir(contents[i]);
>                 dirName.delete();
>             } else {
>                 dirName.delete();
>             }
>         }
>     }
> }
> Index: org/apache/lucene/store/FSDirectory.java
> ===================================================================
> --- org/apache/lucene/store/FSDirectory.java    (revision 230511)
> +++ org/apache/lucene/store/FSDirectory.java    (working copy)
> @@ -146,6 +146,13 @@
>      else {
>        lockDir = new File(LOCK_DIR);
>      }
> +    // Ensure that lockDir exists and is a directory.
> +    if (!lockDir.exists()) {
> +      if (!lockDir.mkdirs())
> +        throw new IOException("Cannot create directory: " + lockDir);
> +    } else if (!lockDir.isDirectory()) {
> +      throw new IOException("Found regular file where directory  
> expected: " + lockDir);
> +    }
>      if (create) {
>        create();
>      }
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-dev-help@lucene.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org


Mime
View raw message