Bug 510604 - Port to lucene 6

Additionally consume lucene as an OSGi bundle from orbit instead
of embedding lucene jars inside the index.lucene plug-in

Change-Id: I7dd687d345f2ffbd37a05ce2f32ed3579e7e1833
Signed-off-by: Mat Booth <mat.booth@redhat.com>
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/.classpath b/core/plugins/org.eclipse.dltk.core.index.lucene/.classpath
index 7376f74..098194c 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/.classpath
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/.classpath
@@ -1,8 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry exported="true" kind="lib" path="lib/lucene-analyzers-common-5.2.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/lucene-core-5.2.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/lucene-misc-5.2.1.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/META-INF/MANIFEST.MF b/core/plugins/org.eclipse.dltk.core.index.lucene/META-INF/MANIFEST.MF
index 391e23b..fd27727 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/META-INF/MANIFEST.MF
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/META-INF/MANIFEST.MF
@@ -8,11 +8,10 @@
 Bundle-Vendor: %Bundle-Vendor
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.core.resources,
- org.eclipse.dltk.core
+ org.eclipse.dltk.core,
+ org.apache.lucene.core;bundle-version="6.1.0",
+ org.apache.lucene.misc;bundle-version="6.1.0",
+ org.apache.lucene.analyzers-common;bundle-version="6.1.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: .,
- lib/lucene-analyzers-common-5.2.1.jar,
- lib/lucene-core-5.2.1.jar,
- lib/lucene-misc-5.2.1.jar
 Export-Package: org.eclipse.dltk.core.index.lucene
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/build.properties b/core/plugins/org.eclipse.dltk.core.index.lucene/build.properties
index eb43af9..665bfb0 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/build.properties
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/build.properties
@@ -14,8 +14,5 @@
                .,\
                plugin.xml,\
                plugin.properties,\
-               about.html,\
-               lib/lucene-analyzers-common-5.2.1.jar,\
-               lib/lucene-core-5.2.1.jar,\
-               lib/lucene-misc-5.2.1.jar
+               about.html
 source.. = src/
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-analyzers-common-5.2.1.jar b/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-analyzers-common-5.2.1.jar
deleted file mode 100644
index aaa26a1..0000000
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-analyzers-common-5.2.1.jar
+++ /dev/null
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-core-5.2.1.jar b/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-core-5.2.1.jar
deleted file mode 100644
index 18b887f..0000000
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-core-5.2.1.jar
+++ /dev/null
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-misc-5.2.1.jar b/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-misc-5.2.1.jar
deleted file mode 100644
index ce6eeba..0000000
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/lib/lucene-misc-5.2.1.jar
+++ /dev/null
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/BitFlagsQuery.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/BitFlagsQuery.java
index 9af3308..6df98d7 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/BitFlagsQuery.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/BitFlagsQuery.java
@@ -49,7 +49,7 @@
 	@Override
 	public int hashCode() {
 		final int prime = 31;
-		int result = super.hashCode();
+		int result = 1;
 		result = prime * result + fFalseFlags;
 		result = prime * result + fTrueFlags;
 		return result;
@@ -59,7 +59,7 @@
 	public boolean equals(Object obj) {
 		if (this == obj)
 			return true;
-		if (!super.equals(obj))
+		if (obj == null)
 			return false;
 		if (getClass() != obj.getClass())
 			return false;
@@ -100,10 +100,9 @@
 			@Override
 			public Explanation explain(LeafReaderContext context, int doc)
 					throws IOException {
-				final Scorer scorer = scorer(context,
-						context.reader().getLiveDocs());
+				final Scorer scorer = scorer(context);
 				final boolean match = (scorer != null
-						&& scorer.advance(doc) == doc);
+						&& scorer.iterator().advance(doc) == doc);
 				if (match) {
 					assert scorer.score() == 0;
 					return Explanation.match(0, "Match on id" + doc); //$NON-NLS-1$
@@ -113,9 +112,9 @@
 			}
 
 			@Override
-			public Scorer scorer(LeafReaderContext context, Bits acceptDocs)
-					throws IOException {
-				final DocIdSet set = getDocIdSet(context, acceptDocs);
+			public Scorer scorer(LeafReaderContext context) throws IOException {
+				final DocIdSet set = getDocIdSet(context,
+						context.reader().getLiveDocs());
 				if (set == null) {
 					return null;
 				}
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
index 9f079d9..38f5ea2 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
@@ -27,6 +27,7 @@
 import org.apache.lucene.search.SearcherManager;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.SimpleFSLockFactory;
+import org.apache.lucene.store.SleepingLockWrapper;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -133,9 +134,9 @@
 		mergeScheduler.setDefaultMaxMergesAndThreads(true);
 		config.setMergeScheduler(mergeScheduler);
 		config.setOpenMode(OpenMode.CREATE_OR_APPEND);
-		config.setWriteLockTimeout(WRITE_LOCK_TIMEOUT);
 		config.setCommitOnClose(false);
-		return new IndexWriter(indexDir, config);
+		return new IndexWriter(
+				new SleepingLockWrapper(indexDir, WRITE_LOCK_TIMEOUT), config);
 	}
 
 	private IndexWriter getWriter(Path path) {
@@ -171,7 +172,7 @@
 		try {
 			if (fTimestampsSearcher == null) {
 				fTimestampsSearcher = new SearcherManager(getTimestampsWriter(),
-						true, new SearcherFactory());
+						true, false, new SearcherFactory());
 			}
 			// Try to achieve the up-to-date index state
 			fTimestampsSearcher.maybeRefresh();
@@ -200,7 +201,7 @@
 		try {
 			if (searcher == null) {
 				searcher = new SearcherManager(
-						getIndexWriter(dataType, elementType), true,
+						getIndexWriter(dataType, elementType), true, false,
 						new SearcherFactory());
 				fIndexSearchers.get(dataType).put(elementType, searcher);
 			}
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexDirectory.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexDirectory.java
index 20f3b00..bbb37aa 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexDirectory.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexDirectory.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.dltk.internal.core.index.lucene;
 
-import java.io.File;
 import java.io.FileOutputStream;
 import java.io.FilterOutputStream;
 import java.io.IOException;
@@ -50,9 +49,10 @@
 
 		public RAFIndexOutput(String name) throws IOException {
 			super(MessageFormat.format(DESCRIPTION, directory.resolve(name)),
+					name,
 					new RAFOutputStream(
-							new FileOutputStream(new File(
-									directory.resolve(name).toString())),
+							new FileOutputStream(
+									directory.resolve(name).toFile()),
 							CHUNK_SIZE),
 					CHUNK_SIZE);
 		}
@@ -93,7 +93,6 @@
 	public IndexOutput createOutput(String name, IOContext context)
 			throws IOException {
 		ensureOpen();
-		ensureCanWrite(name);
 		return new RAFIndexOutput(name);
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
index f435262..58187b5 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
@@ -10,7 +10,22 @@
  *******************************************************************************/
 package org.eclipse.dltk.internal.core.index.lucene;
 
-import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.*;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_DOC;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_ELEMENT_NAME;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_METADATA;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_PARENT;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_PATH;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.BDV_QUALIFIER;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.F_CC_NAME;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.F_ELEMENT_NAME_LC;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.F_PARENT;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.F_PATH;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.F_QUALIFIER;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.NDV_FLAGS;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.NDV_LENGTH;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.NDV_NAME_LENGTH;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.NDV_NAME_OFFSET;
+import static org.eclipse.dltk.internal.core.index.lucene.IndexFields.NDV_OFFSET;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -217,15 +232,15 @@
 			final String parent, final int trueFlags, final int falseFlags,
 			final boolean searchForRefs, MatchRule matchRule,
 			IDLTKSearchScope scope) {
-		BooleanQuery query = new BooleanQuery();
+		BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
 		List<String> scripts = SearchScope.getScripts(scope);
 		if (!scripts.isEmpty()) {
-			BooleanQuery scriptQuery = new BooleanQuery();
+			BooleanQuery.Builder scriptQueryBuilder = new BooleanQuery.Builder();
 			for (String script : scripts) {
-				scriptQuery.add(new TermQuery(new Term(F_PATH, script)),
+				scriptQueryBuilder.add(new TermQuery(new Term(F_PATH, script)),
 						Occur.FILTER);
 			}
-			query.add(scriptQuery, Occur.FILTER);
+			queryBuilder.add(scriptQueryBuilder.build(), Occur.FILTER);
 		}
 		if (elementName != null && !elementName.isEmpty()) {
 			String elementNameLC = elementName.toLowerCase();
@@ -244,19 +259,22 @@
 				throw new UnsupportedOperationException();
 			}
 			if (nameQuery != null) {
-				query.add(nameQuery, Occur.FILTER);
+				queryBuilder.add(nameQuery, Occur.FILTER);
 			}
 		}
 		if (qualifier != null && !qualifier.isEmpty()) {
-			query.add(new TermQuery(new Term(F_QUALIFIER, qualifier)),
+			queryBuilder.add(new TermQuery(new Term(F_QUALIFIER, qualifier)),
 					Occur.FILTER);
 		}
 		if (parent != null && !parent.isEmpty()) {
-			query.add(new TermQuery(new Term(F_PARENT, parent)), Occur.FILTER);
+			queryBuilder.add(new TermQuery(new Term(F_PARENT, parent)),
+					Occur.FILTER);
 		}
 		if (trueFlags != 0 || falseFlags != 0) {
-			query.add(new BitFlagsQuery(trueFlags, falseFlags), Occur.FILTER);
+			queryBuilder.add(new BitFlagsQuery(trueFlags, falseFlags),
+					Occur.FILTER);
 		}
+		BooleanQuery query = queryBuilder.build();
 		return query.clauses().isEmpty() ? null : query;
 	}
 
diff --git a/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Neon-4.6.target b/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Neon-4.6.target
index 098997e..bbf2231 100644
--- a/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Neon-4.6.target
+++ b/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Neon-4.6.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="DLTK-Neon-4.6" sequenceNumber="2">
+<?pde version="3.8"?><target name="DLTK-Neon-4.6" sequenceNumber="7">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
 <unit id="org.h2.source" version="1.3.168.v201212121212"/>
@@ -15,6 +15,15 @@
 <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20160221192158/repository/"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
+<unit id="org.apache.lucene.analyzers-common" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.analyzers-common.source" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.core" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.core.source" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.misc" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.misc.source" version="6.1.0.v20161115-1612"/>
+<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20170307180635/repository/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
 <unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
 <unit id="org.eclipse.sdk.ide" version="0.0.0"/>
 <unit id="org.eclipse.mylyn.context.sdk.feature.group" version="0.0.0"/>
diff --git a/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Oxygen-4.7.target b/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Oxygen-4.7.target
new file mode 100644
index 0000000..c66cf6e
--- /dev/null
+++ b/core/releng/org.eclipse.dltk.core.targetplatform/DLTK-Oxygen-4.7.target
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?><target name="DLTK-Oxygen-4.7" sequenceNumber="10">
+<locations>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
+<unit id="org.antlr.runtime" version="3.0.0.v200803061811"/>
+<unit id="org.antlr.runtime.source" version="3.0.0.v200803061811"/>
+<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20160221192158/repository/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
+<unit id="org.h2.source" version="1.3.168.v201212121212"/>
+<unit id="org.h2" version="1.3.168.v201212121212"/>
+<unit id="com.google.guava" version="15.0.0.v201403281430"/>
+<unit id="com.google.guava.source" version="15.0.0.v201403281430"/>
+<unit id="org.junit" version="4.12.0.v201504281640"/>
+<unit id="org.junit.source" version="4.12.0.v201504281640"/>
+<unit id="org.hamcrest.core" version="1.3.0.v201303031735"/>
+<unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/>
+<unit id="org.apache.lucene.analyzers-common" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.analyzers-common.source" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.core" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.core.source" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.misc" version="6.1.0.v20161115-1612"/>
+<unit id="org.apache.lucene.misc.source" version="6.1.0.v20161115-1612"/>
+<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20170306214312/repository"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
+<unit id="org.eclipse.emf.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.sdk.ide" version="0.0.0"/>
+<unit id="org.eclipse.mylyn.context.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.mylyn.commons.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.mylyn.sdk_feature.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.rse.feature.group" version="0.0.0"/>
+<repository location="http://download.eclipse.org/releases/oxygen/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="false" type="InstallableUnit">
+<unit id="org.eclipse.linuxtools.man.feature.group" version="0.0.0"/>
+<repository location="http://download.eclipse.org/linuxtools/update"/>
+</location>
+</locations>
+<targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+</target>
diff --git a/core/releng/org.eclipse.dltk.core.targetplatform/org.eclipse.dltk.core.targetplatform.target b/core/releng/org.eclipse.dltk.core.targetplatform/org.eclipse.dltk.core.targetplatform.target
deleted file mode 100644
index 65f2c90..0000000
--- a/core/releng/org.eclipse.dltk.core.targetplatform/org.eclipse.dltk.core.targetplatform.target
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.6"?>
-
-<target name="DLTK-Build" sequenceNumber="14">
-<locations>
-<location includeAllPlatforms="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="com.google.guava" version="12.0.0.v201212092141"/>
-<unit id="org.junit" version="4.11.0.v201303080030"/>
-<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140114142710/repository/"/>
-</location>
-</locations>
-</target>
diff --git a/core/releng/org.eclipse.dltk.core.targetplatform/pom.xml b/core/releng/org.eclipse.dltk.core.targetplatform/pom.xml
index 123e853..a1c2c7a 100644
--- a/core/releng/org.eclipse.dltk.core.targetplatform/pom.xml
+++ b/core/releng/org.eclipse.dltk.core.targetplatform/pom.xml
@@ -11,7 +11,7 @@
 	</parent>
 
 	<artifactId>org.eclipse.dltk.core.targetplatform</artifactId>
-	<packaging>eclipse-target-definition</packaging>
+	<packaging>pom</packaging>
 	<build>
       <plugins>
         <plugin>
@@ -32,7 +32,11 @@
                     <type>target</type>
                     <classifier>DLTK-Neon-4.6</classifier>
                   </artifact>
-                  <!-- More targets could be added here -->
+                  <artifact>
+                    <file>DLTK-Oxygen-4.7.target</file>
+                    <type>target</type>
+                    <classifier>DLTK-Oxygen-4.7</classifier>
+                  </artifact>
                 </artifacts>
               </configuration>
             </execution>