This is an automated email from the ASF dual-hosted git repository.

rnewson pushed a commit to branch import-nouveau-reorg-wip
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit c0bcb92bf2ee76fed5e5f9b5950da600231ba325
Author: Robert Newson <[email protected]>
AuthorDate: Sun Dec 18 10:28:28 2022 +0000

    WIP2
---
 .../apache/couchdb/nouveau/NouveauApplication.java |   6 +-
 .../apache/couchdb/nouveau/api/AnalyzeRequest.java |  12 +-
 .../couchdb/nouveau/api/IndexDefinition.java       |   3 +-
 .../apache/couchdb/nouveau/core/IndexManager.java  |   4 +-
 .../couchdb/nouveau/core/V461AnalyzerFactory.java  | 165 +++++++++++++++++++++
 ...AnalyzerFactory.java => V9AnalyzerFactory.java} |   2 +-
 .../apache/couchdb/nouveau/core/lucene/Lucene.java |  45 ++++++
 .../lucene/Lucene461.java}                         |  41 ++---
 .../lucene/Lucene9.java}                           |  34 ++---
 .../couchdb/nouveau/health/AnalyzeHealthCheck.java |   3 +-
 .../nouveau/health/IndexManagerHealthCheck.java    |   3 +-
 .../couchdb/nouveau/resources/AnalyzeResource.java |  39 +----
 .../apache/couchdb/nouveau/IntegrationTest.java    |   3 +-
 .../couchdb/nouveau/core/AnalyzerFactoryTest.java  |   2 +-
 .../couchdb/nouveau/core/IndexManagerTest.java     |   5 +-
 15 files changed, 263 insertions(+), 104 deletions(-)

diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java
index f5a92fced..2df8b3f8f 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/NouveauApplication.java
@@ -15,7 +15,7 @@ package org.apache.couchdb.nouveau;
 
 import java.util.concurrent.ExecutorService;
 
-import org.apache.couchdb.nouveau.core.AnalyzerFactory;
+import org.apache.couchdb.nouveau.core.V9AnalyzerFactory;
 import org.apache.couchdb.nouveau.core.DocumentFactory;
 import org.apache.couchdb.nouveau.core.FileAlreadyExistsExceptionMapper;
 import org.apache.couchdb.nouveau.core.FileNotFoundExceptionMapper;
@@ -48,7 +48,7 @@ public class NouveauApplication extends 
Application<NouveauApplicationConfigurat
     @Override
     public void run(NouveauApplicationConfiguration configuration, Environment 
environment) throws Exception {
         final DocumentFactory documentFactory = new DocumentFactory();
-        final AnalyzerFactory analyzerFactory = new AnalyzerFactory();
+        final V9AnalyzerFactory analyzerFactory = new V9AnalyzerFactory();
 
         final ExecutorService searchExecutor =
             environment.lifecycle().executorService("searches").build();
@@ -74,7 +74,7 @@ public class NouveauApplication extends 
Application<NouveauApplicationConfigurat
         environment.jersey().register(new FileAlreadyExistsExceptionMapper());
         environment.jersey().register(new UpdatesOutOfOrderExceptionMapper());
 
-        final AnalyzeResource analyzeResource = new 
AnalyzeResource(analyzerFactory);
+        final AnalyzeResource analyzeResource = new AnalyzeResource();
         environment.jersey().register(analyzeResource);
         environment.jersey().register(new IndexResource(indexManager, 
documentFactory));
         environment.jersey().register(new SearchResource(indexManager));
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java
index 5f3fcd1e9..41f7ffdfe 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/AnalyzeRequest.java
@@ -14,6 +14,7 @@
 package org.apache.couchdb.nouveau.api;
 
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
@@ -22,6 +23,9 @@ import io.dropwizard.jackson.JsonSnakeCase;
 @JsonSnakeCase
 public class AnalyzeRequest {
 
+    @NotNull
+    private LuceneVersion luceneVersion;
+
     @NotEmpty
     private String analyzer;
 
@@ -33,11 +37,17 @@ public class AnalyzeRequest {
         // Jackson deserialization
     }
 
-    public AnalyzeRequest(final String analyzer, final String text) {
+    public AnalyzeRequest(final LuceneVersion luceneVersion, final String 
analyzer, final String text) {
+        this.luceneVersion = luceneVersion;
         this.analyzer = analyzer;
         this.text = text;
     }
 
+    @JsonProperty
+    public LuceneVersion getLuceneVersion() {
+        return luceneVersion;
+    }
+
     @JsonProperty
     public String getAnalyzer() {
         return analyzer;
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
index 4dece3f0f..aaad7626e 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/IndexDefinition.java
@@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.api;
 import java.util.Map;
 
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
@@ -24,7 +25,7 @@ import io.dropwizard.jackson.JsonSnakeCase;
 @JsonSnakeCase
 public class IndexDefinition {
 
-    @NotEmpty
+    @NotNull
     private LuceneVersion luceneVersion;
 
     @NotEmpty
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
index 109ac2e05..4975bcb5d 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/IndexManager.java
@@ -234,7 +234,7 @@ public class IndexManager implements Managed {
     private Path rootDir;
 
     @NotNull
-    private AnalyzerFactory analyzerFactory;
+    private V9AnalyzerFactory analyzerFactory;
 
     @NotNull
     private ObjectMapper objectMapper;
@@ -339,7 +339,7 @@ public class IndexManager implements Managed {
         this.rootDir = rootDir;
     }
 
-    public void setAnalyzerFactory(final AnalyzerFactory analyzerFactory) {
+    public void setAnalyzerFactory(final V9AnalyzerFactory analyzerFactory) {
         this.analyzerFactory = analyzerFactory;
     }
 
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java
new file mode 100644
index 000000000..52ff55357
--- /dev/null
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V461AnalyzerFactory.java
@@ -0,0 +1,165 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.couchdb.nouveau.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.couchdb.nouveau.api.IndexDefinition;
+
+import v461.org.apache.lucene.analysis.Analyzer;
+import v461.org.apache.lucene.analysis.ar.ArabicAnalyzer;
+import v461.org.apache.lucene.analysis.bg.BulgarianAnalyzer;
+import v461.org.apache.lucene.analysis.ca.CatalanAnalyzer;
+import v461.org.apache.lucene.analysis.cjk.CJKAnalyzer;
+import v461.org.apache.lucene.analysis.standard.ClassicAnalyzer;
+import v461.org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
+import v461.org.apache.lucene.analysis.core.KeywordAnalyzer;
+import v461.org.apache.lucene.analysis.core.SimpleAnalyzer;
+import v461.org.apache.lucene.analysis.core.WhitespaceAnalyzer;
+import v461.org.apache.lucene.analysis.cz.CzechAnalyzer;
+import v461.org.apache.lucene.analysis.da.DanishAnalyzer;
+import v461.org.apache.lucene.analysis.de.GermanAnalyzer;
+import v461.org.apache.lucene.analysis.standard.UAX29URLEmailAnalyzer;
+import v461.org.apache.lucene.analysis.en.EnglishAnalyzer;
+import v461.org.apache.lucene.analysis.es.SpanishAnalyzer;
+import v461.org.apache.lucene.analysis.eu.BasqueAnalyzer;
+import v461.org.apache.lucene.analysis.fa.PersianAnalyzer;
+import v461.org.apache.lucene.analysis.fi.FinnishAnalyzer;
+import v461.org.apache.lucene.analysis.fr.FrenchAnalyzer;
+import v461.org.apache.lucene.analysis.ga.IrishAnalyzer;
+import v461.org.apache.lucene.analysis.gl.GalicianAnalyzer;
+import v461.org.apache.lucene.analysis.hi.HindiAnalyzer;
+import v461.org.apache.lucene.analysis.hu.HungarianAnalyzer;
+import v461.org.apache.lucene.analysis.hy.ArmenianAnalyzer;
+import v461.org.apache.lucene.analysis.id.IndonesianAnalyzer;
+import v461.org.apache.lucene.analysis.it.ItalianAnalyzer;
+import v461.org.apache.lucene.analysis.ja.JapaneseAnalyzer;
+import v461.org.apache.lucene.analysis.lv.LatvianAnalyzer;
+import v461.org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper;
+import v461.org.apache.lucene.analysis.nl.DutchAnalyzer;
+import v461.org.apache.lucene.analysis.no.NorwegianAnalyzer;
+import v461.org.apache.lucene.analysis.pl.PolishAnalyzer;
+import v461.org.apache.lucene.analysis.pt.PortugueseAnalyzer;
+import v461.org.apache.lucene.analysis.ro.RomanianAnalyzer;
+import v461.org.apache.lucene.analysis.ru.RussianAnalyzer;
+import v461.org.apache.lucene.analysis.standard.StandardAnalyzer;
+import v461.org.apache.lucene.analysis.sv.SwedishAnalyzer;
+import v461.org.apache.lucene.analysis.th.ThaiAnalyzer;
+import v461.org.apache.lucene.analysis.tr.TurkishAnalyzer;
+import v461.org.apache.lucene.util.Version;
+
+public class V461AnalyzerFactory {
+
+    private static final Version VERSION = Version.LUCENE_46;
+
+    public Analyzer fromDefinition(final IndexDefinition indexDefinition) {
+        final Analyzer defaultAnalyzer = 
newAnalyzer(indexDefinition.getDefaultAnalyzer());
+        if (!indexDefinition.hasFieldAnalyzers()) {
+            return defaultAnalyzer;
+        }
+        final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, 
Analyzer>();
+        for (Map.Entry<String, String> entry : 
indexDefinition.getFieldAnalyzers().entrySet()) {
+            fieldAnalyzers.put(entry.getKey(), newAnalyzer(entry.getValue()));
+        }
+        return new PerFieldAnalyzerWrapper(defaultAnalyzer, fieldAnalyzers);
+    }
+
+    public Analyzer newAnalyzer(final String name) {
+        switch(name) {
+        case "keyword":
+            return new KeywordAnalyzer();
+        case "simple":
+            return new SimpleAnalyzer(VERSION);
+        case "whitespace":
+            return new WhitespaceAnalyzer(VERSION);
+        case "arabic":
+            return new ArabicAnalyzer(VERSION);
+        case "bulgarian":
+            return new BulgarianAnalyzer(VERSION);
+        case "catalan":
+            return new CatalanAnalyzer(VERSION);
+        case "cjk":
+            return new CJKAnalyzer(VERSION);
+        case "chinese":
+            return new SmartChineseAnalyzer(VERSION);
+        case "czech":
+            return new CzechAnalyzer(VERSION);
+        case "danish":
+            return new DanishAnalyzer(VERSION);
+        case "german":
+            return new GermanAnalyzer(VERSION);
+        case "english":
+            return new EnglishAnalyzer(VERSION);
+        case "spanish":
+            return new SpanishAnalyzer(VERSION);
+        case "basque":
+            return new BasqueAnalyzer(VERSION);
+        case "persian":
+            return new PersianAnalyzer(VERSION);
+        case "finnish":
+            return new FinnishAnalyzer(VERSION);
+        case "french":
+            return new FrenchAnalyzer(VERSION);
+        case "irish":
+            return new IrishAnalyzer(VERSION);
+        case "galician":
+            return new GalicianAnalyzer(VERSION);
+        case "hindi":
+            return new HindiAnalyzer(VERSION);
+        case "hungarian":
+            return new HungarianAnalyzer(VERSION);
+        case "armenian":
+            return new ArmenianAnalyzer(VERSION);
+        case "indonesian":
+            return new IndonesianAnalyzer(VERSION);
+        case "italian":
+            return new ItalianAnalyzer(VERSION);
+        case "japanese":
+            return new JapaneseAnalyzer(VERSION);
+        case "latvian":
+            return new LatvianAnalyzer(VERSION);
+        case "dutch":
+            return new DutchAnalyzer(VERSION);
+        case "norwegian":
+            return new NorwegianAnalyzer(VERSION);
+        case "polish":
+            return new PolishAnalyzer(VERSION);
+        case "portugese":
+            return new PortugueseAnalyzer(VERSION);
+        case "romanian":
+            return new RomanianAnalyzer(VERSION);
+        case "russian":
+            return new RussianAnalyzer(VERSION);
+        case "classic":
+            return new ClassicAnalyzer(VERSION);
+        case "standard":
+            return new StandardAnalyzer(VERSION);
+        case "email":
+            return new UAX29URLEmailAnalyzer(VERSION);
+        case "swedish":
+            return new SwedishAnalyzer(VERSION);
+        case "thai":
+            return new ThaiAnalyzer(VERSION);
+        case "turkish":
+            return new TurkishAnalyzer(VERSION);
+        default:
+            throw new WebApplicationException(name + " is not a valid analyzer 
name", Status.BAD_REQUEST);
+        }
+    }
+
+}
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java
similarity index 99%
rename from 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java
rename to 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java
index 9892a1698..afa9d77d3 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/AnalyzerFactory.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/V9AnalyzerFactory.java
@@ -62,7 +62,7 @@ import v9.org.apache.lucene.analysis.sv.SwedishAnalyzer;
 import v9.org.apache.lucene.analysis.th.ThaiAnalyzer;
 import v9.org.apache.lucene.analysis.tr.TurkishAnalyzer;
 
-public class AnalyzerFactory {
+public class V9AnalyzerFactory {
 
     public Analyzer fromDefinition(final IndexDefinition indexDefinition) {
         final Analyzer defaultAnalyzer = 
newAnalyzer(indexDefinition.getDefaultAnalyzer());
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java
new file mode 100644
index 000000000..6c794c2ba
--- /dev/null
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene.java
@@ -0,0 +1,45 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.couchdb.nouveau.core.lucene;
+
+import java.io.IOException;
+
+import org.apache.couchdb.nouveau.api.AnalyzeRequest;
+import org.apache.couchdb.nouveau.api.AnalyzeResponse;
+import org.apache.couchdb.nouveau.api.LuceneVersion;
+
+public abstract class Lucene {
+
+    private static final Lucene LUCENE_9 = new Lucene9();
+    private static final Lucene LUCENE_4_6_1 = new Lucene461();
+
+    public final static AnalyzeResponse analyzeText(final AnalyzeRequest 
request) throws IOException {
+        return forVersion(request.getLuceneVersion()).analyzeImpl(request);
+    }
+
+    public abstract AnalyzeResponse analyzeImpl(final AnalyzeRequest request) 
throws IOException;
+
+    private static Lucene forVersion(final LuceneVersion luceneVersion) {
+        switch(luceneVersion) {
+            case LUCENE_4_6_1:
+                return LUCENE_4_6_1;
+            case LUCENE_9:
+                return LUCENE_9;
+            default:
+                // unreachable.
+                throw new IllegalArgumentException(luceneVersion + " not 
recognised");
+        }
+    }
+
+}
\ No newline at end of file
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java
similarity index 55%
copy from 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
copy to 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java
index 9ff8f6c9c..9cc6eea6f 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene461.java
@@ -11,53 +11,37 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.couchdb.nouveau.resources;
+package org.apache.couchdb.nouveau.core.lucene;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.couchdb.nouveau.api.AnalyzeRequest;
 import org.apache.couchdb.nouveau.api.AnalyzeResponse;
-import org.apache.couchdb.nouveau.core.AnalyzerFactory;
-import com.codahale.metrics.annotation.Timed;
+import org.apache.couchdb.nouveau.core.V461AnalyzerFactory;
 
-import v9.org.apache.lucene.analysis.Analyzer;
-import v9.org.apache.lucene.analysis.TokenStream;
-import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+import v461.org.apache.lucene.analysis.Analyzer;
+import v461.org.apache.lucene.analysis.TokenStream;
+import v461.org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 
-@Path("/analyze")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class AnalyzeResource {
+class Lucene461 extends Lucene {
 
-    private final AnalyzerFactory analyzerFactory;
+    private final V461AnalyzerFactory analyzerFactory = new 
V461AnalyzerFactory();
 
-    public AnalyzeResource(AnalyzerFactory analyzerFactory) {
-        this.analyzerFactory = analyzerFactory;
-    }
-
-    @POST
-    @Timed
-    public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest 
analyzeRequest) throws IOException {
+    @Override
+    public AnalyzeResponse analyzeImpl(final AnalyzeRequest request) throws 
IOException {
         final Analyzer analyzer;
         try {
-            analyzer = 
analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer());
+            analyzer = analyzerFactory.newAnalyzer(request.getAnalyzer());
         } catch (IllegalArgumentException e) {
-            throw new WebApplicationException(analyzeRequest.getAnalyzer() + " 
not a valid analyzer",
+            throw new WebApplicationException(request.getAnalyzer() + " not a 
valid analyzer",
                     Status.BAD_REQUEST);
         }
-        return new AnalyzeResponse(tokenize(analyzer, 
analyzeRequest.getText()));
+        return new AnalyzeResponse(tokenize(analyzer, request.getText()));
     }
 
     private List<String> tokenize(final Analyzer analyzer, final String text) 
throws IOException {
@@ -72,5 +56,4 @@ public class AnalyzeResource {
         }
         return result;
     }
-
 }
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java
similarity index 62%
copy from 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
copy to 
java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java
index 9ff8f6c9c..15803bcb6 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene/Lucene9.java
@@ -11,53 +11,37 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.couchdb.nouveau.resources;
+package org.apache.couchdb.nouveau.core.lucene;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.couchdb.nouveau.api.AnalyzeRequest;
 import org.apache.couchdb.nouveau.api.AnalyzeResponse;
-import org.apache.couchdb.nouveau.core.AnalyzerFactory;
-import com.codahale.metrics.annotation.Timed;
+import org.apache.couchdb.nouveau.core.V9AnalyzerFactory;
 
 import v9.org.apache.lucene.analysis.Analyzer;
 import v9.org.apache.lucene.analysis.TokenStream;
 import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 
-@Path("/analyze")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class AnalyzeResource {
+class Lucene9 extends Lucene {
 
-    private final AnalyzerFactory analyzerFactory;
+    private final V9AnalyzerFactory analyzerFactory = new V9AnalyzerFactory();
 
-    public AnalyzeResource(AnalyzerFactory analyzerFactory) {
-        this.analyzerFactory = analyzerFactory;
-    }
-
-    @POST
-    @Timed
-    public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest 
analyzeRequest) throws IOException {
+    @Override
+    public AnalyzeResponse analyzeImpl(final AnalyzeRequest request) throws 
IOException {
         final Analyzer analyzer;
         try {
-            analyzer = 
analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer());
+            analyzer = analyzerFactory.newAnalyzer(request.getAnalyzer());
         } catch (IllegalArgumentException e) {
-            throw new WebApplicationException(analyzeRequest.getAnalyzer() + " 
not a valid analyzer",
+            throw new WebApplicationException(request.getAnalyzer() + " not a 
valid analyzer",
                     Status.BAD_REQUEST);
         }
-        return new AnalyzeResponse(tokenize(analyzer, 
analyzeRequest.getText()));
+        return new AnalyzeResponse(tokenize(analyzer, request.getText()));
     }
 
     private List<String> tokenize(final Analyzer analyzer, final String text) 
throws IOException {
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java
index 75d402b43..a4c56cdd7 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/AnalyzeHealthCheck.java
@@ -18,6 +18,7 @@ import java.util.List;
 
 import org.apache.couchdb.nouveau.api.AnalyzeRequest;
 import org.apache.couchdb.nouveau.api.AnalyzeResponse;
+import static org.apache.couchdb.nouveau.api.LuceneVersion.*;
 import org.apache.couchdb.nouveau.resources.AnalyzeResource;
 import com.codahale.metrics.health.HealthCheck;
 
@@ -31,7 +32,7 @@ public class AnalyzeHealthCheck extends HealthCheck {
 
     @Override
     protected Result check() throws Exception {
-        final AnalyzeRequest request = new AnalyzeRequest("standard", "hello 
there");
+        final AnalyzeRequest request = new AnalyzeRequest(LUCENE_9, 
"standard", "hello there");
         final AnalyzeResponse response = analyzeResource.analyzeText(request);
         final List<String> expected = Arrays.asList("hello", "there");
         final List<String> actual = response.getTokens();
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java
index 0cdb11b67..be990a74f 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/health/IndexManagerHealthCheck.java
@@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.health;
 import java.io.IOException;
 
 import org.apache.couchdb.nouveau.api.IndexDefinition;
+import static org.apache.couchdb.nouveau.api.LuceneVersion.*;
 import org.apache.couchdb.nouveau.core.IndexManager;
 import org.apache.couchdb.nouveau.core.IndexManager.Index;
 import com.codahale.metrics.health.HealthCheck;
@@ -40,7 +41,7 @@ public class IndexManagerHealthCheck extends HealthCheck {
             // Ignored, index might not exist yet.
         }
 
-        indexManager.create(name, new IndexDefinition("standard", null));
+        indexManager.create(name, new IndexDefinition(LUCENE_9, "standard", 
null));
         final Index index = indexManager.acquire(name);
         try {
             final IndexWriter writer = index.getWriter();
diff --git 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
index 9ff8f6c9c..8ba32eadb 100644
--- 
a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
+++ 
b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/resources/AnalyzeResource.java
@@ -14,8 +14,6 @@
 package org.apache.couchdb.nouveau.resources;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
@@ -23,54 +21,23 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response.Status;
 
 import org.apache.couchdb.nouveau.api.AnalyzeRequest;
 import org.apache.couchdb.nouveau.api.AnalyzeResponse;
-import org.apache.couchdb.nouveau.core.AnalyzerFactory;
-import com.codahale.metrics.annotation.Timed;
+import org.apache.couchdb.nouveau.core.lucene.Lucene;
 
-import v9.org.apache.lucene.analysis.Analyzer;
-import v9.org.apache.lucene.analysis.TokenStream;
-import v9.org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+import com.codahale.metrics.annotation.Timed;
 
 @Path("/analyze")
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
 public class AnalyzeResource {
 
-    private final AnalyzerFactory analyzerFactory;
-
-    public AnalyzeResource(AnalyzerFactory analyzerFactory) {
-        this.analyzerFactory = analyzerFactory;
-    }
-
     @POST
     @Timed
     public AnalyzeResponse analyzeText(@NotNull @Valid AnalyzeRequest 
analyzeRequest) throws IOException {
-        final Analyzer analyzer;
-        try {
-            analyzer = 
analyzerFactory.newAnalyzer(analyzeRequest.getAnalyzer());
-        } catch (IllegalArgumentException e) {
-            throw new WebApplicationException(analyzeRequest.getAnalyzer() + " 
not a valid analyzer",
-                    Status.BAD_REQUEST);
-        }
-        return new AnalyzeResponse(tokenize(analyzer, 
analyzeRequest.getText()));
-    }
-
-    private List<String> tokenize(final Analyzer analyzer, final String text) 
throws IOException {
-        final List<String> result = new ArrayList<String>(10);
-        try (final TokenStream tokenStream = analyzer.tokenStream("default", 
text)) {
-            tokenStream.reset();
-            while (tokenStream.incrementToken()) {
-                final CharTermAttribute term = 
tokenStream.getAttribute(CharTermAttribute.class);
-                result.add(term.toString());
-            }
-            tokenStream.end();
-        }
-        return result;
+        return Lucene.analyzeText(analyzeRequest);
     }
 
 }
diff --git 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
index 0dda50448..1602404ab 100644
--- 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
+++ 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
@@ -24,6 +24,7 @@ import javax.ws.rs.core.Response;
 
 import org.apache.couchdb.nouveau.api.DocumentUpdateRequest;
 import org.apache.couchdb.nouveau.api.IndexDefinition;
+import static org.apache.couchdb.nouveau.api.LuceneVersion.*;
 import org.apache.couchdb.nouveau.api.SearchRequest;
 import org.apache.couchdb.nouveau.api.SearchResults;
 
@@ -56,7 +57,7 @@ public class IntegrationTest {
     public void indexTest() {
         final String url = "http://localhost:"; + APP.getLocalPort();
         final String indexName = "foo";
-        final IndexDefinition indexDefinition = new 
IndexDefinition("standard", null);
+        final IndexDefinition indexDefinition = new IndexDefinition(LUCENE_9, 
"standard", null);
 
         // Clean up.
         Response response =
diff --git 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java
 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java
index 2027a436b..8e769a045 100644
--- 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java
+++ 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/AnalyzerFactoryTest.java
@@ -249,7 +249,7 @@ public class AnalyzerFactoryTest {
     }
 
     private void assertAnalyzer(final String name, final Class<? extends 
Analyzer> clazz) throws Exception {
-        final AnalyzerFactory factory = new AnalyzerFactory();
+        final V9AnalyzerFactory factory = new V9AnalyzerFactory();
         assertThat(factory.newAnalyzer(name)).isInstanceOf(clazz);
     }
 
diff --git 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
index 29de49a74..b5151d8a5 100644
--- 
a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
+++ 
b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/core/IndexManagerTest.java
@@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.core;
 import java.nio.file.Path;
 
 import org.apache.couchdb.nouveau.api.IndexDefinition;
+import static org.apache.couchdb.nouveau.api.LuceneVersion.*;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.junit.jupiter.api.AfterEach;
@@ -37,7 +38,7 @@ public class IndexManagerTest {
     @BeforeEach
     public void setup() throws Exception {
         manager = new IndexManager();
-        manager.setAnalyzerFactory(new AnalyzerFactory());
+        manager.setAnalyzerFactory(new V9AnalyzerFactory());
         manager.setCommitIntervalSeconds(5);
         manager.setObjectMapper(new ObjectMapper());
         manager.setRootDir(tempDir);
@@ -51,7 +52,7 @@ public class IndexManagerTest {
 
     @Test
     public void testCreate() throws Exception {
-        final IndexDefinition def = new IndexDefinition("standard", null);
+        final IndexDefinition def = new IndexDefinition(LUCENE_9, "standard", 
null);
         manager.create("foo", def);
     }
 

Reply via email to