/*
* 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.database;
import java.sql.ResultSet;
import java.sql.SQLException;
import junit.framework.TestCase;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.easymock.AbstractMatcher;
import org.easymock.MockControl;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springmodules.lucene.index.document.handler.database.SqlDocumentHandler;
import org.springmodules.lucene.index.document.handler.database.SqlRequest;
import org.springmodules.lucene.index.factory.IndexFactory;
import org.springmodules.lucene.index.factory.LuceneIndexWriter;
/**
* @author Thierry Templier
*/
public class DatabaseIndexerTests extends TestCase {
private DriverManagerDataSource dataSource;
private JdbcTemplate template;
/**
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
//Initialization of the datasource
this.dataSource = new DriverManagerDataSource();
this.dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
this.dataSource.setUrl("jdbc:hsqldb:test");
this.dataSource.setUsername("sa");
this.dataSource.setPassword("");
this.template = new JdbcTemplate(this.dataSource);
//Creation of the schema
StringBuffer requestCreate = new StringBuffer();
requestCreate.append("DROP TABLE TEST IF EXISTS" );
this.template.execute(requestCreate.toString());
requestCreate = new StringBuffer();
requestCreate.append("create table TEST ( TEST_ID INT not null,");
requestCreate.append(" TEST_NAME VARCHAR(255) not null,");
requestCreate.append(" constraint PK_TEST primary key (TEST_ID) )");
this.template.execute(requestCreate.toString());
//Insertion of tuples
StringBuffer requestInsertion = new StringBuffer();
requestInsertion.append("insert into TEST (TEST_ID, TEST_NAME)");
requestInsertion.append(" values(1, 'this is a test')");
this.template.execute(requestInsertion.toString());
}
/**
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
//Destoy the schema
this.template.execute("drop table TEST");
//Finalization of the datasource
this.dataSource = null;
this.template = null;
}
final public void testRegisterDocumentHandler() {
MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class);
IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock();
indexFactoryControl.replay();
//Indexer
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
//Register a document handler
SqlRequest request = new SqlRequest("select * from test");
assertNull(indexer.getDocumentHandler(request));
indexer.registerDocumentHandler(request,new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
return null;
}
});
Analyzer a = null;
indexFactoryControl.verify();
assertNotNull(indexer.getDocumentHandler(request));
}
final public void testUnregisterDocumentHandler() {
MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class);
IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock();
indexFactoryControl.replay();
//Indexer
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
//Register a document handler
SqlRequest request = new SqlRequest("select * from test");
indexer.registerDocumentHandler(request, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
return null;
}
});
assertNotNull(indexer.getDocumentHandler(request));
//Unregister a document handler
indexer.unregisterDocumentHandler(request);
assertNull(indexer.getDocumentHandler(request));
indexFactoryControl.verify();
}
final public void testAddListener() {
MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class);
IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock();
indexFactoryControl.replay();
//Indexer
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
//Register a document handler
assertEquals(indexer.getListeners().size(), 0);
DatabaseIndexingListener listener = new DatabaseIndexingListenerAdapter();
indexer.addListener(listener);
assertEquals(indexer.getListeners().size(), 1);
DatabaseIndexingListener tmpListener = (DatabaseIndexingListener)indexer.getListeners().get(0);
assertEquals(listener, tmpListener);
indexFactoryControl.verify();
}
final public void testRemoveListener() {
MockControl indexFactoryControl = MockControl.createStrictControl(IndexFactory.class);
IndexFactory indexFactory = (IndexFactory)indexFactoryControl.getMock();
indexFactoryControl.replay();
//Indexer
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
//Register a document handler
DatabaseIndexingListener listener = new DatabaseIndexingListenerAdapter();
indexer.addListener(listener);
assertEquals(indexer.getListeners().size(), 1);
DatabaseIndexingListener tmpListener = (DatabaseIndexingListener)indexer.getListeners().get(0);
assertEquals(listener, tmpListener);
//Unregister a document handler
indexer.removeListener(listener);
assertEquals(indexer.getListeners().size(), 0);
indexFactoryControl.verify();
}
final public void testIndexDataSource() throws Exception {
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.createControl(DatabaseIndexingListener.class);
DatabaseIndexingListener listener = (DatabaseIndexingListener)listenerControl.getMock();
//requests
SqlRequest request1 = new SqlRequest("select * from test");
SqlRequest request2 = new SqlRequest("select * from test");
//documents
final Document document1 = new Document();
document1.add(new Field("contents", "test_name", Field.Store.NO, Field.Index.TOKENIZED));
final Document document2 = new Document();
document2.add(new Field("contents", "test_name", Field.Store.NO, Field.Index.TOKENIZED));
indexFactory.getIndexWriter();
indexFactoryControl.setReturnValue(indexWriter, 1);
listener.beforeIndexingRequest(request1);
listenerControl.setVoidCallable(1);
indexWriter.addDocument(document1);
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.afterIndexingRequest(request1);
listenerControl.setVoidCallable(1);
listener.beforeIndexingRequest(request2);
listenerControl.setVoidCallable(1);
indexWriter.addDocument(document2);
indexWriterControl.setVoidCallable(1);
listener.afterIndexingRequest(request2);
listenerControl.setVoidCallable(1);
indexWriter.close();
indexWriterControl.setVoidCallable(1);
indexFactoryControl.replay();
indexWriterControl.replay();
listenerControl.replay();
//Indexer
final boolean[] called = new boolean[] { false, false };
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
indexer.registerDocumentHandler(request1, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
called[0] = true;
return document1;
}
});
indexer.registerDocumentHandler(request2, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
called[1] = true;
return document2;
}
});
indexer.addListener(listener);
//Index
indexer.index(this.dataSource);
assertTrue(called[0]);
assertTrue(called[1]);
indexFactoryControl.verify();
indexWriterControl.verify();
listenerControl.verify();
}
final public void testIndexDataSourceWithSqlError() throws Exception {
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.createControl(DatabaseIndexingListener.class);
DatabaseIndexingListener listener = (DatabaseIndexingListener)listenerControl.getMock();
//requests
SqlRequest request1 = new SqlRequest("select * from test1");
//documents
final Document document1 = new Document();
document1.add(new Field("contents", "test_name", Field.Store.NO, Field.Index.TOKENIZED));
//exception
BadSqlGrammarException ex = new BadSqlGrammarException("arg1", "arg2", null);
indexFactory.getIndexWriter();
indexFactoryControl.setReturnValue(indexWriter, 1);
listener.beforeIndexingRequest(request1);
listenerControl.setVoidCallable(1);
listener.onErrorIndexingRequest(request1, ex);
listenerControl.setMatcher(new AbstractMatcher() {
protected boolean argumentMatches(Object expected, Object actual) {
if( expected instanceof DataAccessException && actual instanceof DataAccessException ) {
return true;
} else {
return expected.equals(actual);
}
}
});
listenerControl.setVoidCallable(1);
indexWriter.close();
indexWriterControl.setVoidCallable(1);
indexFactoryControl.replay();
indexWriterControl.replay();
listenerControl.replay();
//Indexer
final boolean[] called = new boolean[] { false };
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
indexer.registerDocumentHandler(request1, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
called[0] = true;
return document1;
}
});
indexer.addListener(listener);
//Index
indexer.index(this.dataSource);
assertFalse(called[0]);
indexFactoryControl.verify();
indexWriterControl.verify();
listenerControl.verify();
}
final public void testIndexDataSourceboolean() throws Exception {
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.createControl(DatabaseIndexingListener.class);
DatabaseIndexingListener listener = (DatabaseIndexingListener)listenerControl.getMock();
//requests
SqlRequest request1 = new SqlRequest("select * from test");
SqlRequest request2 = new SqlRequest("select * from test");
//documents
final Document document1 = new Document();
document1.add(new Field("contents", "test_name", Field.Store.NO, Field.Index.TOKENIZED));
final Document document2 = new Document();
document2.add(new Field("contents", "test_name", Field.Store.NO, Field.Index.TOKENIZED));
indexFactory.getIndexWriter();
indexFactoryControl.setReturnValue(indexWriter, 1);
listener.beforeIndexingRequest(request1);
listenerControl.setVoidCallable(1);
indexWriter.addDocument(document1);
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.afterIndexingRequest(request1);
listenerControl.setVoidCallable(1);
listener.beforeIndexingRequest(request2);
listenerControl.setVoidCallable(1);
indexWriter.addDocument(document2);
indexWriterControl.setVoidCallable(1);
listener.afterIndexingRequest(request2);
listenerControl.setVoidCallable(1);
indexWriter.optimize();
indexWriterControl.setVoidCallable(1);
indexWriter.close();
indexWriterControl.setVoidCallable(1);
indexFactoryControl.replay();
indexWriterControl.replay();
listenerControl.replay();
//Indexer
final boolean[] called = new boolean[] { false, false };
DefaultDatabaseIndexer indexer = new DefaultDatabaseIndexer(indexFactory);
indexer.registerDocumentHandler(request1, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
called[0] = true;
return document1;
}
});
indexer.registerDocumentHandler(request2, new SqlDocumentHandler() {
public Document getDocument(SqlRequest request, ResultSet rs) throws SQLException {
called[1] = true;
return document2;
}
});
indexer.addListener(listener);
//Index
indexer.index(this.dataSource, true);
assertTrue(called[0]);
assertTrue(called[1]);
indexFactoryControl.verify();
indexWriterControl.verify();
listenerControl.verify();
}
}