package lux; import static lux.index.IndexConfiguration.*; import java.io.IOException; import javax.xml.stream.XMLStreamException; import lux.index.FieldRole; import lux.index.XmlIndexer; import lux.search.LuxSearcher; import net.sf.saxon.s9api.SaxonApiException; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.Fields; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.store.Directory; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.BytesRef; /** * Test support class that sets up a lucene index and generates and indexes documents from hamlet.xml or * other xml files. */ public class IndexTestSupport extends IndexTestSupportBase { Directory dir; LuxSearcher searcher; public LuxSearcher getSearcher() { return searcher; } IndexWriter indexWriter; public IndexTestSupport() throws XMLStreamException, IOException, SaxonApiException { this ("lux/hamlet.xml"); } public IndexTestSupport(String ... xmlFiles) throws XMLStreamException, IOException, SaxonApiException { this (xmlFiles, new XmlIndexer (INDEX_QNAMES|INDEX_PATHS|STORE_DOCUMENT|INDEX_FULLTEXT), new RAMDirectory()); } public IndexTestSupport(XmlIndexer indexer, Directory dir) throws XMLStreamException, IOException, SaxonApiException { this (new String[] {}, indexer, dir); } public IndexTestSupport(String xmlFile, XmlIndexer indexer, Directory dir) throws XMLStreamException, IOException, SaxonApiException { this (new String[] { xmlFile }, indexer, dir); } public IndexTestSupport(String [] xmlFiles, XmlIndexer indexer, Directory dir) throws XMLStreamException, IOException, SaxonApiException { // create an in-memory Lucene index, index some content this.indexer = indexer; this.dir = dir; indexWriter = indexer.newIndexWriter(dir); if (xmlFiles != null) { for (String file : xmlFiles) { indexAllElements (file); } } reopen(); compiler = new Compiler (indexer.getConfiguration()); } public Evaluator makeEvaluator() throws CorruptIndexException, LockObtainFailedException, IOException { DirectDocWriter docWriter = new DirectDocWriter(indexer, indexWriter); return new Evaluator(compiler, searcher, docWriter); } public void reopen () throws IOException { indexWriter.close(true); indexWriter = indexer.newIndexWriter(dir); searcher = new LuxSearcher(DirectoryReader.open(indexWriter, true)); } public void close() throws Exception { searcher.close(); indexWriter.close(); } @Override public void addDocument (String uri, String xml) throws XMLStreamException, IOException { indexer.indexDocument(indexWriter, uri, xml); } @Override public void commit () throws IOException { indexWriter.commit(); reopen(); } public IndexWriter getIndexWriter () { return indexWriter; } public void printAllTerms() throws IOException { printAllTerms (dir, indexer); } // actually only prints a sample of all terms public static void printAllTerms(Directory dir, XmlIndexer indexer) throws IOException { DirectoryReader reader = DirectoryReader.open(dir); Fields fields = MultiFields.getFields(reader); System.out.println ("Printing all terms (except uri)"); String uriFieldName = indexer.getConfiguration().getFieldName(FieldRole.URI); for (String field : fields) { if (field.equals(uriFieldName)) { continue; } Terms terms = fields.terms(field); TermsEnum termsEnum = terms.iterator(null); BytesRef text; int count = 0; while ((text = termsEnum.next()) != null && count++ < 100) { System.out.println (field + " " + text.utf8ToString() + ' ' + termsEnum.docFreq()); } } reader.close(); } } /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */