cleanup
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / AlternativeSpellingSuggestionParser.java
index 8dc94d2332c8178460f2729af8691a46872458ed..f914ca3382afb3f616ca88555169b2ea384e4b89 100644 (file)
-/**\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);
+               }
+       }
+
+}