Author: ngupta
Date: Thu Jan 21 06:48:34 2021
New Revision: 1885742

URL: http://svn.apache.org/viewvc?rev=1885742&view=rev
Log:
OAK-9312|Modify oak-run to support creating indexes of type Elasticsearch

Added:
    jackrabbit/oak/trunk/oak-run-elastic/
    jackrabbit/oak/trunk/oak-run-elastic/pom.xml
    jackrabbit/oak/trunk/oak-run-elastic/src/
    jackrabbit/oak/trunk/oak-run-elastic/src/main/
    jackrabbit/oak/trunk/oak-run-elastic/src/main/java/
    jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/
    jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticDocumentStoreIndexer.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexCommand.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexOptions.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticOutOfBandIndexer.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexer.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerProvider.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/AvailableElasticModes.java
    
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/Main.java
    jackrabbit/oak/trunk/oak-run-elastic/src/test/
    jackrabbit/oak/trunk/oak-run-elastic/src/test/java/
    jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/
    jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/
    
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/
    
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/
    
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/
    
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/
    
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerTest.java
Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
    
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
    
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocumentMaker.java
    
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexWriterFactory.java
    jackrabbit/oak/trunk/pom.xml

Added: jackrabbit/oak/trunk/oak-run-elastic/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/pom.xml?rev=1885742&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-run-elastic/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-run-elastic/pom.xml Thu Jan 21 06:48:34 2021
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd ">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.jackrabbit</groupId>
+        <artifactId>oak-parent</artifactId>
+        <version>1.37-SNAPSHOT</version>
+        <relativePath>../oak-parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>oak-run-elastic</artifactId>
+    <name>Oak Elastic Runnable Jar</name>
+
+    <properties>
+        <jetty.version>8.2.0.v20160908</jetty.version>
+        <groovy.version>2.4.17</groovy.version>
+        <max.jar.size>27000000</max.jar.size>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.gmavenplus</groupId>
+                <artifactId>gmavenplus-plugin</artifactId>
+                <version>1.5</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>addSources</goal>
+                            <goal>addTestSources</goal>
+                            <goal>generateStubs</goal>
+                            <goal>compile</goal>
+                            <goal>testGenerateStubs</goal>
+                            <goal>testCompile</goal>
+                            <goal>removeStubs</goal>
+                            <goal>removeTestStubs</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <version>3.0.0-M2</version>
+                <executions>
+                    <execution>
+                        <id>enforce-file-size</id>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <rules>
+
+                                <requireFilesSize>
+                                    <maxsize>${max.jar.size}</maxsize>
+                                    <files>
+                                        
<file>${project.build.directory}/${project.build.finalName}.jar</file>
+                                    </files>
+                                </requireFilesSize>
+                            </rules>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-failsafe-plugin</artifactId>
+                <configuration>
+                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-run-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-jcr</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-query-spi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-core-spi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-blob-cloud</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-segment-tar</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-segment</artifactId>
+            <version>1.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-store-document</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-search-elastic</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-run</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- Nullability annotations -->
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+        </dependency>
+
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>oak-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+
+
+</project>
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticDocumentStoreIndexer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticDocumentStoreIndexer.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticDocumentStoreIndexer.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticDocumentStoreIndexer.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.jackrabbit.oak.index.indexer.document.DocumentStoreIndexer;
+import org.apache.jackrabbit.oak.index.indexer.document.ElasticIndexerProvider;
+import 
org.apache.jackrabbit.oak.index.indexer.document.NodeStateIndexerProvider;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticConnection;
+
+import java.io.IOException;
+import java.util.List;
+
+/*
+Out of band indexer for Elasticsearch. Provides support to index document 
store for  given index definitions or reindex existing indexes
+ */
+public class ElasticDocumentStoreIndexer extends DocumentStoreIndexer {
+    private final IndexHelper indexHelper;
+    private final List<NodeStateIndexerProvider> indexerProviders;
+    private final IndexerSupport indexerSupport;
+
+    private final String indexPrefix;
+    private final String scheme;
+    private final String host;
+    private final int port;
+    private final String apiKeyId;
+    private final String apiSecretId;
+
+    public ElasticDocumentStoreIndexer(IndexHelper indexHelper, IndexerSupport 
indexerSupport,
+                                       String indexPrefix, String scheme,
+                                       String host, int port,
+                                       String apiKeyId, String apiSecretId) 
throws IOException {
+        super(indexHelper, indexerSupport);
+        this.indexHelper = indexHelper;
+        this.indexerSupport = indexerSupport;
+        this.indexerProviders = createProviders();
+
+        this.indexPrefix = indexPrefix;
+        this.scheme = scheme;
+        this.host = host;
+        this.port = port;
+        this.apiKeyId = apiKeyId;
+        this.apiSecretId = apiSecretId;
+    }
+
+    protected List<NodeStateIndexerProvider> createProviders() {
+        List<NodeStateIndexerProvider> providers = ImmutableList.of(
+                createElasticIndexerProvider()
+        );
+
+        providers.forEach(closer::register);
+        return providers;
+    }
+
+    private NodeStateIndexerProvider createElasticIndexerProvider() {
+        final ElasticConnection.Builder.BuildStep buildStep = 
ElasticConnection.newBuilder()
+                .withIndexPrefix(indexPrefix)
+                .withConnectionParameters(
+                        scheme,
+                        host,
+                        port
+                );
+        final ElasticConnection coordinate;
+        if (apiKeyId != null && apiSecretId != null) {
+            coordinate = buildStep.withApiKeys(apiKeyId, apiSecretId).build();
+        } else {
+            coordinate = buildStep.build();
+        }
+        closer.register(coordinate);
+        return new ElasticIndexerProvider(indexHelper, coordinate);
+    }
+
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexCommand.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexCommand.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexCommand.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexCommand.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.Sets;
+import com.google.common.io.Closer;
+import joptsimple.OptionParser;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexDefinition;
+import org.apache.jackrabbit.oak.plugins.index.importer.IndexDefinitionUpdater;
+import org.apache.jackrabbit.oak.run.cli.CommonOptions;
+import org.apache.jackrabbit.oak.run.cli.NodeStoreFixture;
+import org.apache.jackrabbit.oak.run.cli.NodeStoreFixtureProvider;
+import org.apache.jackrabbit.oak.run.cli.Options;
+import org.apache.jackrabbit.oak.run.commons.Command;
+import org.apache.jackrabbit.oak.run.commons.LoggingInitializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/*
+Command file for Elastic index operation.
+ */
+public class ElasticIndexCommand implements Command {
+    private static final Logger log = 
LoggerFactory.getLogger(ElasticIndexCommand.class);
+    private Options opts;
+    private ElasticIndexOptions indexOpts;
+    public static final String NAME = "index";
+
+    private final String summary = "Provides elastic index management related 
operations";
+    private static boolean disableExitOnError;
+
+
+    @Override
+    public void execute(String... args) throws Exception {
+        OptionParser parser = new OptionParser();
+
+        opts = new Options();
+        opts.setCommandName(NAME);
+        opts.setSummary(summary);
+        opts.setConnectionString(CommonOptions.DEFAULT_CONNECTION_STRING);
+        opts.registerOptionsFactory(ElasticIndexOptions.FACTORY);
+        opts.parseAndConfigure(parser, args);
+
+        indexOpts = opts.getOptionBean(ElasticIndexOptions.class);
+
+        //Clean up before setting up NodeStore as the temp
+        //directory might be used by NodeStore for cache stuff like 
persistentCache
+        //setupDirectories(indexOpts);
+        //setupLogging(indexOpts);
+
+        logCliArgs(args);
+
+        boolean success = false;
+        try {
+            try (Closer closer = Closer.create()) {
+                //configureCustomizer(opts, closer, true);
+                NodeStoreFixture fixture = 
NodeStoreFixtureProvider.create(opts);
+                closer.register(fixture);
+                execute(fixture, indexOpts, closer);
+                //tellReportPaths();
+            }
+
+            success = true;
+        } catch (Throwable e) {
+            log.error("Error occurred while performing index tasks", e);
+            if (disableExitOnError) {
+                throw e;
+            }
+        } finally {
+            shutdownLogging();
+        }
+
+        if (!success) {
+            //Needed for changes after OAK-6409
+            System.exit(1);
+        }
+    }
+
+    private void execute(NodeStoreFixture fixture, IndexOptions indexOpts, 
Closer closer)
+            throws IOException, CommitFailedException {
+        IndexHelper indexHelper = createIndexHelper(fixture, indexOpts, 
closer);
+
+        // TODO : See if we need to support dumpIndexStats and index defs for 
elastic - not needed for now
+        //dumpIndexStats(indexOpts, indexHelper);
+        //dumpIndexDefinitions(indexOpts, indexHelper);
+        reindexOperation(indexOpts, indexHelper);
+    }
+
+    private IndexHelper createIndexHelper(NodeStoreFixture fixture,
+                                          IndexOptions indexOpts, Closer 
closer) throws IOException {
+        IndexHelper indexHelper = new IndexHelper(fixture.getStore(), 
fixture.getBlobStore(), fixture.getWhiteboard(),
+                indexOpts.getOutDir(), indexOpts.getWorkDir(), 
computeIndexPaths(indexOpts));
+
+        // TODO : See if pre text extraction is needed for elastic
+        //configurePreExtractionSupport(indexOpts, indexHelper);
+
+        closer.register(indexHelper);
+        return indexHelper;
+    }
+
+    private List<String> computeIndexPaths(IndexOptions indexOpts) throws 
IOException {
+        //Combine the indexPaths from json and cli args
+        Set<String> indexPaths = new 
LinkedHashSet<>(indexOpts.getIndexPaths());
+        File definitions = indexOpts.getIndexDefinitionsFile();
+        if (definitions != null) {
+            IndexDefinitionUpdater updater = new 
IndexDefinitionUpdater(definitions);
+            Set<String> indexPathsFromJson = updater.getIndexPaths();
+            Set<String> diff = Sets.difference(indexPathsFromJson, indexPaths);
+            if (!diff.isEmpty()) {
+                log.info("Augmenting the indexPaths with {} which are present 
in {}", diff, definitions);
+            }
+            indexPaths.addAll(indexPathsFromJson);
+        }
+        return new ArrayList<>(indexPaths);
+    }
+
+    private void reindexOperation(IndexOptions indexOpts, IndexHelper 
indexHelper) throws IOException, CommitFailedException {
+        if (!indexOpts.isReindex()) {
+            return;
+        }
+
+        String checkpoint = indexOpts.getCheckpoint();
+        reindex(indexOpts, indexHelper, checkpoint);
+    }
+
+    private void reindex(IndexOptions idxOpts, IndexHelper indexHelper, String 
checkpoint) throws IOException, CommitFailedException {
+        Preconditions.checkNotNull(checkpoint, "Checkpoint value is required 
for reindexing done in read only mode");
+
+        Stopwatch w = Stopwatch.createStarted();
+        IndexerSupport indexerSupport = createIndexerSupport(indexHelper, 
checkpoint);
+        log.info("Proceeding to index {} upto checkpoint {} {}", 
indexHelper.getIndexPaths(), checkpoint,
+                indexerSupport.getCheckpointInfo());
+
+        if (opts.getCommonOpts().isMongo() && idxOpts.isDocTraversalMode()) {
+            log.info("Using Document order traversal to perform reindexing");
+            try (ElasticDocumentStoreIndexer indexer = new 
ElasticDocumentStoreIndexer(indexHelper, indexerSupport, 
indexOpts.getIndexPrefix(),
+                    indexOpts.getElasticScheme(), indexOpts.getElasticHost(),
+                    indexOpts.getElasticPort(), indexOpts.getApiKeyId(), 
indexOpts.getApiKeySecret())) {
+                indexer.reindex();
+                // Wait for default flush interval before exiting the try block
+                // to make sure the client is not closed before the last flush
+                // TODO : See if this can be handled in a better manner
+                
Thread.sleep(ElasticIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT * 2);
+            } catch (InterruptedException e) {
+                log.debug("Exception while waiting for Elastic connection to 
close", e);
+            }
+        } else {
+            try (ElasticOutOfBandIndexer indexer = new 
ElasticOutOfBandIndexer(indexHelper, indexerSupport, indexOpts.getIndexPrefix(),
+                    indexOpts.getElasticScheme(), indexOpts.getElasticHost(),
+                    indexOpts.getElasticPort(), indexOpts.getApiKeyId(), 
indexOpts.getApiKeySecret())) {
+
+                indexer.reindex();
+                // Wait for default flush interval before exiting the try block
+                // to make sure the client is not closed before the last flush
+                
Thread.sleep(ElasticIndexDefinition.BULK_FLUSH_INTERVAL_MS_DEFAULT * 2);
+            } catch (InterruptedException e) {
+                log.debug("Exception while waiting for Elastic connection to 
close", e);
+            }
+        }
+        indexerSupport.writeMetaInfo(checkpoint);
+        log.info("Indexing completed for indexes {} in {} ({} ms)",
+                indexHelper.getIndexPaths(), w, 
w.elapsed(TimeUnit.MILLISECONDS));
+    }
+
+    private IndexerSupport createIndexerSupport(IndexHelper indexHelper, 
String checkpoint) {
+        IndexerSupport indexerSupport = new IndexerSupport(indexHelper, 
checkpoint);
+
+        File definitions = indexOpts.getIndexDefinitionsFile();
+        if (definitions != null) {
+            Preconditions.checkArgument(definitions.exists(), "Index 
definitions file [%s] not found", getPath(definitions));
+            indexerSupport.setIndexDefinitions(definitions);
+        }
+        return indexerSupport;
+    }
+
+    static Path getPath(File file) {
+        return file.toPath().normalize().toAbsolutePath();
+    }
+
+    private void shutdownLogging() {
+        LoggingInitializer.shutdownLogging();
+    }
+
+    private static void logCliArgs(String[] args) {
+        log.info("Command line arguments used for indexing [{}]", Joiner.on(' 
').join(args));
+        List<String> inputArgs = 
ManagementFactory.getRuntimeMXBean().getInputArguments();
+        if (!inputArgs.isEmpty()) {
+            log.info("System properties and vm options passed {}", inputArgs);
+        }
+    }
+
+    public static void setDisableExitOnError(boolean disableExitOnError) {
+        ElasticIndexCommand.disableExitOnError = disableExitOnError;
+    }
+
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexOptions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexOptions.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexOptions.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticIndexOptions.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index;
+
+import joptsimple.OptionParser;
+import joptsimple.OptionSpec;
+import org.apache.jackrabbit.oak.run.cli.OptionsBeanFactory;
+
+/*
+Oak Run options for Elasticsearch indexing. These are primarily used to create 
the connection to elasticsearch.
+ */
+public class ElasticIndexOptions extends IndexOptions {
+
+    public static final OptionsBeanFactory FACTORY = ElasticIndexOptions::new;
+
+    private final OptionSpec<String> scheme;
+    private final OptionSpec<String> host;
+    private final OptionSpec<String> apiKeyId;
+    private final OptionSpec<String> apiKeySecret;
+    private final OptionSpec<Integer> port;
+    private final OptionSpec<String> indexPrefix;
+
+
+    public ElasticIndexOptions(OptionParser parser) {
+        super(parser);
+        scheme = parser.accepts("scheme", "Elastic scheme")
+                .withRequiredArg().ofType(String.class);
+        host = parser.accepts("host", "Elastic host")
+                .withRequiredArg().ofType(String.class);
+        port = parser.accepts("port", "Elastic port")
+                .withRequiredArg().ofType(Integer.class);
+        apiKeyId = parser.accepts("apiKeyId", "Elastic api key id")
+                .withRequiredArg().ofType(String.class);
+        apiKeySecret = parser.accepts("apiKeySecret", "Elastic api key host")
+                .withRequiredArg().ofType(String.class);
+        indexPrefix = parser.accepts("indexPrefix", "Elastic indexPrefix")
+                .withRequiredArg().ofType(String.class);
+    }
+
+    public String getElasticScheme() {
+        return scheme.value(options);
+    }
+
+    public int getElasticPort() {
+        return port.value(options);
+    }
+
+    public String getElasticHost() {
+        return host.value(options);
+    }
+
+    public String getApiKeyId() {
+        return apiKeyId.value(options);
+    }
+
+    public String getApiKeySecret() {
+        return apiKeySecret.value(options);
+    }
+
+    public String getIndexPrefix() {
+        return indexPrefix.value(options);
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticOutOfBandIndexer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticOutOfBandIndexer.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticOutOfBandIndexer.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/ElasticOutOfBandIndexer.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index;
+
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticConnection;
+import 
org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticIndexEditorProvider;
+import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
+
+
+import static java.util.Arrays.asList;
+
+/*
+Out of band indexer for Elasticsearch. Provides support to index segment store 
for  given index definitions or reindex existing indexes
+ */
+public class ElasticOutOfBandIndexer extends OutOfBandIndexer {
+    private final String indexPrefix;
+    private final String scheme;
+    private final String host;
+    private final int port;
+    private final String apiKeyId;
+    private final String apiSecretId;
+
+    public ElasticOutOfBandIndexer(IndexHelper indexHelper, IndexerSupport 
indexerSupport,
+                                   String indexPrefix, String scheme,
+                                   String host, int port,
+                                   String apiKeyId, String apiSecretId) {
+        super(indexHelper, indexerSupport);
+        this.indexPrefix = indexPrefix;
+        this.scheme = scheme;
+        this.host = host;
+        this.port = port;
+        this.apiKeyId = apiKeyId;
+        this.apiSecretId = apiSecretId;
+    }
+
+    @Override
+    protected IndexEditorProvider createIndexEditorProvider() {
+        IndexEditorProvider elastic = createElasticEditorProvider();
+        return CompositeIndexEditorProvider.compose(asList(elastic));
+    }
+
+    private IndexEditorProvider createElasticEditorProvider() {
+        final ElasticConnection.Builder.BuildStep buildStep = 
ElasticConnection.newBuilder()
+                .withIndexPrefix(indexPrefix)
+                .withConnectionParameters(
+                        scheme,
+                        host,
+                        port
+                );
+        final ElasticConnection coordinate;
+        if (apiKeyId != null && apiSecretId != null) {
+            coordinate = buildStep.withApiKeys(apiKeyId, apiSecretId).build();
+        } else {
+            coordinate = buildStep.build();
+        }
+        closer.register(coordinate);
+        ElasticIndexEditorProvider editorProvider = new 
ElasticIndexEditorProvider(coordinate,
+                new ExtractedTextCache(10 * FileUtils.ONE_MB, 100));
+        return editorProvider;
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexer.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexer.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexer.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index.indexer.document;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
+import org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticDocument;
+import 
org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticDocumentMaker;
+import 
org.apache.jackrabbit.oak.plugins.index.progress.IndexingProgressReporter;
+import org.apache.jackrabbit.oak.plugins.index.search.IndexDefinition;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.binary.FulltextBinaryTextExtractor;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.editor.FulltextIndexWriter;
+import org.apache.jackrabbit.oak.spi.filter.PathFilter;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+
+import java.io.IOException;
+import java.util.Set;
+
+/*
+NodeStateIndexer for Elastic. Indexes entries from a given nodestate.
+ */
+public class ElasticIndexer implements NodeStateIndexer {
+
+    private final IndexDefinition definition;
+    private final FulltextBinaryTextExtractor binaryTextExtractor;
+    private final NodeBuilder definitionBuilder;
+    private final IndexingProgressReporter progressReporter;
+    private final FulltextIndexWriter<ElasticDocument> indexWriter;
+
+    public ElasticIndexer(IndexDefinition definition, 
FulltextBinaryTextExtractor binaryTextExtractor,
+                          NodeBuilder definitionBuilder, 
IndexingProgressReporter progressReporter,
+                          FulltextIndexWriter<ElasticDocument> indexWriter) {
+        this.definition = definition;
+        this.binaryTextExtractor = binaryTextExtractor;
+        this.definitionBuilder = definitionBuilder;
+        this.progressReporter = progressReporter;
+        this.indexWriter = indexWriter;
+    }
+
+    @Override
+    public boolean shouldInclude(String path) {
+        return getFilterResult(path) != PathFilter.Result.EXCLUDE;
+    }
+
+    @Override
+    public boolean shouldInclude(NodeDocument doc) {
+        //TODO possible optimization for NodeType based filtering
+        return true;
+    }
+
+    @Override
+    public boolean index(NodeStateEntry entry) throws IOException, 
CommitFailedException {
+        if (getFilterResult(entry.getPath()) != PathFilter.Result.INCLUDE) {
+            return false;
+        }
+
+        IndexDefinition.IndexingRule indexingRule = 
definition.getApplicableIndexingRule(entry.getNodeState());
+
+        if (indexingRule == null) {
+            return false;
+        }
+        ElasticDocumentMaker maker = newDocumentMaker(indexingRule, 
entry.getPath());
+
+        ElasticDocument doc = maker.makeDocument(entry.getNodeState());
+
+        if (doc != null) {
+            writeToIndex(doc, entry.getPath());
+            progressReporter.indexUpdate(definition.getIndexPath());
+            return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean indexesRelativeNodes() {
+        return definition.indexesRelativeNodes();
+    }
+
+    @Override
+    public Set<String> getRelativeIndexedNodeNames() {
+        return definition.getRelativeNodeNames();
+    }
+
+    @Override
+    public void close() throws IOException {
+        indexWriter.close(System.currentTimeMillis());
+    }
+
+    private PathFilter.Result getFilterResult(String path) {
+        return definition.getPathFilter().filter(path);
+    }
+
+    private void writeToIndex(ElasticDocument doc, String path) throws 
IOException {
+        indexWriter.updateDocument(path, doc);
+    }
+
+    private ElasticDocumentMaker newDocumentMaker(IndexDefinition.IndexingRule 
indexingRule, String path) {
+        return new ElasticDocumentMaker(binaryTextExtractor, definition,
+                indexingRule,
+                path);
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerProvider.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerProvider.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerProvider.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index.indexer.document;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.oak.index.IndexHelper;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticConnection;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexDefinition;
+import org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticDocument;
+import 
org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticIndexWriterFactory;
+import 
org.apache.jackrabbit.oak.plugins.index.progress.IndexingProgressReporter;
+import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.binary.FulltextBinaryTextExtractor;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.editor.FulltextIndexWriter;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.jetbrains.annotations.NotNull;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+
+public class ElasticIndexerProvider implements NodeStateIndexerProvider {
+    private final ExtractedTextCache textCache =
+            new ExtractedTextCache(FileUtils.ONE_MB * 5, 
TimeUnit.HOURS.toSeconds(5));
+    private final IndexHelper indexHelper;
+    private final ElasticIndexWriterFactory indexWriterFactory;
+    private final ElasticConnection coordinate;
+
+    public ElasticIndexerProvider(IndexHelper indexHelper, ElasticConnection 
coordinate) {
+        this.indexHelper = indexHelper;
+        this.indexWriterFactory = new ElasticIndexWriterFactory(coordinate);
+        this.coordinate = coordinate;
+    }
+
+
+    @Override
+    public @Nullable NodeStateIndexer getIndexer(@NotNull String type, 
@NotNull String indexPath, @NotNull NodeBuilder definition, @NotNull NodeState 
root, IndexingProgressReporter progressReporter) {
+        if 
(!ElasticIndexDefinition.TYPE_ELASTICSEARCH.equals(definition.getString(TYPE_PROPERTY_NAME)))
 {
+            return null;
+        }
+        ElasticIndexDefinition idxDefinition = (ElasticIndexDefinition) new 
ElasticIndexDefinition.Builder(coordinate.getIndexPrefix()).
+                
root(root).indexPath(indexPath).defn(definition.getNodeState()).reindex().build();
+
+        FulltextIndexWriter<ElasticDocument> indexWriter = 
indexWriterFactory.newInstance(idxDefinition, definition, CommitInfo.EMPTY, 
true);
+        FulltextBinaryTextExtractor textExtractor = new 
FulltextBinaryTextExtractor(textCache, idxDefinition, true);
+        return new ElasticIndexer(idxDefinition, textExtractor, definition, 
progressReporter, indexWriter);
+    }
+
+    @Override
+    public void close() throws IOException {
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/AvailableElasticModes.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/AvailableElasticModes.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/AvailableElasticModes.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/AvailableElasticModes.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.run;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.oak.index.ElasticIndexCommand;
+import org.apache.jackrabbit.oak.run.commons.Command;
+import org.apache.jackrabbit.oak.run.commons.Modes;
+
+/*
+Avaialble modes for elastic. Add new elastic operations/commands to be 
supported here.
+ */
+public final class AvailableElasticModes {
+    // list of available Modes for the tool
+    public static final Modes MODES = new Modes(
+            ImmutableMap.<String, Command>builder()
+                    .put("index", new ElasticIndexCommand())
+                    .build());
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/Main.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/Main.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/main/java/org/apache/jackrabbit/oak/run/Main.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.run;
+
+import org.apache.jackrabbit.oak.run.commons.Command;
+import org.apache.jackrabbit.oak.run.commons.Utils;
+
+import java.util.Locale;
+
+import static java.util.Arrays.copyOfRange;
+import static org.apache.jackrabbit.oak.run.AvailableElasticModes.MODES;
+
+/*
+Entry point for the oak run elastic utility
+ */
+public final class Main {
+    private Main() {
+        // Prevent instantiation.
+    }
+
+    public static void main(String... args) throws Exception {
+        Utils.printProductInfo(
+                args,
+                
Main.class.getResourceAsStream("/META-INF/maven/org.apache.jackrabbit/oak-run-elastic/pom.properties"));
+
+        Command command = MODES.getCommand("help");
+
+        if (args.length > 0) {
+            command = MODES.getCommand(args[0].toLowerCase(Locale.ENGLISH));
+
+            if (command == null) {
+                command = MODES.getCommand("help");
+            }
+
+            args = copyOfRange(args, 1, args.length);
+        }
+
+        command.execute(args);
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerTest.java?rev=1885742&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run-elastic/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/ElasticIndexerTest.java
 Thu Jan 21 06:48:34 2021
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.jackrabbit.oak.index.indexer.document;
+
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticConnection;
+import org.apache.jackrabbit.oak.plugins.index.elastic.ElasticIndexDefinition;
+import 
org.apache.jackrabbit.oak.plugins.index.elastic.index.ElasticIndexWriterFactory;
+import 
org.apache.jackrabbit.oak.plugins.index.elastic.util.ElasticIndexDefinitionBuilder;
+import 
org.apache.jackrabbit.oak.plugins.index.progress.IndexingProgressReporter;
+import org.apache.jackrabbit.oak.plugins.index.search.IndexDefinition;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.binary.FulltextBinaryTextExtractor;
+import 
org.apache.jackrabbit.oak.plugins.index.search.spi.editor.FulltextIndexWriter;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT;
+
+public class ElasticIndexerTest {
+
+    private NodeState root = INITIAL_CONTENT;
+
+    @Test
+    public void nodeIndexed_WithIncludedPaths() throws Exception {
+        ElasticIndexDefinitionBuilder idxb = new 
ElasticIndexDefinitionBuilder();
+        idxb.indexRule("nt:base").property("foo").propertyIndex();
+        idxb.includedPaths("/content");
+
+        NodeState defn = idxb.build();
+        IndexDefinition idxDefn = new ElasticIndexDefinition(root, defn, 
"/oak:index/testIndex", "testPrefix");
+
+        NodeBuilder builder = root.builder();
+
+        FulltextIndexWriter indexWriter = new 
ElasticIndexWriterFactory(mock(ElasticConnection.class)).newInstance(idxDefn, 
defn.builder(), CommitInfo.EMPTY, true);
+        ElasticIndexer indexer = new ElasticIndexer(idxDefn, 
mock(FulltextBinaryTextExtractor.class), builder,
+                mock(IndexingProgressReporter.class), indexWriter);
+
+        NodeState testNode = EMPTY_NODE.builder().setProperty("foo", 
"bar").getNodeState();
+
+        assertTrue(indexer.index(new NodeStateEntry(testNode, "/content/x")));
+        assertFalse(indexer.index(new NodeStateEntry(testNode, "/x")));
+        assertFalse(indexer.index(new NodeStateEntry(testNode, "/")));
+    }
+
+}

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
 Thu Jan 21 06:48:34 2021
@@ -53,8 +53,8 @@ public class IndexOptions implements Opt
     private final OptionSpec<Void> importIndex;
     private final OptionSpec<Void> docTraversal;
     private final OptionSpec<Integer> consistencyCheck;
-    private OptionSet options;
-    private final Set<OptionSpec> actionOpts;
+    protected OptionSet options;
+    protected final Set<OptionSpec> actionOpts;
     private final OptionSpec<String> indexPaths;
     private final OptionSpec<String> checkpoint;
     private final Set<String> operationNames;

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/OutOfBandIndexer.java
 Thu Jan 21 06:48:34 2021
@@ -66,7 +66,7 @@ public class OutOfBandIndexer implements
      */
     public static final String LOCAL_INDEX_ROOT_DIR = "indexes";
 
-    private final Closer closer = Closer.create();
+    protected final Closer closer = Closer.create();
     private final IndexHelper indexHelper;
     private NodeStore copyOnWriteStore;
     private IndexerSupport indexerSupport;
@@ -145,7 +145,7 @@ public class OutOfBandIndexer implements
         copyOnWriteStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
     }
 
-    private IndexEditorProvider createIndexEditorProvider() throws IOException 
{
+    protected IndexEditorProvider createIndexEditorProvider() throws 
IOException {
         IndexEditorProvider lucene = createLuceneEditorProvider();
         IndexEditorProvider property = createPropertyEditorProvider();
 

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexer.java
 Thu Jan 21 06:48:34 2021
@@ -62,7 +62,7 @@ import static org.apache.jackrabbit.oak.
 public class DocumentStoreIndexer implements Closeable{
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final Logger traversalLog = 
LoggerFactory.getLogger(DocumentStoreIndexer.class.getName()+".traversal");
-    private final Closer closer = Closer.create();
+    protected final Closer closer = Closer.create();
     private final IndexHelper indexHelper;
     private final List<NodeStateIndexerProvider> indexerProviders;
     private final IndexerSupport indexerSupport;
@@ -204,7 +204,7 @@ public class DocumentStoreIndexer implem
         return new CompositeIndexer(indexers);
     }
 
-    private List<NodeStateIndexerProvider> createProviders() throws 
IOException {
+    protected List<NodeStateIndexerProvider> createProviders() throws 
IOException {
         List<NodeStateIndexerProvider> providers = ImmutableList.of(
           createLuceneIndexProvider()
         );

Modified: 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
 Thu Jan 21 06:48:34 2021
@@ -37,7 +37,7 @@ import java.util.Set;
 
 import static 
org.apache.jackrabbit.oak.plugins.index.elastic.util.ElasticIndexUtils.toDoubles;
 
-class ElasticDocument {
+public class ElasticDocument {
     private static final Logger LOG = 
LoggerFactory.getLogger(ElasticDocument.class);
 
     private final String path;

Modified: 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocumentMaker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocumentMaker.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocumentMaker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocumentMaker.java
 Thu Jan 21 06:48:34 2021
@@ -34,9 +34,9 @@ import org.jetbrains.annotations.Nullabl
 import java.io.IOException;
 import java.util.List;
 
-class ElasticDocumentMaker extends FulltextDocumentMaker<ElasticDocument> {
+public class ElasticDocumentMaker extends 
FulltextDocumentMaker<ElasticDocument> {
 
-    ElasticDocumentMaker(@Nullable FulltextBinaryTextExtractor textExtractor,
+    public ElasticDocumentMaker(@Nullable FulltextBinaryTextExtractor 
textExtractor,
                          @NotNull IndexDefinition definition,
                          IndexDefinition.IndexingRule indexingRule, @NotNull 
String path) {
         super(textExtractor, definition, indexingRule, path);

Modified: 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexWriterFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexWriterFactory.java?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexWriterFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexWriterFactory.java
 Thu Jan 21 06:48:34 2021
@@ -24,10 +24,10 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.jetbrains.annotations.NotNull;
 
-class ElasticIndexWriterFactory implements 
FulltextIndexWriterFactory<ElasticDocument> {
+public class ElasticIndexWriterFactory implements 
FulltextIndexWriterFactory<ElasticDocument> {
     private final ElasticConnection elasticConnection;
 
-    ElasticIndexWriterFactory(@NotNull ElasticConnection elasticConnection) {
+    public ElasticIndexWriterFactory(@NotNull ElasticConnection 
elasticConnection) {
         this.elasticConnection = elasticConnection;
     }
 

Modified: jackrabbit/oak/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/pom.xml?rev=1885742&r1=1885741&r2=1885742&view=diff
==============================================================================
--- jackrabbit/oak/trunk/pom.xml (original)
+++ jackrabbit/oak/trunk/pom.xml Thu Jan 21 06:48:34 2021
@@ -81,6 +81,7 @@
     <module>oak-benchmarks-lucene</module>
     <module>oak-benchmarks-solr</module>
     <module>oak-benchmarks-elastic</module>
+      <module>oak-run-elastic</module>
   </modules>
 
   <scm>


Reply via email to