diff --git a/eclipse-help-doc-adjust-dependencies.patch b/eclipse-help-doc-adjust-dependencies.patch
index 8716eaa..beaf499 100644
--- a/eclipse-help-doc-adjust-dependencies.patch
+++ b/eclipse-help-doc-adjust-dependencies.patch
@@ -1,7 +1,8 @@
-diff -r -Nu eclipse-3.8.0-M1-src/features/org.eclipse.help/feature.xml eclipse-3.8.0-M1-src.patched/features/org.eclipse.help/feature.xml
---- eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml 2011-03-27 10:30:27.000000000 -0400
-+++ eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml 2011-08-23 14:01:19.026328809 -0400
-@@ -36,7 +36,7 @@
+diff --git a/eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml b/eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml
+index c63d1e1..8e7cc30 100644
+--- a/eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml
++++ b/eclipse.platform.releng/features/org.eclipse.help-feature/feature.xml
+@@ -42,7 +42,7 @@
unpack="false"/>
+
+ eclipse-plugin
+- org.apache.lucene
+- [3.5,4.0)
++ org.apache.lucene.core
++ [3.5,5.0)
+
+
+ eclipse-plugin
+ org.apache.lucene.analysis
+- [3.5,4.0)
++ [3.5,5.0)
+
+
+
+diff --git a/eclipse.platform.ua/org.eclipse.help.base/META-INF/MANIFEST.MF b/eclipse.platform.ua/org.eclipse.help.base/META-INF/MANIFEST.MF
+index 0af7e6b..1985d9e 100644
+--- a/eclipse.platform.ua/org.eclipse.help.base/META-INF/MANIFEST.MF
++++ b/eclipse.platform.ua/org.eclipse.help.base/META-INF/MANIFEST.MF
+@@ -43,8 +43,8 @@ Require-Bundle: org.eclipse.ant.core;bundle-version="3.2.200";resolution:=option
+ org.eclipse.core.runtime;bundle-version="3.6.0",
+ org.eclipse.help;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
+ org.eclipse.core.expressions;bundle-version="[3.4.200,4.0.0)",
+- org.apache.lucene.analysis;bundle-version="[3.5.0,4.0.0)",
+- org.apache.lucene.core;bundle-version="[3.5.0,4.0.0)"
++ org.apache.lucene.analysis;bundle-version="[3.5.0,5.0.0)",
++ org.apache.lucene.core;bundle-version="[3.5.0,5.0.0)"
+ Import-Package: com.ibm.icu.text,
+ org.eclipse.equinox.http.jetty;resolution:=optional
+ Bundle-RequiredExecutionEnvironment: J2SE-1.5
+diff --git a/eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF b/eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF
+index 12beb8e..e20ea19 100644
+--- a/eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF
++++ b/eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF
+@@ -25,9 +25,9 @@ Bundle-Vendor: Eclipse.org
+ Bundle-ClassPath: ua-tests.jar
+ Import-Package: javax.servlet;version="2.4.0",
+ javax.servlet.http;version="2.4.0",
+- org.apache.lucene.index;core=split;version="[3.5.0,4.0.0)",
+- org.apache.lucene.search;core=split;version="[3.5.0,4.0.0)",
+- org.apache.lucene.store;core=split;version="[3.5.0,4.0.0)"
++ org.apache.lucene.index;version="[3.5.0,5.0.0)",
++ org.apache.lucene.search;version="[3.5.0,5.0.0)",
++ org.apache.lucene.store;version="[3.5.0,5.0.0)"
+ Bundle-RequiredExecutionEnvironment: J2SE-1.5
+ Export-Package: org.eclipse.ua.tests,
+ org.eclipse.ua.tests.browser,
+diff --git a/eclipse.platform.ua/org.eclipse.ua.tests/pom.xml b/eclipse.platform.ua/org.eclipse.ua.tests/pom.xml
+index 06eb56f..d7b592d 100644
+--- a/eclipse.platform.ua/org.eclipse.ua.tests/pom.xml
++++ b/eclipse.platform.ua/org.eclipse.ua.tests/pom.xml
+@@ -20,4 +20,29 @@
org.eclipse.ua.tests
3.3.600-SNAPSHOT
eclipse-test-plugin
@@ -37,12 +93,12 @@ diff -r -Nu eclipse-3.8.0-M1-src/features/org.eclipse.help/feature.xml eclipse-3
+
+ eclipse-plugin
+ org.apache.lucene.core
-+ [3.0,4.0)
++ [3.0,5.0)
+
+
+ eclipse-plugin
+ org.apache.lucene.analysis
-+ [3.0,4.0)
++ [3.0,5.0)
+
+
+
@@ -51,29 +107,23 @@ diff -r -Nu eclipse-3.8.0-M1-src/features/org.eclipse.help/feature.xml eclipse-3
+
+
- --- eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF.orig 2013-02-20 17:00:07.000000000 +0100
-+++ eclipse.platform.ua/org.eclipse.ua.tests/META-INF/MANIFEST.MF 2013-02-21 16:29:42.318407536 +0100
-@@ -25,9 +25,9 @@
- Bundle-ClassPath: ua-tests.jar
- Import-Package: javax.servlet;version="2.4.0",
- javax.servlet.http;version="2.4.0",
-- org.apache.lucene.index;core=split;version="[3.5.0,4.0.0)",
-- org.apache.lucene.search;core=split;version="[3.5.0,4.0.0)",
-- org.apache.lucene.store;core=split;version="[3.5.0,4.0.0)"
-+ org.apache.lucene.index;version="[3.5.0,4.0.0)",
-+ org.apache.lucene.search;version="[3.5.0,4.0.0)",
-+ org.apache.lucene.store;version="[3.5.0,4.0.0)"
- Bundle-RequiredExecutionEnvironment: J2SE-1.5
- Export-Package: org.eclipse.ua.tests,
- org.eclipse.ua.tests.browser,
---- eclipse.platform.releng/features/org.eclipse.help-feature/pom.xml.bak 2013-03-14 11:18:11.000000000 +0100
-+++ eclipse.platform.releng/features/org.eclipse.help-feature/pom.xml 2013-03-14 12:29:48.067564008 +0100
-@@ -31,7 +31,7 @@
-
+diff --git a/eclipse.platform.ua/pom.xml b/eclipse.platform.ua/pom.xml
+index 927e027..c2480a8 100644
+--- a/eclipse.platform.ua/pom.xml
++++ b/eclipse.platform.ua/pom.xml
+@@ -59,12 +59,12 @@
eclipse-plugin
-- org.apache.lucene
-+ org.apache.lucene.core
- [3.5,4.0)
+ org.apache.lucene
+- [3.5,4.0)
++ [3.5,5.0)
+ eclipse-plugin
+ org.apache.lucene.analysis
+- [3.5,4.0)
++ [3.5,5.0)
+
+
+
+
diff --git a/eclipse-lucene-4.patch b/eclipse-lucene-4.patch
new file mode 100644
index 0000000..49da5e4
--- /dev/null
+++ b/eclipse-lucene-4.patch
@@ -0,0 +1,425 @@
+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
+index 4e6786c..49dc51b 100644
+--- 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
+@@ -10,10 +10,14 @@
+ *******************************************************************************/
+ package org.eclipse.help.internal.search;
+ import java.io.*;
+-import java.util.HashSet;
+-import java.util.Set;
++import java.util.ArrayList;
++import java.util.List;
+
+ import org.apache.lucene.analysis.*;
++import org.apache.lucene.analysis.en.*;
++import org.apache.lucene.analysis.core.*;
++import org.apache.lucene.analysis.util.*;
++import org.apache.lucene.util.Version;
+ /**
+ * Lucene Analyzer for English. LowerCaseTokenizer->StopFilter->PorterStemFilter
+ */
+@@ -25,18 +29,22 @@ public final class Analyzer_en extends Analyzer {
+ super();
+ }
+ /**
+- * Creates a TokenStream which tokenizes all the text in the provided
++ * Creates a TokenStreamComponents which tokenizes all the text in the provided
+ * Reader.
+ */
+- public final TokenStream tokenStream(String fieldName, Reader reader) {
+- return new PorterStemFilter(new StopFilter(false, new LowerCaseAndDigitsTokenizer(reader), getStopWords(), false));
++ @Override
++ public final TokenStreamComponents createComponents(String fieldName, Reader reader) {
++ CharArraySet stopWordsSet = StopFilter.makeStopSet(Version.LUCENE_47, getStopWords(), true);
++ Tokenizer source = new LowerCaseAndDigitsTokenizer(reader);
++ TokenStream filter = new PorterStemFilter(new StopFilter(Version.LUCENE_47, source, stopWordsSet));
++ return new TokenStreamComponents(source, filter);
+ }
+
+- private Set stopWords;
++ private List stopWords;
+
+- private Set getStopWords() {
++ private List getStopWords() {
+ if ( stopWords == null ) {
+- stopWords = new HashSet();
++ stopWords = new ArrayList();
+ for (int i = 0; i < STOP_WORDS.length; i++) {
+ stopWords.add(STOP_WORDS[i]);
+ }
+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
+index 50258d2..f72615f 100644
+--- 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
+@@ -15,8 +15,10 @@ import java.util.StringTokenizer;
+ import com.ibm.icu.text.BreakIterator;
+
+ import org.apache.lucene.analysis.Analyzer;
+-import org.apache.lucene.analysis.LowerCaseFilter;
++import org.apache.lucene.analysis.core.LowerCaseFilter;
++import org.apache.lucene.analysis.Tokenizer;
+ import org.apache.lucene.analysis.TokenStream;
++import org.apache.lucene.util.Version;
+
+ import org.eclipse.help.internal.base.HelpBasePlugin;
+
+@@ -82,11 +84,14 @@ public final class DefaultAnalyzer extends Analyzer {
+ }
+
+ /**
+- * Creates a TokenStream which tokenizes all the text in the provided
++ * Creates a TokenStreamComponents which tokenizes all the text in the provided
+ * Reader.
+ */
+- public final TokenStream tokenStream(String fieldName, Reader reader) {
+- return new LowerCaseFilter(new WordTokenStream(fieldName, reader, locale));
++ @Override
++ public final TokenStreamComponents createComponents(String fieldName, Reader reader) {
++ Tokenizer source = new WordTokenStream(fieldName, reader, locale);
++ LowerCaseFilter filter = new LowerCaseFilter(Version.LUCENE_47, source);
++ return new TokenStreamComponents(source, filter);
+ }
+
+ /**
+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
+index 0dd3943..d101ae9 100644
+--- 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
+@@ -12,7 +12,8 @@ package org.eclipse.help.internal.search;
+
+ import java.io.*;
+
+-import org.apache.lucene.analysis.*;
++import org.apache.lucene.analysis.util.*;
++import org.apache.lucene.util.Version;
+
+ /**
+ * Tokenizer breaking words around letters or digits.
+@@ -20,13 +21,14 @@ import org.apache.lucene.analysis.*;
+ public class LowerCaseAndDigitsTokenizer extends CharTokenizer {
+
+ public LowerCaseAndDigitsTokenizer(Reader input) {
+- super(input);
++ super(Version.LUCENE_47, input);
+ }
+ protected char normalize(char c) {
+ return Character.toLowerCase(c);
+ }
+
+- protected boolean isTokenChar(char c) {
++ @Override
++ public boolean isTokenChar(int c) {
+ return Character.isLetterOrDigit(c);
+ }
+
+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
+index 00c2799..4a3d34f 100644
+--- 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
+@@ -243,10 +243,10 @@ public class QueryBuilder {
+ private List analyzeText(Analyzer analyzer, String fieldName, String text) {
+ List words = new ArrayList(1);
+ Reader reader = new StringReader(text);
+- TokenStream tStream = analyzer.tokenStream(fieldName, reader);
+
+- CharTermAttribute termAttribute = (CharTermAttribute) tStream.getAttribute(CharTermAttribute.class);
+ try {
++ TokenStream tStream = analyzer.tokenStream(fieldName, reader);
++ CharTermAttribute termAttribute = (CharTermAttribute) tStream.getAttribute(CharTermAttribute.class);
+ while (tStream.incrementToken()) {
+ String term = termAttribute.toString();
+ words.add(term);
+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
+index e860c8d..0d5a8b6 100644
+--- 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
+@@ -31,13 +31,20 @@ import java.util.Set;
+ import java.util.zip.ZipEntry;
+ import java.util.zip.ZipInputStream;
+
++import org.apache.lucene.analysis.Analyzer;
++import org.apache.lucene.analysis.miscellaneous.LimitTokenCountAnalyzer;
+ import org.apache.lucene.document.Document;
+ import org.apache.lucene.document.Field;
++import org.apache.lucene.index.AtomicReader;
++import org.apache.lucene.index.DirectoryReader;
++import org.apache.lucene.index.DocsEnum;
+ import org.apache.lucene.index.IndexReader;
+ import org.apache.lucene.index.IndexWriter;
++import org.apache.lucene.index.IndexWriterConfig;
++import org.apache.lucene.index.IndexWriterConfig.OpenMode;
++import org.apache.lucene.index.LogDocMergePolicy;
++import org.apache.lucene.index.SlowCompositeReaderWrapper;
+ import org.apache.lucene.index.Term;
+-import org.apache.lucene.index.TermDocs;
+-import org.apache.lucene.index.IndexWriter.MaxFieldLength;
+ import org.apache.lucene.search.BooleanQuery;
+ import org.apache.lucene.search.IndexSearcher;
+ import org.apache.lucene.search.Query;
+@@ -265,10 +272,10 @@ public class SearchIndex implements IHelpSearchIndex {
+ if (iw != null) {
+ iw.close();
+ }
+- boolean create = false;
++ OpenMode create = OpenMode.APPEND;
+ if (!indexDir.exists() || !isLuceneCompatible() || !isAnalyzerCompatible()
+ || inconsistencyFile.exists() && firstOperation) {
+- create = true;
++ create = OpenMode.CREATE;
+ indexDir.mkdirs();
+ if (!indexDir.exists())
+ return false; // unable to setup index directory
+@@ -276,9 +283,13 @@ public class SearchIndex implements IHelpSearchIndex {
+ indexedDocs = new HelpProperties(INDEXED_DOCS_FILE, indexDir);
+ indexedDocs.restore();
+ setInconsistent(true);
+- MaxFieldLength max = new MaxFieldLength(1000000);
+- iw = new IndexWriter(luceneDirectory, analyzerDescriptor.getAnalyzer(), create, max);
+- iw.setMergeFactor(20);
++ Analyzer wrapper = new LimitTokenCountAnalyzer(analyzerDescriptor.getAnalyzer(), 1000000);
++ IndexWriterConfig iconfig = new IndexWriterConfig(org.apache.lucene.util.Version.LUCENE_47, wrapper);
++ iconfig.setOpenMode(create);
++ LogDocMergePolicy policy = new LogDocMergePolicy();
++ policy.setMergeFactor(20);
++ iconfig.setMergePolicy(policy);
++ iw = new IndexWriter(luceneDirectory, iconfig);
+ return true;
+ } catch (IOException e) {
+ HelpBasePlugin.logError("Exception occurred in search indexing at beginAddBatch.", e); //$NON-NLS-1$
+@@ -297,7 +308,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ indexedDocs = new HelpProperties(INDEXED_DOCS_FILE, indexDir);
+ indexedDocs.restore();
+ setInconsistent(true);
+- ir = IndexReader.open(luceneDirectory, false);
++ ir = DirectoryReader.open(luceneDirectory);
+ return true;
+ } catch (IOException e) {
+ HelpBasePlugin.logError("Exception occurred in search indexing at beginDeleteBatch.", e); //$NON-NLS-1$
+@@ -313,7 +324,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ if (ir != null) {
+ ir.close();
+ }
+- ir = IndexReader.open(luceneDirectory, false);
++ ir = DirectoryReader.open(luceneDirectory);
+ return true;
+ } catch (IOException e) {
+ HelpBasePlugin.logError("Exception occurred in search indexing at beginDeleteBatch.", e); //$NON-NLS-1$
+@@ -331,7 +342,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ public IStatus removeDocument(String name) {
+ Term term = new Term(FIELD_NAME, name);
+ try {
+- ir.deleteDocuments(term);
++ iw.deleteDocuments(term);
+ indexedDocs.remove(name);
+ } catch (IOException e) {
+ return new Status(IStatus.ERROR, HelpBasePlugin.PLUGIN_ID, IStatus.ERROR,
+@@ -350,7 +361,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ if (iw == null)
+ return false;
+ if (optimize)
+- iw.optimize();
++ iw.forceMerge(1);
+ iw.close();
+ iw = null;
+ // save the update info:
+@@ -369,7 +380,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ * know about this change. Close it so that it gets reloaded next search.
+ */
+ if (searcher != null) {
+- searcher.close();
++ searcher.getIndexReader().close();
+ searcher = null;
+ }
+ return true;
+@@ -401,7 +412,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ * know about this change. Close it so that it gets reloaded next search.
+ */
+ if (searcher != null) {
+- searcher.close();
++ searcher.getIndexReader().close();
+ searcher = null;
+ }
+ return true;
+@@ -505,8 +516,8 @@ public class SearchIndex implements IHelpSearchIndex {
+ }
+ Directory[] luceneDirs = dirList.toArray(new Directory[dirList.size()]);
+ try {
+- iw.addIndexesNoOptimize(luceneDirs);
+- iw.optimize();
++ iw.addIndexes(luceneDirs);
++ iw.forceMerge(1);
+ } catch (IOException ioe) {
+ HelpBasePlugin.logError("Merging search indexes failed.", ioe); //$NON-NLS-1$
+ return new HashMap();
+@@ -515,18 +526,19 @@ public class SearchIndex implements IHelpSearchIndex {
+ }
+
+ public IStatus removeDuplicates(String name, String[] index_paths) {
+- TermDocs hrefDocs = null;
+- TermDocs indexDocs = null;
+- Term hrefTerm = new Term(FIELD_NAME, name);
+ try {
++ AtomicReader ar = SlowCompositeReaderWrapper.wrap(ir);
++ DocsEnum hrefDocs = null;
++ DocsEnum indexDocs = null;
++ Term hrefTerm = new Term(FIELD_NAME, name);
+ for (int i = 0; i < index_paths.length; i++) {
+ Term indexTerm = new Term(FIELD_INDEX_ID, index_paths[i]);
+ if (i == 0) {
+- hrefDocs = ir.termDocs(hrefTerm);
+- indexDocs = ir.termDocs(indexTerm);
++ hrefDocs = ar.termDocsEnum(hrefTerm);
++ indexDocs = ar.termDocsEnum(indexTerm);
+ } else {
+- hrefDocs.seek(hrefTerm);
+- indexDocs.seek(indexTerm);
++ hrefDocs = ar.termDocsEnum(hrefTerm);
++ indexDocs = ar.termDocsEnum(indexTerm);
+ }
+ removeDocuments(hrefDocs, indexDocs);
+ }
+@@ -535,19 +547,6 @@ public class SearchIndex implements IHelpSearchIndex {
+ "IO exception occurred while removing duplicates of document " + name //$NON-NLS-1$
+ + " from index " + indexDir.getAbsolutePath() + ".", //$NON-NLS-1$ //$NON-NLS-2$
+ ioe);
+- } finally {
+- if (hrefDocs != null) {
+- try {
+- hrefDocs.close();
+- } catch (IOException e) {
+- }
+- }
+- if (indexDocs != null) {
+- try {
+- indexDocs.close();
+- } catch (IOException e) {
+- }
+- }
+ }
+ return Status.OK_STATUS;
+ }
+@@ -559,33 +558,33 @@ public class SearchIndex implements IHelpSearchIndex {
+ * @param docs2
+ * @throws IOException
+ */
+- private void removeDocuments(TermDocs doc1, TermDocs docs2) throws IOException {
+- if (!doc1.next()) {
++ private void removeDocuments(DocsEnum doc1, DocsEnum docs2) throws IOException {
++ if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+- if (!docs2.next()) {
++ if (docs2.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+ while (true) {
+- if (doc1.doc() < docs2.doc()) {
+- if (!doc1.skipTo(docs2.doc())) {
+- if (!doc1.next()) {
++ if (doc1.docID() < docs2.docID()) {
++ if (doc1.advance(docs2.docID()) == DocsEnum.NO_MORE_DOCS) {
++ if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+ }
+- } else if (doc1.doc() > docs2.doc()) {
+- if (!docs2.skipTo(doc1.doc())) {
+- if (!doc1.next()) {
++ } else if (doc1.docID() > docs2.docID()) {
++ if (docs2.advance(doc1.docID()) == DocsEnum.NO_MORE_DOCS) {
++ if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+ }
+ }
+- if (doc1.doc() == docs2.doc()) {
+- ir.deleteDocument(doc1.doc());
+- if (!doc1.next()) {
++ if (doc1.docID() == docs2.docID()) {
++ iw.tryDeleteDocument(ir, doc1.docID());
++ if (doc1.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+- if (!docs2.next()) {
++ if (docs2.nextDoc() == DocsEnum.NO_MORE_DOCS) {
+ return;
+ }
+ }
+@@ -792,7 +791,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ public void openSearcher() throws IOException {
+ synchronized (searcherCreateLock) {
+ if (searcher == null) {
+- searcher = new IndexSearcher(luceneDirectory, false);
++ searcher = new IndexSearcher(DirectoryReader.open(luceneDirectory));
+ }
+ }
+ }
+@@ -814,7 +813,7 @@ public class SearchIndex implements IHelpSearchIndex {
+ //
+ if (searcher != null) {
+ try {
+- searcher.close();
++ searcher.getIndexReader().close();
+ } catch (IOException ioe) {
+ }
+ }
+@@ -888,9 +887,11 @@ public class SearchIndex implements IHelpSearchIndex {
+ */
+ private void cleanOldIndex() {
+ IndexWriter cleaner = null;
+- MaxFieldLength max = new MaxFieldLength(10000);
+ try {
+- cleaner = new IndexWriter(luceneDirectory, analyzerDescriptor.getAnalyzer(), true, max);
++ Analyzer wrapper = new LimitTokenCountAnalyzer(analyzerDescriptor.getAnalyzer(), 10000);
++ IndexWriterConfig iconfig = new IndexWriterConfig(org.apache.lucene.util.Version.LUCENE_47, wrapper);
++ iconfig.setOpenMode(OpenMode.CREATE);
++ cleaner = new IndexWriter(luceneDirectory, iconfig);
+ } catch (IOException ioe) {
+ } finally {
+ try {
+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
+index d0a7bb7..df31d89 100644
+--- 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
+@@ -18,7 +18,7 @@ import org.apache.lucene.analysis.*;
+ * Smart Analyzer. Chooses underlying implementation based on the field which
+ * text is analyzed.
+ */
+-public final class SmartAnalyzer extends Analyzer {
++public final class SmartAnalyzer extends AnalyzerWrapper {
+ Analyzer pluggedInAnalyzer;
+ Analyzer exactAnalyzer;
+
+@@ -31,14 +31,14 @@ public final class SmartAnalyzer extends Analyzer {
+ this.exactAnalyzer = new DefaultAnalyzer(locale);
+ }
+ /**
+- * Creates a TokenStream which tokenizes all the text in the provided
+- * Reader. Delegates to DefaultAnalyzer when field used to search for exact
++ * Delegates to DefaultAnalyzer when field used to search for exact
+ * match, and to plugged-in analyzer for other fields.
+ */
+- public final TokenStream tokenStream(String fieldName, Reader reader) {
++ @Override
++ public final Analyzer getWrappedAnalyzer(String fieldName) {
+ if (fieldName != null && fieldName.startsWith("exact_")) { //$NON-NLS-1$
+- return exactAnalyzer.tokenStream(fieldName, reader);
++ return exactAnalyzer;
+ }
+- return pluggedInAnalyzer.tokenStream(fieldName, reader);
++ return pluggedInAnalyzer;
+ }
+ }
+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
+index 1360599..17ddbe4 100644
+--- 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
+@@ -35,6 +35,7 @@ public final class WordTokenStream extends Tokenizer {
+ * Constructor
+ */
+ public WordTokenStream(String fieldName, Reader reader, Locale locale) {
++ super(reader);
+ this.reader = reader;
+ boundary = BreakIterator.getWordInstance(locale);
+
diff --git a/eclipse.spec b/eclipse.spec
index d89f063..1c1c8d8 100644
--- a/eclipse.spec
+++ b/eclipse.spec
@@ -5,7 +5,7 @@
# Set to 1 to build Eclipse without dependency to eclipse-pde
# Some parts (help) will not be built, and second run will be required,
# but this is a way to bootstrap Eclipse on secondary archs.
-%global bootstrap 0
+%global bootstrap 1
Epoch: 1
@@ -20,7 +20,7 @@ Epoch: 1
%global eclipse_version %{eclipse_majmin}.%{eclipse_micro}
%global installation_loc %{_libdir}/%{pkg_name}
-%global _jetty_version 9
+%global _jetty_version 9.1.3
%{?scl:%global _jetty_version 8}
%ifarch %{ix86}
@@ -55,7 +55,7 @@ fi;
Summary: An open, extensible IDE
Name: %{?scl_prefix}eclipse
Version: %{eclipse_version}
-Release: 24%{?dist}
+Release: 24.1%{?dist}
License: EPL
Group: Development/Tools
URL: http://www.eclipse.org/
@@ -128,6 +128,7 @@ Patch20: %{pkg_name}-bug-408505.patch
Patch21: %{pkg_name}-bug-386377.patch
Patch22: %{pkg_name}-servlet-3.1.patch
+Patch23: %{pkg_name}-lucene-4.patch
BuildRequires: ant >= 1.8.3
BuildRequires: rsync
@@ -166,8 +167,7 @@ BuildRequires: osgi(org.eclipse.jetty.continuation) >= %{_jetty_version}
BuildRequires: osgi(org.eclipse.jetty.io) >= %{_jetty_version}
BuildRequires: osgi(org.eclipse.jetty.security) >= %{_jetty_version}
BuildRequires: osgi(org.eclipse.jetty.servlet) >= %{_jetty_version}
-BuildRequires: lucene >= 2.9.4-8
-BuildRequires: lucene-contrib >= 2.9.4-8
+BuildRequires: lucene >= 4.0.0-3
BuildRequires: junit >= 4.10-5
BuildRequires: hamcrest >= 0:1.1-11
BuildRequires: %{?scl_prefix}sat4j >= 2.3.5-1
@@ -243,8 +243,7 @@ Requires: osgi(org.eclipse.jetty.io) >= %{_jetty_version}
Requires: osgi(org.eclipse.jetty.security) >= %{_jetty_version}
Requires: osgi(org.eclipse.jetty.servlet) >= %{_jetty_version}
Requires: jsch >= 0.1.46-2
-Requires: lucene >= 2.9.4-8
-Requires: lucene-contrib >= 2.9.4-8
+Requires: lucene >= 4.0.0-3
Requires: %{?scl_prefix}sat4j >= 2.3.5-1
Requires: sac >= 1.3-12
Requires: xml-commons-apis >= 1.4.01-12
@@ -312,7 +311,7 @@ Eclipse Tests.
tar --strip-components=1 -xf %{SOURCE1}
-%patch0
+%patch0 -p1
%patch1
%patch2
%patch3
@@ -337,6 +336,7 @@ pushd rt.equinox.framework
%patch21 -p1
popd
%patch22
+%patch23 -p1
#Disable as many things as possible to make the build faster. We care only for Eclipse.
%pom_disable_module platform.sdk eclipse.platform.releng.tychoeclipsebuilder
@@ -1019,6 +1019,10 @@ fi
%{_libdir}/%{pkg_name}/plugins/org.eclipse.osgi.util_*
%changelog
+* Thu Mar 06 2014 Roland Grunberg - 1:4.3.1-24.1
+- Update to Lucene 4.
+- Enable bootstrap build to work around broken UA (Help) bundles.
+
* Thu Mar 6 2014 Alexander Kurtakov 1:4.3.1-24
- New e-b snapshot adapted to lucene changes.