/* * Copyright 2002-2007 the original author or authors. * * Licensed 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. */ package org.springmodules.lucene.index.object.directory; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Map; import junit.framework.TestCase; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.store.RAMDirectory; import org.easymock.AbstractMatcher; import org.easymock.MockControl; import org.springmodules.lucene.index.LuceneIndexingException; import org.springmodules.lucene.index.document.handler.DocumentHandler; import org.springmodules.lucene.index.document.handler.DocumentMatching; import org.springmodules.lucene.index.document.handler.file.ExtensionDocumentMatching; import org.springmodules.lucene.index.document.handler.file.TextDocumentHandler; import org.springmodules.lucene.index.factory.IndexFactory; import org.springmodules.lucene.index.factory.LuceneIndexWriter; /** * @author Thierry Templier */ public class DirectoryIndexerTests extends TestCase { private RAMDirectory directory; /** * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { //Initialization of the index this.directory = new RAMDirectory(); } /** * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { this.directory = null; } final public void testRegisterDocumentHandler() { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); indexFactoryControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); //Register a document handler DocumentMatching matching = new DocumentMatching() { public boolean match(String name) { return name.equals("test"); } }; //Check that the document handler test is not found try { assertNull(indexer.getDocumentHandler("test")); fail(); } catch(Exception ex) {} //Register a document handler indexer.registerDocumentHandler(matching,new DocumentHandler() { public Document getDocument(Map description, Object object) throws IOException { return null; } public boolean supports(Class clazz) { return true; } }); //Check that the document handler test is found now try { assertNotNull(indexer.getDocumentHandler("test")); } catch(Exception ex) { fail(); } indexFactoryControl.verify(); } final public void testUnregisterDocumentHandler() { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); indexFactoryControl.replay(); //Indexer DefaultDirectoryIndexer indexer=new DefaultDirectoryIndexer(indexFactory); //Register a document handler DocumentMatching matching=new DocumentMatching() { public boolean match(String name) { return name.equals("test"); } }; //Register a document handler indexer.registerDocumentHandler(matching,new DocumentHandler() { public Document getDocument(Map description, Object object) throws IOException { return null; } public boolean supports(Class clazz) { return true; } }); //Check that the document handler test is found try { assertNotNull(indexer.getDocumentHandler("test")); } catch(Exception ex) { fail(); } //Unregister a document handler indexer.unregisterDocumentHandler(matching); //Check that the document handler test is not found now try { assertNull(indexer.getDocumentHandler("test")); fail(); } catch(Exception ex) {} indexFactoryControl.verify(); } final public void testAddListener() { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); indexFactoryControl.replay(); //Indexer DefaultDirectoryIndexer indexer=new DefaultDirectoryIndexer(indexFactory); //Register a document handler assertEquals(indexer.getListeners().size(), 0); FileDocumentIndexingListener listener = new FileDocumentIndexingListenerAdapter(); indexer.addListener(listener); assertEquals(indexer.getListeners().size(), 1); FileDocumentIndexingListener tmpListener = (FileDocumentIndexingListener)indexer.getListeners().get(0); assertEquals(listener, tmpListener); indexFactoryControl.verify(); } final public void testRemoveListener() { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); indexFactoryControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); //Register a document handler FileDocumentIndexingListener listener = new FileDocumentIndexingListenerAdapter(); indexer.addListener(listener); assertEquals(indexer.getListeners().size(), 1); FileDocumentIndexingListener tmpListener = (FileDocumentIndexingListener)indexer.getListeners().get(0); assertEquals(listener, tmpListener); //Unregister a document handler indexer.removeListener(listener); assertEquals(indexer.getListeners().size(), 0); indexFactoryControl.verify(); } private File getBaseDirectoryToIndex() { URL url = getClass().getClassLoader().getResource( "org/springmodules/lucene/index/object/files/"); if( url==null ) { return null; } String filename = url.getFile(); return new File(filename); } private File getFileFromClasspath(String filename) { URL url = getClass().getClassLoader().getResource( "org/springmodules/lucene/index/object/files/"+filename); if( url==null ) { return null; } return new File(url.getFile()); } /* * Test pour void index(String) */ final public void testIndexString() throws Exception { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); MockControl indexWriterControl = MockControl.createStrictControl(LuceneIndexWriter.class); LuceneIndexWriter indexWriter = (LuceneIndexWriter)indexWriterControl.getMock(); MockControl listenerControl = MockControl.createStrictControl(FileDocumentIndexingListener.class); FileDocumentIndexingListener listener = (FileDocumentIndexingListener)listenerControl.getMock(); //document Document document = new Document(); document.add(new Field("field", "a sample", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("filter", "a sample filter", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("sort", "2", Field.Store.YES, Field.Index.UN_TOKENIZED)); indexFactory.getIndexWriter(); indexFactoryControl.setReturnValue(indexWriter, 1); listener.beforeIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); listener.onNotAvailableHandler(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); indexWriter.addDocument(document); indexWriterControl.setMatcher(new AbstractMatcher() { protected boolean argumentMatches(Object expected, Object actual) { if( expected instanceof Document && actual instanceof Document ) { return true; } else { return expected.equals(actual); } } }); indexWriterControl.setVoidCallable(1); listener.afterIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); listener.afterIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); indexWriter.close(); indexWriterControl.setVoidCallable(1); indexFactoryControl.replay(); indexWriterControl.replay(); listenerControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); indexer.addListener(listener); File baseDirectory = getBaseDirectoryToIndex(); indexer.index(baseDirectory.getAbsolutePath()); indexFactoryControl.verify(); indexWriterControl.verify(); listenerControl.verify(); } /* * Test for void index(String) with document handler registered */ final public void testIndexStringDocumentHandler() throws Exception { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); MockControl indexWriterControl = MockControl.createStrictControl(LuceneIndexWriter.class); LuceneIndexWriter indexWriter = (LuceneIndexWriter)indexWriterControl.getMock(); MockControl listenerControl = MockControl.createStrictControl(FileDocumentIndexingListener.class); FileDocumentIndexingListener listener = (FileDocumentIndexingListener)listenerControl.getMock(); //document Document document = new Document(); document.add(new Field("field", "a sample", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("filter", "a sample filter", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("sort", "2", Field.Store.YES, Field.Index.UN_TOKENIZED)); indexFactory.getIndexWriter(); indexFactoryControl.setReturnValue(indexWriter, 1); listener.beforeIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); indexWriter.addDocument(document); indexWriterControl.setMatcher(new AbstractMatcher() { protected boolean argumentMatches(Object expected, Object actual) { if( expected instanceof Document && actual instanceof Document ) { return true; } else { return expected.equals(actual); } } }); indexWriterControl.setVoidCallable(1); listener.afterIndexingFile(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); indexWriter.addDocument(document); indexWriterControl.setVoidCallable(1); listener.afterIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); listener.afterIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); indexWriter.close(); indexWriterControl.setVoidCallable(1); indexFactoryControl.replay(); indexWriterControl.replay(); listenerControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); indexer.registerDocumentHandler(new ExtensionDocumentMatching("foo"), new TextDocumentHandler()); indexer.addListener(listener); File baseDirectory = getBaseDirectoryToIndex(); indexer.index(baseDirectory.getAbsolutePath()); indexFactoryControl.verify(); indexWriterControl.verify(); listenerControl.verify(); } /* * Test pour void index(String) with document handler registered */ final public void testIndexStringListener() throws Exception { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); MockControl indexWriterControl = MockControl.createStrictControl(LuceneIndexWriter.class); LuceneIndexWriter indexWriter = (LuceneIndexWriter)indexWriterControl.getMock(); MockControl listener1Control = MockControl.createStrictControl(FileDocumentIndexingListener.class); FileDocumentIndexingListener listener1 = (FileDocumentIndexingListener)listener1Control.getMock(); MockControl listener2Control = MockControl.createStrictControl(FileDocumentIndexingListener.class); FileDocumentIndexingListener listener2 = (FileDocumentIndexingListener)listener2Control.getMock(); //document Document document = new Document(); document.add(new Field("field", "a sample", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("filter", "a sample filter", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("sort", "2", Field.Store.YES, Field.Index.UN_TOKENIZED)); indexFactory.getIndexWriter(); indexFactoryControl.setReturnValue(indexWriter, 1); listener1.beforeIndexingDirectory(getBaseDirectoryToIndex()); listener1Control.setVoidCallable(1); listener2.beforeIndexingDirectory(getBaseDirectoryToIndex()); listener2Control.setVoidCallable(1); listener1.beforeIndexingFile(getFileFromClasspath("test.foo")); listener1Control.setVoidCallable(1); listener2.beforeIndexingFile(getFileFromClasspath("test.foo")); listener2Control.setVoidCallable(1); listener1.onNotAvailableHandler(getFileFromClasspath("test.foo")); listener1Control.setVoidCallable(1); listener2.onNotAvailableHandler(getFileFromClasspath("test.foo")); listener2Control.setVoidCallable(1); listener1.beforeIndexingFile(getFileFromClasspath("test.txt")); listener1Control.setVoidCallable(1); listener2.beforeIndexingFile(getFileFromClasspath("test.txt")); listener2Control.setVoidCallable(1); indexWriter.addDocument(document); indexWriterControl.setMatcher(new AbstractMatcher() { protected boolean argumentMatches(Object expected, Object actual) { if( expected instanceof Document && actual instanceof Document ) { return true; } else { return expected.equals(actual); } } }); indexWriterControl.setVoidCallable(1); listener1.afterIndexingFile(getFileFromClasspath("test.txt")); listener1Control.setVoidCallable(1); listener2.afterIndexingFile(getFileFromClasspath("test.txt")); listener2Control.setVoidCallable(1); listener1.afterIndexingDirectory(getBaseDirectoryToIndex()); listener1Control.setVoidCallable(1); listener2.afterIndexingDirectory(getBaseDirectoryToIndex()); listener2Control.setVoidCallable(1); indexWriter.close(); indexWriterControl.setVoidCallable(1); indexFactoryControl.replay(); indexWriterControl.replay(); listener1Control.replay(); listener2Control.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); indexer.addListener(listener1); indexer.addListener(listener2); File baseDirectory = getBaseDirectoryToIndex(); indexer.index(baseDirectory.getAbsolutePath()); indexFactoryControl.verify(); indexWriterControl.verify(); listener1Control.verify(); listener2Control.verify(); } /* * Test pour void index(String, boolean) */ final public void testIndexStringboolean() throws Exception { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createNiceControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); MockControl indexWriterControl = MockControl.createNiceControl(LuceneIndexWriter.class); LuceneIndexWriter indexWriter = (LuceneIndexWriter)indexWriterControl.getMock(); MockControl listenerControl = MockControl.createNiceControl(FileDocumentIndexingListener.class); FileDocumentIndexingListener listener = (FileDocumentIndexingListener)listenerControl.getMock(); //document Document document = new Document(); document.add(new Field("field", "a sample", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("filter", "a sample filter", Field.Store.YES, Field.Index.TOKENIZED)); document.add(new Field("sort", "2", Field.Store.YES, Field.Index.UN_TOKENIZED)); indexFactory.getIndexWriter(); indexFactoryControl.setReturnValue(indexWriter, 1); listener.beforeIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); listener.onNotAvailableHandler(getFileFromClasspath("test.foo")); listenerControl.setVoidCallable(1); listener.beforeIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); indexWriter.addDocument(document); indexWriterControl.setMatcher(new AbstractMatcher() { protected boolean argumentMatches(Object expected, Object actual) { if( expected instanceof Document && actual instanceof Document ) { return true; } else { return expected.equals(actual); } } }); indexWriterControl.setVoidCallable(1); listener.afterIndexingFile(getFileFromClasspath("test.txt")); listenerControl.setVoidCallable(1); listener.afterIndexingDirectory(getBaseDirectoryToIndex()); listenerControl.setVoidCallable(1); indexWriter.optimize(); indexWriterControl.setVoidCallable(1); indexWriter.close(); indexWriterControl.setVoidCallable(1); indexFactoryControl.replay(); indexWriterControl.replay(); listenerControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); indexer.addListener(listener); File baseDirectory = getBaseDirectoryToIndex(); indexer.index(baseDirectory.getAbsolutePath(), true); indexFactoryControl.verify(); indexWriterControl.verify(); listenerControl.verify(); } /* * Test pour void index(String) */ final public void testIndexStringIfDirectoryNotExist() throws Exception { SimpleAnalyzer analyzer = new SimpleAnalyzer(); MockControl indexFactoryControl = MockControl.createControl(IndexFactory.class); IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock(); indexFactoryControl.replay(); //Indexer DefaultDirectoryIndexer indexer = new DefaultDirectoryIndexer(indexFactory); File baseDirectory = getBaseDirectoryToIndex(); File wrongBaseDirectory = new File(baseDirectory.getCanonicalPath()+"/test"); try { indexer.index(wrongBaseDirectory.getAbsolutePath()); fail(); } catch(LuceneIndexingException ex) { } indexFactoryControl.verify(); } }