Blame SOURCES/eclipse-lucene-4.patch

10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/Analyzer_en.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/Analyzer_en.java
10f0d1
index 4e6786c..49dc51b 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/Analyzer_en.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/Analyzer_en.java
10f0d1
@@ -10,10 +10,14 @@
10f0d1
  *******************************************************************************/
10f0d1
 package org.eclipse.help.internal.search;
10f0d1
 import java.io.*;
10f0d1
-import java.util.HashSet;
10f0d1
-import java.util.Set;
10f0d1
+import java.util.ArrayList;
10f0d1
+import java.util.List;
10f0d1
 
10f0d1
 import org.apache.lucene.analysis.*;
10f0d1
+import org.apache.lucene.analysis.en.*;
10f0d1
+import org.apache.lucene.analysis.core.*;
10f0d1
+import org.apache.lucene.analysis.util.*;
10f0d1
+import org.apache.lucene.util.Version;
10f0d1
 /**
10f0d1
  * Lucene Analyzer for English. LowerCaseTokenizer->StopFilter->PorterStemFilter
10f0d1
  */
10f0d1
@@ -25,18 +29,22 @@ public final class Analyzer_en extends Analyzer {
10f0d1
 		super();
10f0d1
 	}
10f0d1
 	/**
10f0d1
-	 * Creates a TokenStream which tokenizes all the text in the provided
10f0d1
+	 * Creates a TokenStreamComponents which tokenizes all the text in the provided
10f0d1
 	 * Reader.
10f0d1
 	 */
10f0d1
-	public final TokenStream tokenStream(String fieldName, Reader reader) {
10f0d1
-		return new PorterStemFilter(new StopFilter(false, new LowerCaseAndDigitsTokenizer(reader), getStopWords(), false));
10f0d1
+	@Override
10f0d1
+	public final TokenStreamComponents createComponents(String fieldName, Reader reader) {
10f0d1
+		CharArraySet stopWordsSet = StopFilter.makeStopSet(Version.LUCENE_47, getStopWords(), true);
10f0d1
+		Tokenizer source = new LowerCaseAndDigitsTokenizer(reader);
10f0d1
+		TokenStream filter = new PorterStemFilter(new StopFilter(Version.LUCENE_47, source, stopWordsSet));
10f0d1
+		return new TokenStreamComponents(source, filter);
10f0d1
 	}
10f0d1
 	
10f0d1
-	private Set<String> stopWords;
10f0d1
+	private List<String> stopWords;
10f0d1
 	
10f0d1
-	private Set<String> getStopWords() {
10f0d1
+	private List<String> getStopWords() {
10f0d1
 		if ( stopWords == null ) {
10f0d1
-			stopWords = new HashSet<String>();
10f0d1
+			stopWords = new ArrayList<String>();
10f0d1
 			for (int i = 0; i < STOP_WORDS.length; i++) {
10f0d1
 			    stopWords.add(STOP_WORDS[i]);
10f0d1
 			}
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/DefaultAnalyzer.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/DefaultAnalyzer.java
10f0d1
index 50258d2..f72615f 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/DefaultAnalyzer.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/DefaultAnalyzer.java
10f0d1
@@ -15,8 +15,10 @@ import java.util.StringTokenizer;
10f0d1
 import com.ibm.icu.text.BreakIterator;
10f0d1
 
10f0d1
 import org.apache.lucene.analysis.Analyzer;
10f0d1
-import org.apache.lucene.analysis.LowerCaseFilter;
10f0d1
+import org.apache.lucene.analysis.core.LowerCaseFilter;
10f0d1
+import org.apache.lucene.analysis.Tokenizer;
10f0d1
 import org.apache.lucene.analysis.TokenStream;
10f0d1
+import org.apache.lucene.util.Version;
10f0d1
 
10f0d1
 import org.eclipse.help.internal.base.HelpBasePlugin;
10f0d1
 
10f0d1
@@ -82,11 +84,14 @@ public final class DefaultAnalyzer extends Analyzer {
10f0d1
 	}
10f0d1
 
10f0d1
 	/**
10f0d1
-	 * Creates a TokenStream which tokenizes all the text in the provided
10f0d1
+	 * Creates a TokenStreamComponents which tokenizes all the text in the provided
10f0d1
 	 * Reader.
10f0d1
 	 */
10f0d1
-	public final TokenStream tokenStream(String fieldName, Reader reader) {
10f0d1
-		return new LowerCaseFilter(new WordTokenStream(fieldName, reader, locale));
10f0d1
+	@Override
10f0d1
+	public final TokenStreamComponents createComponents(String fieldName, Reader reader) {
10f0d1
+		Tokenizer source = new WordTokenStream(fieldName, reader, locale);
10f0d1
+		LowerCaseFilter filter = new LowerCaseFilter(Version.LUCENE_47, source);
10f0d1
+		return new TokenStreamComponents(source, filter);
10f0d1
 	}
10f0d1
 
10f0d1
 	/**
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/LowerCaseAndDigitsTokenizer.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/LowerCaseAndDigitsTokenizer.java
10f0d1
index 0dd3943..d101ae9 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/LowerCaseAndDigitsTokenizer.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/LowerCaseAndDigitsTokenizer.java
10f0d1
@@ -12,7 +12,8 @@ package org.eclipse.help.internal.search;
10f0d1
 
10f0d1
 import java.io.*;
10f0d1
 
10f0d1
-import org.apache.lucene.analysis.*;
10f0d1
+import org.apache.lucene.analysis.util.*;
10f0d1
+import org.apache.lucene.util.Version;
10f0d1
 
10f0d1
 /**
10f0d1
  * Tokenizer breaking words around letters or digits.
10f0d1
@@ -20,13 +21,14 @@ import org.apache.lucene.analysis.*;
10f0d1
 public class LowerCaseAndDigitsTokenizer extends CharTokenizer {
10f0d1
 
10f0d1
     public LowerCaseAndDigitsTokenizer(Reader input) {
10f0d1
-        super(input);
10f0d1
+        super(Version.LUCENE_47, input);
10f0d1
     }
10f0d1
     protected char normalize(char c) {
10f0d1
         return Character.toLowerCase(c);
10f0d1
     }
10f0d1
 
10f0d1
-    protected boolean isTokenChar(char c) {
10f0d1
+    @Override
10f0d1
+    public boolean isTokenChar(int c) {
10f0d1
         return Character.isLetterOrDigit(c);
10f0d1
     }
10f0d1
 
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/QueryBuilder.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/QueryBuilder.java
10f0d1
index 00c2799..9f9962d 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/QueryBuilder.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/QueryBuilder.java
10f0d1
@@ -243,16 +243,24 @@ public class QueryBuilder {
10f0d1
 	private List<String> analyzeText(Analyzer analyzer, String fieldName, String text) {
10f0d1
 		List<String> words = new ArrayList<String>(1);
10f0d1
 		Reader reader = new StringReader(text);
10f0d1
-		TokenStream tStream = analyzer.tokenStream(fieldName, reader);
10f0d1
 		
10f0d1
-		CharTermAttribute termAttribute = (CharTermAttribute) tStream.getAttribute(CharTermAttribute.class);
10f0d1
+		TokenStream tStream = null;
10f0d1
 		try {
10f0d1
+			tStream = analyzer.tokenStream(fieldName, reader);
10f0d1
+			tStream.reset();
10f0d1
+			CharTermAttribute termAttribute = (CharTermAttribute) tStream.getAttribute(CharTermAttribute.class);
10f0d1
 			while (tStream.incrementToken()) {
10f0d1
 				String term = termAttribute.toString();
10f0d1
 				words.add(term);
10f0d1
 			}
10f0d1
-			reader.close();
10f0d1
 		} catch (IOException ioe) {
10f0d1
+		} finally {
10f0d1
+			if (tStream != null) {
10f0d1
+				try {
10f0d1
+					tStream.close();
10f0d1
+				} catch (IOException e) {
10f0d1
+				}
10f0d1
+			}
10f0d1
 		}
10f0d1
 		
10f0d1
 		return words;
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SearchIndex.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SearchIndex.java
10f0d1
index e860c8d..0d5a8b6 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SearchIndex.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SearchIndex.java
10f0d1
@@ -31,13 +31,20 @@ import java.util.Set;
10f0d1
 import java.util.zip.ZipEntry;
10f0d1
 import java.util.zip.ZipInputStream;
10f0d1
 
10f0d1
+import org.apache.lucene.analysis.Analyzer;
10f0d1
+import org.apache.lucene.analysis.miscellaneous.LimitTokenCountAnalyzer;
10f0d1
 import org.apache.lucene.document.Document;
10f0d1
 import org.apache.lucene.document.Field;
10f0d1
+import org.apache.lucene.index.AtomicReader;
10f0d1
+import org.apache.lucene.index.DirectoryReader;
10f0d1
+import org.apache.lucene.index.DocsEnum;
10f0d1
 import org.apache.lucene.index.IndexReader;
10f0d1
 import org.apache.lucene.index.IndexWriter;
10f0d1
+import org.apache.lucene.index.IndexWriterConfig;
10f0d1
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
10f0d1
+import org.apache.lucene.index.LogDocMergePolicy;
10f0d1
+import org.apache.lucene.index.SlowCompositeReaderWrapper;
10f0d1
 import org.apache.lucene.index.Term;
10f0d1
-import org.apache.lucene.index.TermDocs;
10f0d1
-import org.apache.lucene.index.IndexWriter.MaxFieldLength;
10f0d1
 import org.apache.lucene.search.BooleanQuery;
10f0d1
 import org.apache.lucene.search.IndexSearcher;
10f0d1
 import org.apache.lucene.search.Query;
10f0d1
@@ -265,10 +272,10 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			if (iw != null) {
10f0d1
 				iw.close();
10f0d1
 			}
10f0d1
-			boolean create = false;
10f0d1
+			OpenMode create = OpenMode.APPEND;
10f0d1
 			if (!indexDir.exists() || !isLuceneCompatible() || !isAnalyzerCompatible()
10f0d1
 					|| inconsistencyFile.exists() && firstOperation) {
10f0d1
-				create = true;
10f0d1
+				create = OpenMode.CREATE;
10f0d1
 				indexDir.mkdirs();
10f0d1
 				if (!indexDir.exists())
10f0d1
 					return false; // unable to setup index directory
10f0d1
@@ -276,9 +283,13 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			indexedDocs = new HelpProperties(INDEXED_DOCS_FILE, indexDir);
10f0d1
 			indexedDocs.restore();
10f0d1
 			setInconsistent(true);
10f0d1
-			MaxFieldLength max = new MaxFieldLength(1000000);
10f0d1
-			iw = new IndexWriter(luceneDirectory, analyzerDescriptor.getAnalyzer(), create, max);
10f0d1
-			iw.setMergeFactor(20);
10f0d1
+			Analyzer wrapper = new LimitTokenCountAnalyzer(analyzerDescriptor.getAnalyzer(), 1000000);
10f0d1
+			IndexWriterConfig iconfig = new IndexWriterConfig(org.apache.lucene.util.Version.LUCENE_47, wrapper);
10f0d1
+			iconfig.setOpenMode(create);
10f0d1
+			LogDocMergePolicy policy = new LogDocMergePolicy();
10f0d1
+			policy.setMergeFactor(20);
10f0d1
+			iconfig.setMergePolicy(policy);
10f0d1
+			iw = new IndexWriter(luceneDirectory, iconfig);
10f0d1
 			return true;
10f0d1
 		} catch (IOException e) {
10f0d1
 			HelpBasePlugin.logError("Exception occurred in search indexing at beginAddBatch.", e); //$NON-NLS-1$
10f0d1
@@ -297,7 +308,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			indexedDocs = new HelpProperties(INDEXED_DOCS_FILE, indexDir);
10f0d1
 			indexedDocs.restore();
10f0d1
 			setInconsistent(true);
10f0d1
-			ir = IndexReader.open(luceneDirectory, false);
10f0d1
+			ir = DirectoryReader.open(luceneDirectory);
10f0d1
 			return true;
10f0d1
 		} catch (IOException e) {
10f0d1
 			HelpBasePlugin.logError("Exception occurred in search indexing at beginDeleteBatch.", e); //$NON-NLS-1$
10f0d1
@@ -313,7 +324,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			if (ir != null) {
10f0d1
 				ir.close();
10f0d1
 			}
10f0d1
-			ir = IndexReader.open(luceneDirectory, false);
10f0d1
+			ir = DirectoryReader.open(luceneDirectory);
10f0d1
 			return true;
10f0d1
 		} catch (IOException e) {
10f0d1
 			HelpBasePlugin.logError("Exception occurred in search indexing at beginDeleteBatch.", e); //$NON-NLS-1$
10f0d1
@@ -331,7 +342,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 	public IStatus removeDocument(String name) {
10f0d1
 		Term term = new Term(FIELD_NAME, name);
10f0d1
 		try {
10f0d1
-			ir.deleteDocuments(term);
10f0d1
+			iw.deleteDocuments(term);
10f0d1
 			indexedDocs.remove(name);
10f0d1
 		} catch (IOException e) {
10f0d1
 			return new Status(IStatus.ERROR, HelpBasePlugin.PLUGIN_ID, IStatus.ERROR,
10f0d1
@@ -350,7 +361,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			if (iw == null)
10f0d1
 				return false;
10f0d1
 			if (optimize)
10f0d1
-				iw.optimize();
10f0d1
+				iw.forceMerge(1);
10f0d1
 			iw.close();
10f0d1
 			iw = null;
10f0d1
 			// save the update info:
10f0d1
@@ -369,7 +380,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			 * know about this change. Close it so that it gets reloaded next search.
10f0d1
 			 */
10f0d1
 			if (searcher != null) {
10f0d1
-				searcher.close();
10f0d1
+				searcher.getIndexReader().close();
10f0d1
 				searcher = null;
10f0d1
 			}
10f0d1
 			return true;
10f0d1
@@ -401,7 +412,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 			 * know about this change. Close it so that it gets reloaded next search.
10f0d1
 			 */
10f0d1
 			if (searcher != null) {
10f0d1
-				searcher.close();
10f0d1
+				searcher.getIndexReader().close();
10f0d1
 				searcher = null;
10f0d1
 			}
10f0d1
 			return true;
10f0d1
@@ -505,8 +516,8 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 		}
10f0d1
 		Directory[] luceneDirs = dirList.toArray(new Directory[dirList.size()]);
10f0d1
 		try {
10f0d1
-			iw.addIndexesNoOptimize(luceneDirs);
10f0d1
-			iw.optimize();
10f0d1
+			iw.addIndexes(luceneDirs);
10f0d1
+			iw.forceMerge(1);
10f0d1
 		} catch (IOException ioe) {
10f0d1
 			HelpBasePlugin.logError("Merging search indexes failed.", ioe); //$NON-NLS-1$
10f0d1
 			return new HashMap<String, String[]>();
10f0d1
@@ -515,18 +526,19 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 	}
10f0d1
 
10f0d1
 	public IStatus removeDuplicates(String name, String[] index_paths) {
10f0d1
-		TermDocs hrefDocs = null;
10f0d1
-		TermDocs indexDocs = null;
10f0d1
-		Term hrefTerm = new Term(FIELD_NAME, name);
10f0d1
 		try {
10f0d1
+			AtomicReader ar = SlowCompositeReaderWrapper.wrap(ir);
10f0d1
+			DocsEnum hrefDocs = null;
10f0d1
+			DocsEnum indexDocs = null;
10f0d1
+			Term hrefTerm = new Term(FIELD_NAME, name);
10f0d1
 			for (int i = 0; i < index_paths.length; i++) {
10f0d1
 				Term indexTerm = new Term(FIELD_INDEX_ID, index_paths[i]);
10f0d1
 				if (i == 0) {
10f0d1
-					hrefDocs = ir.termDocs(hrefTerm);
10f0d1
-					indexDocs = ir.termDocs(indexTerm);
10f0d1
+					hrefDocs = ar.termDocsEnum(hrefTerm);
10f0d1
+					indexDocs = ar.termDocsEnum(indexTerm);
10f0d1
 				} else {
10f0d1
-					hrefDocs.seek(hrefTerm);
10f0d1
-					indexDocs.seek(indexTerm);
10f0d1
+					hrefDocs = ar.termDocsEnum(hrefTerm);
10f0d1
+					indexDocs = ar.termDocsEnum(indexTerm);
10f0d1
 				}
10f0d1
 				removeDocuments(hrefDocs, indexDocs);
10f0d1
 			}
10f0d1
@@ -535,19 +547,6 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 					"IO exception occurred while removing duplicates of document " + name //$NON-NLS-1$
10f0d1
 							+ " from index " + indexDir.getAbsolutePath() + ".", //$NON-NLS-1$ //$NON-NLS-2$
10f0d1
 					ioe);
10f0d1
-		} finally {
10f0d1
-			if (hrefDocs != null) {
10f0d1
-				try {
10f0d1
-					hrefDocs.close();
10f0d1
-				} catch (IOException e) {
10f0d1
-				}
10f0d1
-			}
10f0d1
-			if (indexDocs != null) {
10f0d1
-				try {
10f0d1
-					indexDocs.close();
10f0d1
-				} catch (IOException e) {
10f0d1
-				}
10f0d1
-			}
10f0d1
 		}
10f0d1
 		return Status.OK_STATUS;
10f0d1
 	}
10f0d1
@@ -559,33 +558,33 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 	 * @param docs2
10f0d1
 	 * @throws IOException
10f0d1
 	 */
10f0d1
-	private void removeDocuments(TermDocs doc1, TermDocs docs2) throws IOException {
10f0d1
-		if (!doc1.next()) {
10f0d1
+	private void removeDocuments(DocsEnum doc1, DocsEnum docs2) throws IOException {
10f0d1
+		if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 			return;
10f0d1
 		}
10f0d1
-		if (!docs2.next()) {
10f0d1
+		if (docs2.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 			return;
10f0d1
 		}
10f0d1
 		while (true) {
10f0d1
-			if (doc1.doc() < docs2.doc()) {
10f0d1
-				if (!doc1.skipTo(docs2.doc())) {
10f0d1
-					if (!doc1.next()) {
10f0d1
+			if (doc1.docID() < docs2.docID()) {
10f0d1
+				if (doc1.advance(docs2.docID()) == DocsEnum.NO_MORE_DOCS) {
10f0d1
+					if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 						return;
10f0d1
 					}
10f0d1
 				}
10f0d1
-			} else if (doc1.doc() > docs2.doc()) {
10f0d1
-				if (!docs2.skipTo(doc1.doc())) {
10f0d1
-					if (!doc1.next()) {
10f0d1
+			} else if (doc1.docID() > docs2.docID()) {
10f0d1
+				if (docs2.advance(doc1.docID()) == DocsEnum.NO_MORE_DOCS) {
10f0d1
+					if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 						return;
10f0d1
 					}
10f0d1
 				}
10f0d1
 			}
10f0d1
-			if (doc1.doc() == docs2.doc()) {
10f0d1
-				ir.deleteDocument(doc1.doc());
10f0d1
-				if (!doc1.next()) {
10f0d1
+			if (doc1.docID() == docs2.docID()) {
10f0d1
+				iw.tryDeleteDocument(ir, doc1.docID());
10f0d1
+				if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 					return;
10f0d1
 				}
10f0d1
-				if (!docs2.next()) {
10f0d1
+				if (docs2.nextDoc() == DocsEnum.NO_MORE_DOCS) {
10f0d1
 					return;
10f0d1
 				}
10f0d1
 			}
10f0d1
@@ -792,7 +791,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 	public void openSearcher() throws IOException {
10f0d1
 		synchronized (searcherCreateLock) {
10f0d1
 			if (searcher == null) {
10f0d1
-				searcher = new IndexSearcher(luceneDirectory, false);
10f0d1
+				searcher = new IndexSearcher(DirectoryReader.open(luceneDirectory));
10f0d1
 			}
10f0d1
 		}
10f0d1
 	}
10f0d1
@@ -814,7 +813,7 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 				if (searches.isEmpty()) {
10f0d1
 					if (searcher != null) {
10f0d1
 						try {
10f0d1
-							searcher.close();
10f0d1
+							searcher.getIndexReader().close();
10f0d1
 						} catch (IOException ioe) {
10f0d1
 						}
10f0d1
 					}
10f0d1
@@ -888,9 +887,11 @@ public class SearchIndex implements IHelpSearchIndex {
10f0d1
 	 */
10f0d1
 	private void cleanOldIndex() {
10f0d1
 		IndexWriter cleaner = null;
10f0d1
-		MaxFieldLength max = new MaxFieldLength(10000);
10f0d1
 		try {
10f0d1
-			cleaner = new IndexWriter(luceneDirectory, analyzerDescriptor.getAnalyzer(), true, max);
10f0d1
+			Analyzer wrapper = new LimitTokenCountAnalyzer(analyzerDescriptor.getAnalyzer(), 10000);
10f0d1
+			IndexWriterConfig iconfig = new IndexWriterConfig(org.apache.lucene.util.Version.LUCENE_47, wrapper);
10f0d1
+			iconfig.setOpenMode(OpenMode.CREATE);
10f0d1
+			cleaner = new IndexWriter(luceneDirectory, iconfig);
10f0d1
 		} catch (IOException ioe) {
10f0d1
 		} finally {
10f0d1
 			try {
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SmartAnalyzer.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SmartAnalyzer.java
10f0d1
index d0a7bb7..df31d89 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SmartAnalyzer.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/SmartAnalyzer.java
10f0d1
@@ -18,7 +18,7 @@ import org.apache.lucene.analysis.*;
10f0d1
  * Smart Analyzer. Chooses underlying implementation based on the field which
10f0d1
  * text is analyzed.
10f0d1
  */
10f0d1
-public final class SmartAnalyzer extends Analyzer {
10f0d1
+public final class SmartAnalyzer extends AnalyzerWrapper {
10f0d1
 	Analyzer pluggedInAnalyzer;
10f0d1
 	Analyzer exactAnalyzer;
10f0d1
 
10f0d1
@@ -31,14 +31,14 @@ public final class SmartAnalyzer extends Analyzer {
10f0d1
 		this.exactAnalyzer = new DefaultAnalyzer(locale);
10f0d1
 	}
10f0d1
 	/**
10f0d1
-	 * Creates a TokenStream which tokenizes all the text in the provided
10f0d1
-	 * Reader. Delegates to DefaultAnalyzer when field used to search for exact
10f0d1
+	 * Delegates to DefaultAnalyzer when field used to search for exact
10f0d1
 	 * match, and to plugged-in analyzer for other fields.
10f0d1
 	 */
10f0d1
-	public final TokenStream tokenStream(String fieldName, Reader reader) {
10f0d1
+	@Override
10f0d1
+	public final Analyzer getWrappedAnalyzer(String fieldName) {
10f0d1
 		if (fieldName != null && fieldName.startsWith("exact_")) { //$NON-NLS-1$
10f0d1
-			return exactAnalyzer.tokenStream(fieldName, reader);
10f0d1
+			return exactAnalyzer;
10f0d1
 		}
10f0d1
-		return pluggedInAnalyzer.tokenStream(fieldName, reader);
10f0d1
+		return pluggedInAnalyzer;
10f0d1
 	}
10f0d1
 }
10f0d1
diff --git a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/WordTokenStream.java b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/WordTokenStream.java
10f0d1
index 1360599..f622417 100644
10f0d1
--- a/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/WordTokenStream.java
10f0d1
+++ b/eclipse.platform.ua/org.eclipse.help.base/src/org/eclipse/help/internal/search/WordTokenStream.java
10f0d1
@@ -35,6 +35,7 @@ public final class WordTokenStream extends Tokenizer {
10f0d1
 	 * Constructor
10f0d1
 	 */
10f0d1
 	public WordTokenStream(String fieldName, Reader reader, Locale locale) {
10f0d1
+		super(reader);
10f0d1
 		this.reader = reader;
10f0d1
 		boundary = BreakIterator.getWordInstance(locale);
10f0d1
 
10f0d1
@@ -105,6 +106,7 @@ public final class WordTokenStream extends Tokenizer {
10f0d1
 	}
10f0d1
 	  
10f0d1
 	public void close() throws IOException {
10f0d1
+		super.close();
10f0d1
 		/// Unlikely to be called as this is a reused
10f0d1
 	    if (this.reader != null) {
10f0d1
 	    	this.reader.close();