-/**\r
- * Copyright (C) 2007 EDIT\r
- * European Distributed Institute of Taxonomy\r
- * http://www.e-taxonomy.eu\r
- *\r
- * The contents of this file are subject to the Mozilla Public License Version 1.1\r
- * See LICENSE.TXT at the top of this package for the full license terms.\r
- */\r
-\r
-package eu.etaxonomy.cdm.persistence.dao.hibernate;\r
-\r
-\r
-import java.io.IOException;\r
-import java.io.StringReader;\r
-import java.util.Vector;\r
-\r
-import org.apache.commons.logging.Log;\r
-import org.apache.commons.logging.LogFactory;\r
-import org.apache.lucene.analysis.Analyzer;\r
-import org.apache.lucene.analysis.Token;\r
-import org.apache.lucene.analysis.TokenStream;\r
-import org.apache.lucene.analysis.standard.StandardAnalyzer;\r
-import org.apache.lucene.index.CorruptIndexException;\r
-import org.apache.lucene.index.IndexReader;\r
-import org.apache.lucene.index.IndexWriterConfig;\r
-import org.apache.lucene.index.Term;\r
-import org.apache.lucene.queryParser.ParseException;\r
-import org.apache.lucene.queryParser.QueryParser;\r
-import org.apache.lucene.search.PhraseQuery;\r
-import org.apache.lucene.search.Query;\r
-import org.apache.lucene.search.TermQuery;\r
-import org.apache.lucene.search.spell.Dictionary;\r
-import org.apache.lucene.search.spell.LuceneDictionary;\r
-import org.apache.lucene.search.spell.SpellChecker;\r
-import org.apache.lucene.store.Directory;\r
-import org.apache.lucene.util.BytesRef;\r
-import org.apache.lucene.util.BytesRefIterator;\r
-import org.apache.lucene.util.Version;\r
-import org.hibernate.SessionFactory;\r
-import org.hibernate.search.FullTextSession;\r
-import org.hibernate.search.Search;\r
-import org.hibernate.search.SearchFactory;\r
-import org.hibernate.search.indexes.IndexReaderAccessor;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r
-\r
-import eu.etaxonomy.cdm.config.Configuration;\r
-import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.persistence.dao.IAlternativeSpellingSuggestionParser;\r
-\r
-\r
-\r
-public abstract class AlternativeSpellingSuggestionParser<T extends CdmBase>\r
- extends HibernateDaoSupport\r
- implements IAlternativeSpellingSuggestionParser {\r
- private static Log log = LogFactory.getLog(AlternativeSpellingSuggestionParser.class);\r
-\r
- private String defaultField;\r
- protected Directory directory;\r
- private final Class<T> type;\r
- private Class<? extends T> indexedClasses[];\r
-\r
- private static Version version = Configuration.luceneVersion;\r
-\r
-\r
- public AlternativeSpellingSuggestionParser(Class<T> type) {\r
- this.type = type;\r
- }\r
-\r
- public void setIndexedClasses(Class<? extends T> indexedClasses[]) {\r
- this.indexedClasses = indexedClasses;\r
- }\r
-\r
- public abstract void setDirectory(Directory directory);\r
-\r
- @Autowired\r
- public void setHibernateSessionFactory(SessionFactory sessionFactory) {\r
- super.setSessionFactory(sessionFactory);\r
- }\r
-\r
- public void setDefaultField(String defaultField) {\r
- this.defaultField = defaultField;\r
- }\r
-\r
- @Override\r
- public Query parse(String queryString) throws ParseException {\r
- QueryParser queryParser = new QueryParser(version, defaultField, new StandardAnalyzer(version));\r
- return queryParser.parse(queryString);\r
- }\r
-\r
- @Override\r
- public Query suggest(String queryString) throws ParseException {\r
- QuerySuggester querySuggester = new QuerySuggester(defaultField, new StandardAnalyzer(version));\r
- Query query = querySuggester.parse(queryString);\r
- return querySuggester.hasSuggestedQuery() ? query : null;\r
- }\r
-\r
- private class QuerySuggester extends QueryParser {\r
- private boolean suggestedQuery = false;\r
- public QuerySuggester(String field, Analyzer analyzer) {\r
- super(version, field, analyzer);\r
- }\r
- @Override\r
- protected Query getFieldQuery(String field, String queryText) throws ParseException {\r
- // Copied from org.apache.lucene.queryParser.QueryParser\r
- // replacing construction of TermQuery with call to getTermQuery()\r
- // which finds close matches.\r
- TokenStream source = getAnalyzer().tokenStream(field, new StringReader(queryText));\r
- Vector<Object> v = new Vector<Object>();\r
- Token t;\r
-\r
- while (true) {\r
- try {\r
- //OLD\r
-// t = source.next();\r
-\r
- //FIXME this is new after Hibernate 4 migration\r
- //but completely unchecked and unsure if correct\r
- //#3344\r
- boolean it = source.incrementToken();\r
- t = source.getAttribute(Token.class);\r
-\r
-\r
-\r
- } catch (IOException e) {\r
- t = null;\r
- }\r
- if (t == null){\r
- break;\r
- }\r
-\r
-// OLD v.addElement(t.termText());\r
- //FIXME unchecked #3344\r
- v.addElement(t.term());\r
- }\r
- try {\r
- source.close();\r
- } catch (IOException e) {\r
- // ignore\r
- }\r
-\r
- if (v.size() == 0) {\r
- return null;\r
- } else if (v.size() == 1) {\r
- return new TermQuery(getTerm(field, (String) v.elementAt(0)));\r
- } else {\r
- PhraseQuery q = new PhraseQuery();\r
- q.setSlop(getPhraseSlop());\r
- for (int i = 0; i < v.size(); i++) {\r
- q.add(getTerm(field, (String) v.elementAt(i)));\r
- }\r
- return q;\r
- }\r
- }\r
-\r
- private Term getTerm(String field, String queryText) throws ParseException {\r
-\r
- try {\r
- SpellChecker spellChecker = new SpellChecker(directory);\r
- if (spellChecker.exist(queryText)) {\r
- return new Term(field, queryText);\r
- }\r
- String[] similarWords = spellChecker.suggestSimilar(queryText, 1);\r
- if (similarWords.length == 0) {\r
- return new Term(field, queryText);\r
- }\r
- suggestedQuery = true;\r
- return new Term(field, similarWords[0]);\r
- } catch (IOException e) {\r
- throw new ParseException(e.getMessage());\r
- }\r
- }\r
- public boolean hasSuggestedQuery() {\r
- return suggestedQuery;\r
- }\r
- }\r
-\r
- @Override\r
- public void refresh() {\r
- FullTextSession fullTextSession = Search.getFullTextSession(getSession());\r
- SearchFactory searchFactory = fullTextSession.getSearchFactory();\r
- try {\r
- SpellChecker spellChecker = new SpellChecker(directory);\r
-\r
- for(Class<? extends T> indexedClass : indexedClasses) {\r
- //OLD\r
-// DirectoryProvider<?> directoryProvider = searchFactory.getDirectoryProviders(indexedClass)[0];\r
-// ReaderProvider readerProvider = searchFactory.getReaderProvider();\r
- IndexReaderAccessor ira = searchFactory.getIndexReaderAccessor();\r
-// IndexReader indexReader = ira.open(indexedClass);\r
- IndexReader indexReader = null;\r
-\r
- try {\r
-\r
- indexReader = ira.open(indexedClass);\r
-// indexReader = readerProvider.openIndexReader(); // .openReader(directoryProvider);\r
- log.debug("Creating new dictionary for words in " + defaultField + " docs " + indexReader.numDocs());\r
-\r
- Dictionary dictionary = new LuceneDictionary(indexReader, defaultField);\r
- if(log.isDebugEnabled()) {\r
- BytesRefIterator iterator = dictionary.getWordsIterator();\r
- BytesRef bytesRef;\r
- while((bytesRef = iterator.next()) != null) {\r
- log.debug("Indexing word " + bytesRef);\r
- }\r
- }\r
-\r
-\r
-// OLD: spellChecker.indexDictionary(dictionary);\r
- //FIXME preliminary for Hibernate 4 migration see # 3344\r
- IndexWriterConfig config = new IndexWriterConfig(version, new StandardAnalyzer(version));\r
- boolean fullMerge = true;\r
- spellChecker.indexDictionary(dictionary, config, fullMerge);\r
-\r
- } catch (CorruptIndexException cie) {\r
- log.error("Spellings index is corrupted", cie);\r
- } finally {\r
- if (indexReader != null) {\r
-// readerProvider.closeIndexReader(indexReader);\r
- ira.close(indexReader);\r
- }\r
- }\r
- }\r
- }catch (IOException ioe) {\r
- log.error(ioe);\r
- }\r
- }\r
-\r
-}\r
+/**
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+
+package eu.etaxonomy.cdm.persistence.dao.hibernate;
+
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Vector;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.Token;
+import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.index.CorruptIndexException;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.lucene.queryparser.classic.QueryParser;
+import org.apache.lucene.search.PhraseQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.spell.Dictionary;
+import org.apache.lucene.search.spell.LuceneDictionary;
+import org.apache.lucene.search.spell.SpellChecker;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.BytesRefIterator;
+import org.hibernate.SessionFactory;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.indexes.IndexReaderAccessor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
+
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dao.IAlternativeSpellingSuggestionParser;
+
+
+/**
+ * @author unknown
+ *
+ * @param <T>
+ * @deprecated Use current methods for alternative spelling suggestions. This class is no longer supported
+ * after migration to hibernate 4.x.
+ */
+@Deprecated
+public abstract class AlternativeSpellingSuggestionParser<T extends CdmBase>
+ extends HibernateDaoSupport
+ implements IAlternativeSpellingSuggestionParser {
+ private static Log log = LogFactory.getLog(AlternativeSpellingSuggestionParser.class);
+
+ private String defaultField;
+ protected Directory directory;
+ private final Class<T> type;
+ private Class<? extends T> indexedClasses[];
+
+
+ public AlternativeSpellingSuggestionParser(Class<T> type) {
+ this.type = type;
+ }
+
+ public void setIndexedClasses(Class<? extends T> indexedClasses[]) {
+ this.indexedClasses = indexedClasses;
+ }
+
+ public abstract void setDirectory(Directory directory);
+
+ @Autowired
+ public void setHibernateSessionFactory(SessionFactory sessionFactory) {
+ super.setSessionFactory(sessionFactory);
+ }
+
+ public void setDefaultField(String defaultField) {
+ this.defaultField = defaultField;
+ }
+
+ @Override
+ public Query parse(String queryString) throws ParseException {
+ QueryParser queryParser = new QueryParser(defaultField, new StandardAnalyzer());
+ return queryParser.parse(queryString);
+ }
+
+ @Override
+ public Query suggest(String queryString) throws ParseException {
+ QuerySuggester querySuggester = new QuerySuggester(defaultField, new StandardAnalyzer());
+ Query query = querySuggester.parse(queryString);
+ return querySuggester.hasSuggestedQuery() ? query : null;
+ }
+
+ private class QuerySuggester extends QueryParser {
+ private boolean suggestedQuery = false;
+ public QuerySuggester(String field, Analyzer analyzer) {
+ super(field, analyzer);
+ }
+ @Override
+ protected Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException {
+ // Copied from org.apache.lucene.queryParser.QueryParser
+ // replacing construction of TermQuery with call to getTermQuery()
+ // which finds close matches.
+ TokenStream source;
+ source = getAnalyzer().tokenStream(field, new StringReader(queryText));
+ Vector<Object> v = new Vector<Object>();
+ Token t;
+
+ while (true) {
+ try {
+ //OLD
+// t = source.next();
+
+ //FIXME this is new after Hibernate 4 migration
+ //but completely unchecked and unsure if correct
+ //#3344
+ boolean it = source.incrementToken();
+ t = source.getAttribute(Token.class);
+
+
+
+ } catch (IOException e) {
+ t = null;
+ }
+ if (t == null){
+ break;
+ }
+
+// OLD v.addElement(t.termText());
+ //FIXME unchecked #3344
+ //FIXME #4716 not sure if this implementation equals the old t.term()
+ String term = new String(t.buffer(), 0, t.length());
+
+ v.addElement(term);
+ }
+ try {
+ source.close();
+ } catch (IOException e) {
+ // ignore
+ }
+
+ if (v.size() == 0) {
+ return null;
+ } else if (v.size() == 1) {
+ return new TermQuery(getTerm(field, (String) v.elementAt(0)));
+ } else {
+ PhraseQuery q = new PhraseQuery();
+ q.setSlop(getPhraseSlop());
+ for (int i = 0; i < v.size(); i++) {
+ q.add(getTerm(field, (String) v.elementAt(i)));
+ }
+ return q;
+ }
+ }
+
+ private Term getTerm(String field, String queryText) throws ParseException {
+
+ try {
+ SpellChecker spellChecker = new SpellChecker(directory);
+ if (spellChecker.exist(queryText)) {
+ return new Term(field, queryText);
+ }
+ String[] similarWords = spellChecker.suggestSimilar(queryText, 1);
+ if (similarWords.length == 0) {
+ return new Term(field, queryText);
+ }
+ suggestedQuery = true;
+ return new Term(field, similarWords[0]);
+ } catch (IOException e) {
+ throw new ParseException(e.getMessage());
+ }
+ }
+ public boolean hasSuggestedQuery() {
+ return suggestedQuery;
+ }
+ }
+
+ @Override
+ public void refresh() {
+ FullTextSession fullTextSession = Search.getFullTextSession(getSession());
+ SearchFactory searchFactory = fullTextSession.getSearchFactory();
+ try {
+ SpellChecker spellChecker = new SpellChecker(directory);
+
+ for(Class<? extends T> indexedClass : indexedClasses) {
+ //OLD
+// DirectoryProvider<?> directoryProvider = searchFactory.getDirectoryProviders(indexedClass)[0];
+// ReaderProvider readerProvider = searchFactory.getReaderProvider();
+ IndexReaderAccessor ira = searchFactory.getIndexReaderAccessor();
+// IndexReader indexReader = ira.open(indexedClass);
+ IndexReader indexReader = null;
+
+ try {
+
+ indexReader = ira.open(indexedClass);
+// indexReader = readerProvider.openIndexReader(); // .openReader(directoryProvider);
+ log.debug("Creating new dictionary for words in " + defaultField + " docs " + indexReader.numDocs());
+
+ Dictionary dictionary = new LuceneDictionary(indexReader, defaultField);
+ if(log.isDebugEnabled()) {
+ BytesRefIterator iterator = dictionary.getEntryIterator();
+ BytesRef bytesRef;
+ while((bytesRef = iterator.next()) != null) {
+ log.debug("Indexing word " + bytesRef);
+ }
+ }
+
+
+// OLD: spellChecker.indexDictionary(dictionary);
+ //FIXME preliminary for Hibernate 4 migration see # 3344
+ IndexWriterConfig config = new IndexWriterConfig( new StandardAnalyzer());
+ boolean fullMerge = true;
+ spellChecker.indexDictionary(dictionary, config, fullMerge);
+
+ } catch (CorruptIndexException cie) {
+ log.error("Spellings index is corrupted", cie);
+ } finally {
+ if (indexReader != null) {
+// readerProvider.closeIndexReader(indexReader);
+ ira.close(indexReader);
+ }
+ }
+ }
+ }catch (IOException ioe) {
+ log.error(ioe);
+ }
+ }
+
+}