From a75fa0c48a3cd9ac486d8f5d0bd3c8107f10eef6 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 21 May 2019 12:00:40 +0200 Subject: [PATCH 01/67] WIP add enterprise search connector --- .../crawler/fs/settings/EnterpriseSearch.java | 121 ++++++++++++++++++ .../crawler/fs/settings/FsSettings.java | 23 +++- 2 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java new file mode 100644 index 000000000..53c9d3b31 --- /dev/null +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java @@ -0,0 +1,121 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.settings; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Objects; + +public class EnterpriseSearch { + + protected static final Logger logger = LogManager.getLogger(EnterpriseSearch.class); + public static final ServerUrl SERVER_DEFAULT = new ServerUrl("http://localhost:3002"); + + private ServerUrl server = SERVER_DEFAULT; + private String contentSourceKey; + private String accessToken; + + public EnterpriseSearch() { + + } + + public EnterpriseSearch(ServerUrl server, String contentSourceKey, String accessToken) { + this.server = server; + this.contentSourceKey = contentSourceKey; + this.accessToken = accessToken; + } + + public static Builder builder() { + return new Builder(); + } + + public ServerUrl getServer() { + return server; + } + + public void setServer(ServerUrl server) { + this.server = server; + } + + public String getContentSourceKey() { + return contentSourceKey; + } + + public void setContentSourceKey(String contentSourceKey) { + this.contentSourceKey = contentSourceKey; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public static class Builder { + private ServerUrl server = SERVER_DEFAULT; + private String contentSourceKey; + private String accessToken; + + public Builder setServer(ServerUrl server) { + this.server = server; + return this; + } + + public Builder setContentSourceKey(String contentSourceKey) { + this.contentSourceKey = contentSourceKey; + return this; + } + + public Builder setAccessToken(String accessToken) { + this.accessToken = accessToken; + return this; + } + + public EnterpriseSearch build() { + return new EnterpriseSearch(server, contentSourceKey, accessToken); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EnterpriseSearch that = (EnterpriseSearch) o; + return Objects.equals(server, that.server) && + Objects.equals(contentSourceKey, that.contentSourceKey) && + Objects.equals(accessToken, that.accessToken); + } + + @Override + public int hashCode() { + return Objects.hash(server, contentSourceKey, accessToken); + } + + @Override + public String toString() { + return "EnterpriseSearch{" + "server=" + server + + ", contentSourceKey='" + contentSourceKey + '\'' + + ", accessToken='" + accessToken + '\'' + + '}'; + } +} diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java index 6897ec191..6ad3a6193 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java @@ -28,17 +28,19 @@ public class FsSettings { private Fs fs; private Server server; private Elasticsearch elasticsearch; + private EnterpriseSearch enterpriseSearch; private Rest rest; public FsSettings() { } - private FsSettings(String name, Fs fs, Server server, Elasticsearch elasticsearch, Rest rest) { + private FsSettings(String name, Fs fs, Server server, Elasticsearch elasticsearch, EnterpriseSearch enterpriseSearch, Rest rest) { this.name = name; this.fs = fs; this.server = server; this.elasticsearch = elasticsearch; + this.enterpriseSearch = enterpriseSearch; this.rest = rest; } @@ -51,6 +53,7 @@ public static class Builder { private Fs fs = Fs.DEFAULT; private Server server = null; private Elasticsearch elasticsearch = Elasticsearch.DEFAULT(); + private EnterpriseSearch enterpriseSearch = null; private Rest rest = null; private Builder setName(String name) { @@ -73,13 +76,18 @@ public Builder setElasticsearch(Elasticsearch elasticsearch) { return this; } + public Builder setEnterpriseSearch(EnterpriseSearch enterpriseSearch) { + this.enterpriseSearch = enterpriseSearch; + return this; + } + public Builder setRest(Rest rest) { this.rest = rest; return this; } public FsSettings build() { - return new FsSettings(name, fs, server, elasticsearch, rest); + return new FsSettings(name, fs, server, elasticsearch, enterpriseSearch, rest); } } @@ -115,6 +123,14 @@ public void setElasticsearch(Elasticsearch elasticsearch) { this.elasticsearch = elasticsearch; } + public void setEnterpriseSearch(EnterpriseSearch enterpriseSearch) { + this.enterpriseSearch = enterpriseSearch; + } + + public EnterpriseSearch getEnterpriseSearch() { + return enterpriseSearch; + } + public Rest getRest() { return rest; } @@ -134,6 +150,7 @@ public boolean equals(Object o) { if (!Objects.equals(fs, that.fs)) return false; if (!Objects.equals(server, that.server)) return false; if (!Objects.equals(rest, that.rest)) return false; + if (!Objects.equals(enterpriseSearch, that.enterpriseSearch)) return false; return Objects.equals(elasticsearch, that.elasticsearch); } @@ -145,6 +162,7 @@ public int hashCode() { result = 31 * result + (server != null ? server.hashCode() : 0); result = 31 * result + (rest != null ? rest.hashCode() : 0); result = 31 * result + (elasticsearch != null ? elasticsearch.hashCode() : 0); + result = 31 * result + (enterpriseSearch != null ? enterpriseSearch.hashCode() : 0); return result; } @@ -154,6 +172,7 @@ public String toString() { ", fs=" + fs + ", server=" + server + ", elasticsearch=" + elasticsearch + + ", enterpriseSearch=" + enterpriseSearch + ", rest=" + rest + '}'; } From 7780e9600b8408320086c5dd5fc3b8d51c4b4646 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 20 Jul 2020 15:45:41 +0200 Subject: [PATCH 02/67] Rename to workplace search --- .../crawler/fs/settings/FsSettings.java | 28 +++++++++---------- ...rpriseSearch.java => WorkplaceSearch.java} | 14 +++++----- 2 files changed, 21 insertions(+), 21 deletions(-) rename settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/{EnterpriseSearch.java => WorkplaceSearch.java} (90%) diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java index 6ad3a6193..660b17147 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettings.java @@ -28,19 +28,19 @@ public class FsSettings { private Fs fs; private Server server; private Elasticsearch elasticsearch; - private EnterpriseSearch enterpriseSearch; + private WorkplaceSearch workplaceSearch; private Rest rest; public FsSettings() { } - private FsSettings(String name, Fs fs, Server server, Elasticsearch elasticsearch, EnterpriseSearch enterpriseSearch, Rest rest) { + private FsSettings(String name, Fs fs, Server server, Elasticsearch elasticsearch, WorkplaceSearch workplaceSearch, Rest rest) { this.name = name; this.fs = fs; this.server = server; this.elasticsearch = elasticsearch; - this.enterpriseSearch = enterpriseSearch; + this.workplaceSearch = workplaceSearch; this.rest = rest; } @@ -53,7 +53,7 @@ public static class Builder { private Fs fs = Fs.DEFAULT; private Server server = null; private Elasticsearch elasticsearch = Elasticsearch.DEFAULT(); - private EnterpriseSearch enterpriseSearch = null; + private WorkplaceSearch workplaceSearch = null; private Rest rest = null; private Builder setName(String name) { @@ -76,8 +76,8 @@ public Builder setElasticsearch(Elasticsearch elasticsearch) { return this; } - public Builder setEnterpriseSearch(EnterpriseSearch enterpriseSearch) { - this.enterpriseSearch = enterpriseSearch; + public Builder setWorkplaceSearch(WorkplaceSearch workplaceSearch) { + this.workplaceSearch = workplaceSearch; return this; } @@ -87,7 +87,7 @@ public Builder setRest(Rest rest) { } public FsSettings build() { - return new FsSettings(name, fs, server, elasticsearch, enterpriseSearch, rest); + return new FsSettings(name, fs, server, elasticsearch, workplaceSearch, rest); } } @@ -123,12 +123,12 @@ public void setElasticsearch(Elasticsearch elasticsearch) { this.elasticsearch = elasticsearch; } - public void setEnterpriseSearch(EnterpriseSearch enterpriseSearch) { - this.enterpriseSearch = enterpriseSearch; + public void setWorkplaceSearch(WorkplaceSearch workplaceSearch) { + this.workplaceSearch = workplaceSearch; } - public EnterpriseSearch getEnterpriseSearch() { - return enterpriseSearch; + public WorkplaceSearch getWorkplaceSearch() { + return workplaceSearch; } public Rest getRest() { @@ -150,7 +150,7 @@ public boolean equals(Object o) { if (!Objects.equals(fs, that.fs)) return false; if (!Objects.equals(server, that.server)) return false; if (!Objects.equals(rest, that.rest)) return false; - if (!Objects.equals(enterpriseSearch, that.enterpriseSearch)) return false; + if (!Objects.equals(workplaceSearch, that.workplaceSearch)) return false; return Objects.equals(elasticsearch, that.elasticsearch); } @@ -162,7 +162,7 @@ public int hashCode() { result = 31 * result + (server != null ? server.hashCode() : 0); result = 31 * result + (rest != null ? rest.hashCode() : 0); result = 31 * result + (elasticsearch != null ? elasticsearch.hashCode() : 0); - result = 31 * result + (enterpriseSearch != null ? enterpriseSearch.hashCode() : 0); + result = 31 * result + (workplaceSearch != null ? workplaceSearch.hashCode() : 0); return result; } @@ -172,7 +172,7 @@ public String toString() { ", fs=" + fs + ", server=" + server + ", elasticsearch=" + elasticsearch + - ", enterpriseSearch=" + enterpriseSearch + + ", enterpriseSearch=" + workplaceSearch + ", rest=" + rest + '}'; } diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java similarity index 90% rename from settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java rename to settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java index 53c9d3b31..f489fde31 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/EnterpriseSearch.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java @@ -24,20 +24,20 @@ import java.util.Objects; -public class EnterpriseSearch { +public class WorkplaceSearch { - protected static final Logger logger = LogManager.getLogger(EnterpriseSearch.class); + protected static final Logger logger = LogManager.getLogger(WorkplaceSearch.class); public static final ServerUrl SERVER_DEFAULT = new ServerUrl("http://localhost:3002"); private ServerUrl server = SERVER_DEFAULT; private String contentSourceKey; private String accessToken; - public EnterpriseSearch() { + public WorkplaceSearch() { } - public EnterpriseSearch(ServerUrl server, String contentSourceKey, String accessToken) { + public WorkplaceSearch(ServerUrl server, String contentSourceKey, String accessToken) { this.server = server; this.contentSourceKey = contentSourceKey; this.accessToken = accessToken; @@ -91,8 +91,8 @@ public Builder setAccessToken(String accessToken) { return this; } - public EnterpriseSearch build() { - return new EnterpriseSearch(server, contentSourceKey, accessToken); + public WorkplaceSearch build() { + return new WorkplaceSearch(server, contentSourceKey, accessToken); } } @@ -100,7 +100,7 @@ public EnterpriseSearch build() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - EnterpriseSearch that = (EnterpriseSearch) o; + WorkplaceSearch that = (WorkplaceSearch) o; return Objects.equals(server, that.server) && Objects.equals(contentSourceKey, that.contentSourceKey) && Objects.equals(accessToken, that.accessToken); From 1293f3859575c9c8ea73cd81b1d14ebb588d55d3 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 20 Jul 2020 16:08:29 +0200 Subject: [PATCH 03/67] Add docker-compose integration test file --- contrib/docker-compose-workplacesearch/.env | 2 + .../docker-compose.yml | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 contrib/docker-compose-workplacesearch/.env create mode 100644 contrib/docker-compose-workplacesearch/docker-compose.yml diff --git a/contrib/docker-compose-workplacesearch/.env b/contrib/docker-compose-workplacesearch/.env new file mode 100644 index 000000000..d9098918e --- /dev/null +++ b/contrib/docker-compose-workplacesearch/.env @@ -0,0 +1,2 @@ +ELASTIC_VERSION=7.8.0 +ELASTIC_PASSWORD=changeme diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml new file mode 100644 index 000000000..178220dcd --- /dev/null +++ b/contrib/docker-compose-workplacesearch/docker-compose.yml @@ -0,0 +1,38 @@ +--- +version: '3' +services: + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:$ELASTIC_VERSION + environment: + - bootstrap.memory_lock=true + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms2g -Xmx2g" + - cluster.routing.allocation.disk.threshold_enabled=false + - ELASTIC_PASSWORD=$ELASTIC_PASSWORD + - xpack.security.enabled=true + - xpack.security.authc.api_key.enabled=true + - xpack.license.self_generated.type=trial + ulimits: + memlock: + soft: -1 + hard: -1 + networks: ['stack'] + + enterprisesearch: + image: docker.elastic.co/enterprise-search/enterprise-search:$ELASTIC_VERSION + environment: + - "ent_search.auth.source=standard" + - "elasticsearch.username=elastic" + - "elasticsearch.password=$ELASTIC_PASSWORD" + - "elasticsearch.host=http://elasticsearch:9200" + - "allow_es_settings_modification=true" + - "secret_management.encryption_keys=[XYZ]" + - "ENT_SEARCH_DEFAULT_PASSWORD=$ELASTIC_PASSWORD" + ports: ['3002:3002'] + networks: ['stack'] + links: ['elasticsearch'] + depends_on: ['elasticsearch'] + +networks: + stack: {} From 97a422d7755e656c88a40ff72e9b283ddde0da2c Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 20 Jul 2020 16:08:43 +0200 Subject: [PATCH 04/67] Add documentation for running tests --- .../docker-compose-workplacesearch/README.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 contrib/docker-compose-workplacesearch/README.md diff --git a/contrib/docker-compose-workplacesearch/README.md b/contrib/docker-compose-workplacesearch/README.md new file mode 100644 index 000000000..88dd9860a --- /dev/null +++ b/contrib/docker-compose-workplacesearch/README.md @@ -0,0 +1,33 @@ +# Developper Guide + +This documentation shows how to manually test the Workplace Search integration until we can make all that automatic. + +## Launch Workplace Search + +Go to the `contrib/docker-compose-workplacesearch` dir and type: + +```sh +docker-compose up +``` + +Wait for everything to start. It could take several minutes: + +``` +enterprisesearch_1 | 2020-07-20 13:55:08.199:INFO:oejs.ServerConnector:main: Started ServerConnector@252570b9{HTTP/1.1}{0.0.0.0:3002} +enterprisesearch_1 | 2020-07-20 13:55:08.199:INFO:oejs.Server:main: Started @342868ms +``` + +Then you can open http://localhost:3002 and log in with `enterprise_search` / `changeme` account. +Then launch [Workplace Search](http://localhost:3002/ws) and [add a custom source](http://localhost:3002/ws/org/sources#/add/custom). +Name it `fscrawler`. + +You will be able to retrieve your Access Token and the Key. + +* `0bbc4c1c20ad6088e719154d8ebef41b4302677fe93710f9b06295a139b10d1e` +* `5f15a47dd26b57eaa88fb196` + +## Configure FSCrawler + +Create a config file for fscrawler. + +TODO continue from here From 04181b2053c842d0a59cc91978525d46ddd7ad94 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 20 Jul 2020 17:15:02 +0200 Subject: [PATCH 05/67] Add the first "manual" IT for WPSearch It's just a skeleton for now. --- .../docker-compose-workplacesearch/README.md | 39 ++++++++++- .../docker-compose.yml | 1 + .../integration/AbstractFsCrawlerITCase.java | 10 ++- .../FsCrawlerTestWorkplaceSearchIT.java | 67 +++++++++++++++++++ 4 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java diff --git a/contrib/docker-compose-workplacesearch/README.md b/contrib/docker-compose-workplacesearch/README.md index 88dd9860a..5a16ed9ab 100644 --- a/contrib/docker-compose-workplacesearch/README.md +++ b/contrib/docker-compose-workplacesearch/README.md @@ -26,8 +26,43 @@ You will be able to retrieve your Access Token and the Key. * `0bbc4c1c20ad6088e719154d8ebef41b4302677fe93710f9b06295a139b10d1e` * `5f15a47dd26b57eaa88fb196` +## Build FSCrawler + +```sh +mvn clean install -DskipTests +cd distribution/es7/target/ +unzip fscrawler-es7-2.7-SNAPSHOT.zip +``` + + ## Configure FSCrawler -Create a config file for fscrawler. +```sh +fscrawler-es7-2.7-SNAPSHOT/bin/fscrawler workplace --config_dir ./config +``` + +Type `Y` to create the default config file `./config/workplace/_settings.yaml` and edit it as is: + +```yml +--- +name: "workplace" +fs: + url: "/tmp/es" + update_rate: "15m" +elasticsearch: + nodes: + - url: "http://127.0.0.1:9200" + username: "elastic" + password: "changeme" +workplace_search: + content_source_key: "0bbc4c1c20ad6088e719154d8ebef41b4302677fe93710f9b06295a139b10d1e" + access_token: "5f15a47dd26b57eaa88fb196" +``` + +## Launch FSCrawler + +```sh +fscrawler-es7-2.7-SNAPSHOT/bin/fscrawler workplace --config_dir ./config +``` + -TODO continue from here diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml index 178220dcd..df00d1c23 100644 --- a/contrib/docker-compose-workplacesearch/docker-compose.yml +++ b/contrib/docker-compose-workplacesearch/docker-compose.yml @@ -17,6 +17,7 @@ services: memlock: soft: -1 hard: -1 + ports: ['9200:9200'] networks: ['stack'] enterprisesearch: diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java index 7e22ff7b9..7005934b4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java @@ -94,13 +94,19 @@ FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsea FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsearch, Server server, Rest rest, TimeValue duration) throws Exception { + startCrawler(jobName, FsSettings.builder(jobName).setElasticsearch(elasticsearch).setFs(fs).setServer(server).setRest(rest).build(), duration); + return crawler; + } + + FsCrawlerImpl startCrawler(final String jobName, FsSettings fsSettings, TimeValue duration) + throws Exception { logger.info(" --> starting crawler [{}]", jobName); crawler = new FsCrawlerImpl( metadataDir, - FsSettings.builder(jobName).setElasticsearch(elasticsearch).setFs(fs).setServer(server).setRest(rest).build(), + fsSettings, LOOP_INFINITE, - rest != null); + fsSettings.getRest() != null); crawler.start(); // We wait up to X seconds before considering a failing test diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java new file mode 100644 index 000000000..b5ac3fc85 --- /dev/null +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java @@ -0,0 +1,67 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.test.integration; + +import fr.pilato.elasticsearch.crawler.fs.beans.Attributes; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; +import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; +import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; +import org.junit.Test; + +import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; +import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; + +/** + * Test workplace search + */ +public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { + + // TODO We will run it only if Workplace Search is running + + @Test + public void testWorkplaceSearch() throws Exception { + Fs fs = startCrawlerDefinition().build(); + FsSettings fsSettings = FsSettings.builder(getCrawlerName()) + .setFs(fs) + .setElasticsearch(Elasticsearch.builder() + .addNode(NODE_DEFAULT) + .setUsername("elastic").setPassword("changeme").build()) + .setWorkplaceSearch(WorkplaceSearch.builder() + .setAccessToken("5f15afdb6056c1d98c45bacd") + .setContentSourceKey("9e27917499d055fe3955c1b9e997a53ce3f1d9dcfb650358dcc7fc6e4e5b75d7") + .build()) + .build(); + + startCrawler(getCrawlerName(), fsSettings, TimeValue.timeValueSeconds(10)); + ESSearchResponse searchResponse = countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 1L, null); + } +} From 09c4265cea7ece9bc282821c409b5c66e90065fb Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 29 Jul 2020 17:47:50 +0200 Subject: [PATCH 06/67] Initial step This one is working manually. --- .../elasticsearch/crawler/fs/beans/Doc.java | 5 + .../crawler/fs/beans/DocParser.java | 9 +- .../crawler/fs/beans/PathParser.java | 9 +- .../docker-compose.yml | 3 +- .../crawler/fs/FsCrawlerImpl.java | 9 +- .../crawler/fs/FsParserAbstract.java | 40 +++- .../crawler/fs/FsParserLocal.java | 5 +- .../elasticsearch/crawler/fs/FsParserSsh.java | 5 +- .../elasticsearch-client-base/pom.xml | 7 + .../fs/client/ElasticsearchClient.java | 13 +- .../fs/client/WorkplaceSearchClient.java | 4 + .../fs/client/WorkplaceSearchClientNoOp.java | 151 +++++++++++++ .../fs/client/WorkplaceSearchClientUtil.java | 114 ++++++++++ .../client/ElasticsearchClientDummyBase.java | 7 +- .../fs/client/fscrawler-client.properties | 2 +- .../fscrawler-client-wrong-version.properties | 2 +- .../fs/client/v6/ElasticsearchClientV6.java | 11 +- .../elasticsearch-client-v7/pom.xml | 4 + .../fs/client/v7/ElasticsearchClientV7.java | 12 +- .../fs/client/v7/WorkplaceSearchClientV7.java | 208 ++++++++++++++++++ .../client/v7/ElasticsearchClientV7Test.java | 8 + .../integration/ElasticsearchClientIT.java | 5 +- .../test/integration/FsCrawlerTestRawIT.java | 4 +- .../FsCrawlerTestWorkplaceSearchIT.java | 22 +- pom.xml | 42 ++++ .../crawler/fs/rest/UploadApi.java | 4 +- .../crawler/fs/tika/XmlDocParser.java | 15 +- 27 files changed, 660 insertions(+), 60 deletions(-) create mode 100644 elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClient.java create mode 100644 elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java create mode 100644 elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java create mode 100644 elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java diff --git a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/Doc.java b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/Doc.java index aac4c1ba8..180e2c349 100644 --- a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/Doc.java +++ b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/Doc.java @@ -55,6 +55,11 @@ public Doc() { external = null; } + public Doc(String content) { + this(); + this.content = content; + } + public Map getObject() { return object; } diff --git a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java index dc896ab90..b24177f7c 100644 --- a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java +++ b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java @@ -28,8 +28,13 @@ public class DocParser { - public static String toJson(Doc doc) throws JsonProcessingException { - return prettyMapper.writeValueAsString(doc); + public static String toJson(Doc doc) { + try { + return prettyMapper.writeValueAsString(doc); + } catch (IOException e) { + // TODO Fix that code. We should log here and return null. + throw new RuntimeException(e); + } } public static Doc fromJson(String json) throws IOException { diff --git a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java index aa9389c3c..44901b4da 100644 --- a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java +++ b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java @@ -27,8 +27,13 @@ public class PathParser { - public static String toJson(Path path) throws JsonProcessingException { - return prettyMapper.writeValueAsString(path); + public static String toJson(Path path) { + try { + return prettyMapper.writeValueAsString(path); + } catch (IOException e) { + // TODO Fix that code. We should log here and return null. + throw new RuntimeException(e); + } } public static Path fromJson(String json) throws IOException { diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml index df00d1c23..680d31a96 100644 --- a/contrib/docker-compose-workplacesearch/docker-compose.yml +++ b/contrib/docker-compose-workplacesearch/docker-compose.yml @@ -7,11 +7,12 @@ services: environment: - bootstrap.memory_lock=true - discovery.type=single-node - - "ES_JAVA_OPTS=-Xms2g -Xmx2g" + - "ES_JAVA_OPTS=-Xms3g -Xmx3g" - cluster.routing.allocation.disk.threshold_enabled=false - ELASTIC_PASSWORD=$ELASTIC_PASSWORD - xpack.security.enabled=true - xpack.security.authc.api_key.enabled=true + - xpack.ml.enabled=false - xpack.license.self_generated.type=trial ulimits: memlock: diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java index ed66b8538..122deac80 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java @@ -21,6 +21,8 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; @@ -54,6 +56,7 @@ public class FsCrawlerImpl { private Thread fsCrawlerThread; private final ElasticsearchClient esClient; + private final WorkplaceSearchClient wpClient; private FsParser fsParser; public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean rest) { @@ -64,6 +67,7 @@ public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean res this.loop = loop; this.rest = rest; this.esClient = ElasticsearchClientUtil.getInstance(config, settings); + this.wpClient = WorkplaceSearchClientUtil.getInstance(config, settings); // We don't go further as we have critical errors // It's just a double check as settings must be validated before creating the instance @@ -97,16 +101,17 @@ public void start() throws Exception { esClient.start(); esClient.createIndices(); + wpClient.start(); // Start the crawler thread - but not if only in rest mode if (loop != 0) { // What is the protocol used? if (settings.getServer() == null || Server.PROTOCOL.LOCAL.equals(settings.getServer().getProtocol())) { // Local FS - fsParser = new FsParserLocal(settings, config, esClient, loop); + fsParser = new FsParserLocal(settings, config, esClient, wpClient, loop); } else if (Server.PROTOCOL.SSH.equals(settings.getServer().getProtocol())) { // Remote SSH FS - fsParser = new FsParserSsh(settings, config, esClient, loop); + fsParser = new FsParserSsh(settings, config, esClient, wpClient, loop); } else { // Non supported protocol throw new RuntimeException(settings.getServer().getProtocol() + " is not supported yet. Please use " + diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java index 6eb6c397f..91f866602 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java @@ -31,6 +31,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractModel; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; @@ -57,6 +58,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.function.Function; import java.util.stream.Collectors; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.computeVirtualPathName; @@ -76,17 +78,31 @@ public abstract class FsParserAbstract extends FsParser { final FsSettings fsSettings; private final FsJobFileHandler fsJobFileHandler; + + private final ElasticsearchClient documentIndexer; + private final ElasticsearchClient esClient; + private final WorkplaceSearchClient wpClient; private final Integer loop; private final MessageDigest messageDigest; private final String pathSeparator; private ScanStatistic stats; - FsParserAbstract(FsSettings fsSettings, Path config, ElasticsearchClient esClient, Integer loop) { + FsParserAbstract(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { this.fsSettings = fsSettings; this.fsJobFileHandler = new FsJobFileHandler(config); this.esClient = esClient; + this.wpClient = wpClient; + + if (wpClient != null) { + logger.info("Using Workplace Search implementation to index documents"); + documentIndexer = wpClient; + } else { + logger.info("Using Elasticsearch implementation to index documents"); + documentIndexer = esClient; + } + this.loop = loop; logger.debug("creating fs crawler thread [{}] for [{}] every [{}]", fsSettings.getName(), fsSettings.getFs().getUrl(), @@ -160,7 +176,7 @@ public void run() { updateFsJob(fsSettings.getName(), scanDatenew); } catch (Exception e) { - logger.warn("Error while crawling {}: {}", fsSettings.getFs().getUrl(), e.getMessage()); + logger.warn("Error while crawling {}: {}", fsSettings.getFs().getUrl(), e.getMessage() == null ? e.getClass().getName() : e.getMessage()); if (logger.isDebugEnabled()) { logger.warn("Full stacktrace", e); } @@ -488,7 +504,7 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, if (isIndexable(doc.getContent(), fsSettings.getFs().getFilters())) { esIndex(fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), - DocParser.toJson(doc), + doc, fsSettings.getElasticsearch().getPipeline()); } else { logger.debug("We ignore file [{}] because it does not match all the patterns {}", filename, @@ -499,13 +515,15 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, // We index the json content directly esIndex(fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), - read(inputStream), + new Doc(read(inputStream)), fsSettings.getElasticsearch().getPipeline()); } else if (fsSettings.getFs().isXmlSupport()) { // We index the xml content directly + Doc doc = new Doc(); + doc.setContent(XmlDocParser.generate(inputStream)); esIndex(fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), - XmlDocParser.generate(inputStream), + new Doc(XmlDocParser.generate(inputStream)), fsSettings.getElasticsearch().getPipeline()); } } @@ -531,12 +549,11 @@ private String read(InputStream input) throws IOException { * Index a Path object (AKA a folder) in elasticsearch * @param id id of the path * @param path path object - * @throws Exception in case of error */ - private void indexDirectory(String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) throws Exception { + private void indexDirectory(String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) { esIndex(fsSettings.getElasticsearch().getIndexFolder(), id, - PathParser.toJson(path), + new Doc(PathParser.toJson(path)), null); } @@ -579,12 +596,11 @@ private void removeEsDirectoryRecursively(final String path) throws Exception { /** * Add to bulk an IndexRequest in JSon format */ - private void esIndex(String index, String id, String json, String pipeline) { + private void esIndex(String index, String id, Doc doc, String pipeline) { logger.debug("Indexing {}/{}?pipeline={}", index, id, pipeline); - logger.trace("JSon indexed : {}", json); if (!closed) { - esClient.index(index, id, json, pipeline); + documentIndexer.index(index, id, doc, pipeline); } else { logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", index, id); } @@ -596,7 +612,7 @@ private void esIndex(String index, String id, String json, String pipeline) { private void esDelete(String index, String id) { logger.debug("Deleting {}/{}", index, id); if (!closed) { - esClient.delete(index, id); + documentIndexer.delete(index, id); } else { logger.warn("trying to remove a file while closing crawler. Document [{}]/[{}] has been ignored", index, id); } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java index d4bceaaf3..83c3c1871 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java @@ -20,6 +20,7 @@ package fr.pilato.elasticsearch.crawler.fs; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.fs.FileAbstractorFile; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; @@ -28,8 +29,8 @@ public class FsParserLocal extends FsParserAbstract { - public FsParserLocal(FsSettings fsSettings, Path config, ElasticsearchClient esClient, Integer loop) { - super(fsSettings, config, esClient, loop); + public FsParserLocal(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { + super(fsSettings, config, esClient, wpClient, loop); } protected FileAbstractor buildFileAbstractor() { diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java index 5ebf9a4c5..5602456d0 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java @@ -20,6 +20,7 @@ package fr.pilato.elasticsearch.crawler.fs; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.ssh.FileAbstractorSSH; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; @@ -28,8 +29,8 @@ public class FsParserSsh extends FsParserAbstract { - public FsParserSsh(FsSettings fsSettings, Path config, ElasticsearchClient esClient, Integer loop) { - super(fsSettings, config, esClient, loop); + public FsParserSsh(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { + super(fsSettings, config, esClient, wpClient, loop); } protected FileAbstractor buildFileAbstractor() { diff --git a/elasticsearch-client/elasticsearch-client-base/pom.xml b/elasticsearch-client/elasticsearch-client-base/pom.xml index 9fb831a1b..c1f361053 100644 --- a/elasticsearch-client/elasticsearch-client-base/pom.xml +++ b/elasticsearch-client/elasticsearch-client-base/pom.xml @@ -12,4 +12,11 @@ fscrawler-elasticsearch-client-base FSCrawler Elasticsearch Client Base + + + fr.pilato.elasticsearch.crawler + fscrawler-beans + + + diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java index 767c85923..9faddf3b3 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java @@ -20,8 +20,11 @@ package fr.pilato.elasticsearch.crawler.fs.client; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; + import java.io.Closeable; import java.io.IOException; +import java.util.function.Supplier; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.extractMajorVersion; @@ -97,21 +100,21 @@ public interface ElasticsearchClient extends Closeable { String getDefaultTypeName(); /** - * Index a document using a BulkProcessor behind the scenes + * Index a document (might use a BulkProcessor behind the scenes) * @param index Index name * @param id Document ID - * @param json JSON + * @param doc Document to index * @param pipeline Pipeline (can be null) */ - void index(String index, String id, String json, String pipeline); + void index(String index, String id, Doc doc, String pipeline); /** * Index a document (for test purposes only) * @param index Index name * @param id Document ID - * @param json JSON + * @param doc Document to index */ - void indexSingle(String index, String id, String json) throws IOException; + void indexSingle(String index, String id, Doc doc) throws IOException; /** * Delete a document using a BulkProcessor behind the scenes diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClient.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClient.java new file mode 100644 index 000000000..5769fdc70 --- /dev/null +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClient.java @@ -0,0 +1,4 @@ +package fr.pilato.elasticsearch.crawler.fs.client; + +public interface WorkplaceSearchClient extends ElasticsearchClient { +} diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java new file mode 100644 index 000000000..df82dd2a0 --- /dev/null +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java @@ -0,0 +1,151 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.client; + + +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; + +import java.io.IOException; +import java.util.function.Supplier; + +/** + * Workplace Search Client when we don't need at all any Workplace feature. + */ +public class WorkplaceSearchClientNoOp implements WorkplaceSearchClient { + + @Override + public String compatibleVersion() { + return "NoOp"; + } + + @Override + public void start() throws IOException { + } + + @Override + public String getVersion() throws IOException { + return "NoOp"; + } + + /** + * Create an index + * @param index index name + * @param ignoreErrors don't fail if the index already exists + * @param indexSettings index settings if any + * @throws IOException In case of error + */ + public void createIndex(String index, boolean ignoreErrors, String indexSettings) throws IOException { + } + + /** + * Check if an index exists + * @param index index name + * @return true if the index exists, false otherwise + * @throws IOException In case of error + */ + public boolean isExistingIndex(String index) throws IOException { + throw new IOException("NoOp"); + } + + /** + * Check if a pipeline exists + * @param pipelineName pipeline name + * @return true if the pipeline exists, false otherwise + * @throws IOException In case of error + */ + public boolean isExistingPipeline(String pipelineName) throws IOException { + return false; + } + + /** + * Refresh an index + * @param index index name + * @throws IOException In case of error + */ + public void refresh(String index) throws IOException { + throw new IOException("NoOp"); + } + + /** + * Wait for an index to become at least yellow (all primaries assigned) + * @param index index name + * @throws IOException In case of error + */ + public void waitForHealthyIndex(String index) throws IOException { + } + + // Utility methods + + public boolean isIngestSupported() { + return false; + } + + public String getDefaultTypeName() { + return "NoOp"; + } + + @Override + public void index(String index, String id, Doc doc, String pipeline) { + } + + @Override + public void indexSingle(String index, String id, Doc doc) { + } + + @Override + public void delete(String index, String id) { + } + + @Override + public void close() throws IOException { + } + + public void createIndices() throws Exception { + } + + @Override + public ESSearchResponse search(ESSearchRequest request) throws IOException { + return new ESSearchResponse(); + } + + @Override + public void deleteIndex(String index) throws IOException { + throw new IOException("NoOp"); + } + + @Override + public void flush() { + } + + @Override + public void performLowLevelRequest(String method, String endpoint, String jsonEntity) throws IOException { + throw new IOException("NoOp"); + } + + @Override + public ESSearchHit get(String index, String id) throws IOException { + throw new IOException("NoOp"); + } + + @Override + public boolean exists(String index, String id) throws IOException { + throw new IOException("NoOp"); + } +} diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java new file mode 100644 index 000000000..8263d8951 --- /dev/null +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java @@ -0,0 +1,114 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.client; + +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Path; +import java.util.Objects; + +public abstract class WorkplaceSearchClientUtil { + + protected static final Logger logger = LogManager.getLogger(WorkplaceSearchClientUtil.class); + + private WorkplaceSearchClientUtil() { + + } + + /** + * Try to find a client version in the classpath + * @param config Path to FSCrawler configuration files (elasticsearch templates) + * @param settings FSCrawler settings. Can not be null. + * @return A Client instance + */ + public static WorkplaceSearchClient getInstance(Path config, FsSettings settings) { + + Objects.requireNonNull(settings, "settings can not be null"); + + for (int i = 7; i >= 1; i--) { + logger.debug("Trying to find a client version {}", i); + + try { + return getInstance(config, settings, i); + } catch (ClassNotFoundException ignored) { + } + } + + return new WorkplaceSearchClientNoOp(); + } + + /** + * Try to find a client version in the classpath + * @param config Path to FSCrawler configuration files (elasticsearch templates) + * @param settings FSCrawler settings. Can not be null. + * @param version Version to load + * @return A Client instance + */ + public static WorkplaceSearchClient getInstance(Path config, FsSettings settings, int version) throws ClassNotFoundException { + Objects.requireNonNull(settings, "settings can not be null"); + + if (settings.getWorkplaceSearch() == null) { + return new WorkplaceSearchClientNoOp(); + } + + Class clazz = null; + try { + clazz = findClass(version); + } catch (ClassNotFoundException e) { + logger.trace("WorkplaceSearchClient class not found for version {} in the classpath. Skipping...", version); + } + + if (clazz == null) { + throw new ClassNotFoundException("Can not find any WorkplaceSearchClient in the classpath. " + + "Did you forget to add the elasticsearch client library?"); + } + + logger.trace("Found [{}] class as the elasticsearch client implementation.", clazz.getName()); + try { + Constructor constructor = clazz.getConstructor(Path.class, FsSettings.class); + return constructor.newInstance(config, settings); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("Class " + clazz.getName() + " does not have the expected ctor (Path, FsSettings).", e); + } catch (IllegalAccessException|InstantiationException| InvocationTargetException e) { + throw new IllegalArgumentException("Can not create an instance of " + clazz.getName(), e); + } + } + + /** + * Try to load an WorkplaceSearchClient class + * @param version Version number to use. It's only the major part of the version. Like 5 or 6. + * @return The Client class + */ + private static Class findClass(int version) throws ClassNotFoundException { + String className = "fr.pilato.elasticsearch.crawler.fs.client.v" + version + ".WorkplaceSearchClientV" + version; + logger.trace("Trying to find a class named [{}]", className); + Class aClass = Class.forName(className); + boolean isImplementingInterface = WorkplaceSearchClient.class.isAssignableFrom(aClass); + if (!isImplementingInterface) { + throw new IllegalArgumentException("Class " + className + " does not implement " + WorkplaceSearchClient.class.getName() + " interface"); + } + + return (Class) aClass; + } +} diff --git a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java index dee7c80bf..36308171c 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java +++ b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java @@ -19,7 +19,10 @@ package fr.pilato.elasticsearch.crawler.fs.client; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; + import java.io.IOException; +import java.util.function.Supplier; public abstract class ElasticsearchClientDummyBase implements ElasticsearchClient { @@ -74,12 +77,12 @@ public String getDefaultTypeName() { } @Override - public void index(String index, String id, String json, String pipeline) { + public void index(String index, String id, Doc doc, String pipeline) { // Testing purpose only } @Override - public void indexSingle(String index, String id, String json) throws IOException { + public void indexSingle(String index, String id, Doc doc) { // Testing purpose only } diff --git a/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/fscrawler-client.properties b/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/fscrawler-client.properties index 98a002a2c..38a9983a7 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/fscrawler-client.properties +++ b/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/fscrawler-client.properties @@ -1 +1 @@ -es-client.class=fr.pilato.elasticsearch.crawler.fs.client.v0.ElasticsearchClientV0 +es-client.class=fr.pilato.elasticsearch.crawler.fs.client.v0.WorkplaceSearchClientV0 diff --git a/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/v0/fscrawler-client-wrong-version.properties b/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/v0/fscrawler-client-wrong-version.properties index 931d5bbfa..8c2c9c035 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/v0/fscrawler-client-wrong-version.properties +++ b/elasticsearch-client/elasticsearch-client-base/src/test/resources/fr/pilato/elasticsearch/crawler/fs/client/v0/fscrawler-client-wrong-version.properties @@ -1 +1 @@ -es-client.class=fr.pilato.elasticsearch.crawler.fs.client.v1.ElasticsearchClientV1 +es-client.class=fr.pilato.elasticsearch.crawler.fs.client.v1.WorkplaceSearchClientV1 diff --git a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java index f6ec5a25d..3ed578074 100644 --- a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java +++ b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java @@ -20,6 +20,8 @@ package fr.pilato.elasticsearch.crawler.fs.client.v6; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.beans.DocParser; import fr.pilato.elasticsearch.crawler.fs.client.ESBoolQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESDocumentField; import fr.pilato.elasticsearch.crawler.fs.client.ESHighlightField; @@ -92,6 +94,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; +import java.util.function.Supplier; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FILE; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FOLDER_FILE; @@ -370,12 +373,16 @@ public String getDefaultTypeName() { } @Override - public void index(String index, String id, String json, String pipeline) { + public void index(String index, String id, Doc doc, String pipeline) { + String json = DocParser.toJson(doc); + logger.trace("JSon indexed : {}", json); bulkProcessor.add(new IndexRequest(index, getDefaultTypeName(), id).setPipeline(pipeline).source(json, XContentType.JSON)); } @Override - public void indexSingle(String index, String id, String json) throws IOException { + public void indexSingle(String index, String id, Doc doc) throws IOException { + String json = DocParser.toJson(doc); + logger.trace("JSon indexed : {}", json); IndexRequest request = new IndexRequest(index, getDefaultTypeName(), id); request.source(json, XContentType.JSON); client.index(request, RequestOptions.DEFAULT); diff --git a/elasticsearch-client/elasticsearch-client-v7/pom.xml b/elasticsearch-client/elasticsearch-client-v7/pom.xml index 50884713a..61b8a9666 100644 --- a/elasticsearch-client/elasticsearch-client-v7/pom.xml +++ b/elasticsearch-client/elasticsearch-client-v7/pom.xml @@ -32,6 +32,10 @@ elasticsearch-rest-high-level-client ${elasticsearch7.version} + + com.sstory.workplace.search + workplace-search-client + diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java index ed9922c31..77961b7d7 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java @@ -20,6 +20,8 @@ package fr.pilato.elasticsearch.crawler.fs.client.v7; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.beans.DocParser; import fr.pilato.elasticsearch.crawler.fs.client.ESBoolQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESDocumentField; import fr.pilato.elasticsearch.crawler.fs.client.ESHighlightField; @@ -83,6 +85,7 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.nio.file.Path; @@ -92,6 +95,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; +import java.util.function.Supplier; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FILE; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FOLDER_FILE; @@ -350,12 +354,16 @@ public String getDefaultTypeName() { } @Override - public void index(String index, String id, String json, String pipeline) { + public void index(String index, String id, Doc doc, String pipeline) { + String json = DocParser.toJson(doc); + logger.trace("JSon indexed : {}", json); bulkProcessor.add(new IndexRequest(index).id(id).setPipeline(pipeline).source(json, XContentType.JSON)); } @Override - public void indexSingle(String index, String id, String json) throws IOException { + public void indexSingle(String index, String id, Doc doc) throws IOException { + String json = DocParser.toJson(doc); + logger.trace("JSon indexed : {}", json); client.index(new IndexRequest(index).id(id).source(json, XContentType.JSON), RequestOptions.DEFAULT); } diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java new file mode 100644 index 000000000..540ef49ca --- /dev/null +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -0,0 +1,208 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.client.v7; + + +import com.sstory.workplace.search.client.Client; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +/** + * Workplace Search Client for Clusters running v7. + * It also starts an embedded Elasticsearch Client. + */ +public class WorkplaceSearchClientV7 implements WorkplaceSearchClient { + + private static final Logger logger = LogManager.getLogger(WorkplaceSearchClientV7.class); + private final Path config; + private final FsSettings settings; + + private ElasticsearchClient esClient = null; + private Client client = null; + + public WorkplaceSearchClientV7(Path config, FsSettings settings) { + this.config = config; + this.settings = settings; + } + + @Override + public String compatibleVersion() { + return "7"; + } + + @Override + public void start() throws IOException { + client = new Client(settings.getWorkplaceSearch().getAccessToken()); + esClient = ElasticsearchClientUtil.getInstance(config, settings); + esClient.start(); + } + + @Override + public String getVersion() throws IOException { + return esClient.getVersion(); + } + + /** + * Create an index + * @param index index name + * @param ignoreErrors don't fail if the index already exists + * @param indexSettings index settings if any + * @throws IOException In case of error + */ + public void createIndex(String index, boolean ignoreErrors, String indexSettings) throws IOException { + esClient.createIndex(index, ignoreErrors, indexSettings); + } + + /** + * Check if an index exists + * @param index index name + * @return true if the index exists, false otherwise + * @throws IOException In case of error + */ + public boolean isExistingIndex(String index) throws IOException { + return esClient.isExistingIndex(index); + } + + /** + * Check if a pipeline exists + * @param pipelineName pipeline name + * @return true if the pipeline exists, false otherwise + * @throws IOException In case of error + */ + public boolean isExistingPipeline(String pipelineName) throws IOException { + return esClient.isExistingPipeline(pipelineName); + } + + /** + * Refresh an index + * @param index index name + * @throws IOException In case of error + */ + public void refresh(String index) throws IOException { + esClient.refresh(index); + } + + /** + * Wait for an index to become at least yellow (all primaries assigned) + * @param index index name + * @throws IOException In case of error + */ + public void waitForHealthyIndex(String index) throws IOException { + esClient.waitForHealthyIndex(index); + } + + // Utility methods + + public boolean isIngestSupported() { + return true; + } + + public String getDefaultTypeName() { + return esClient.getDefaultTypeName(); + } + + @Override + public void index(String index, String id, Doc doc, String pipeline) { + indexSingle(index, id, doc); + } + + @Override + public void indexSingle(String index, String id, Doc doc) { + Map document = new HashMap<>(); + document.put("body", doc.getContent()); // to content, + document.put("name", doc.getFile().getFilename()); // to file.name, + document.put("mime_type", doc.getFile().getContentType()); // to tikaResult.metadata.mimeType, + document.put("extension", doc.getFile().getExtension()); // to tikaResult.metadata.extension, + document.put("size", doc.getFile().getFilesize()); // to tikaResult.metadata.origSize, + document.put("text_size", doc.getFile().getIndexedChars()); // to tikaResult.metadata.textSize, + document.put("url", "file://" + doc.getPath().getVirtual()); // to file.toURI().toURL().toString().replace("file:", "file://"), + document.put("path", doc.getPath().getReal()); // to file.absolutePath, + document.put("last_modified", doc.getFile().getLastModified()); // to Instant.ofEpochMilli(file.lastModified()).atZone(ZoneId.systemDefault()).format(format), + document.put("created_at", doc.getFile().getCreated()); // to attributes.creationTime().toInstant().atZone(ZoneId.systemDefault()).format(format), + + List> documents = Collections.singletonList(document); + + client.indexDocuments(settings.getWorkplaceSearch().getContentSourceKey(), documents); + } + + @Override + public void delete(String index, String id) { + throw new RuntimeException("Not implemented yet"); + } + + @Override + public void close() throws IOException { + if (esClient != null) { + esClient.close(); + } + } + + public void createIndices() throws Exception { + esClient.createIndices(); + } + + @Override + public ESSearchResponse search(ESSearchRequest request) throws IOException { + throw new RuntimeException("Not implemented yet"); + // return esClient.search(request); + } + + @Override + public void deleteIndex(String index) throws IOException { + esClient.deleteIndex(index); + } + + @Override + public void flush() { + esClient.flush(); + } + + @Override + public void performLowLevelRequest(String method, String endpoint, String jsonEntity) throws IOException { + esClient.performLowLevelRequest(method, endpoint, jsonEntity); + } + + @Override + public ESSearchHit get(String index, String id) throws IOException { + throw new RuntimeException("Not implemented yet"); + } + + @Override + public boolean exists(String index, String id) throws IOException { + throw new RuntimeException("Not implemented yet"); + // return esClient.exists(index, id); + } +} diff --git a/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java b/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java index 77e57d82f..895edec34 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java @@ -21,6 +21,8 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.test.framework.AbstractFSCrawlerTestCase; import org.junit.Test; @@ -40,4 +42,10 @@ public void testGetInstance() { ElasticsearchClient instance = ElasticsearchClientUtil.getInstance(null, FsSettings.builder("foo").build()); assertThat(instance, instanceOf(ElasticsearchClientV7.class)); } + + @Test + public void testGetWorkplaceSearchInstance() { + WorkplaceSearchClient instance = WorkplaceSearchClientUtil.getInstance(null, FsSettings.builder("foo").build()); + assertThat(instance, instanceOf(WorkplaceSearchClientV7.class)); + } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java index 1ae90b2cf..915b860ca 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java @@ -19,6 +19,7 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; @@ -95,8 +96,8 @@ public void testSearch() throws IOException { esClient.createIndex(getCrawlerName(), false, null); esClient.waitForHealthyIndex(getCrawlerName()); - esClient.indexSingle(getCrawlerName(), "1", "{ \"foo\": { \"bar\": \"bar\" } }"); - esClient.indexSingle(getCrawlerName(), "2", "{ \"foo\": { \"bar\": \"baz\" } }"); + esClient.indexSingle(getCrawlerName(), "1", new Doc("{ \"foo\": { \"bar\": \"bar\" } }")); + esClient.indexSingle(getCrawlerName(), "2", new Doc("{ \"foo\": { \"bar\": \"baz\" } }")); esClient.refresh(getCrawlerName()); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java index 45ba2fc24..b79a7f2a3 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java @@ -67,8 +67,8 @@ public void test_mapping() throws Exception { // This will cause an Elasticsearch Exception as the String is not a Date // If the mapping is incorrect - esClient.index(getCrawlerName(), "1", json1, null); - esClient.index(getCrawlerName(), "2", json2, null); + esClient.index(getCrawlerName(), "1", new Doc(json1), null); + esClient.index(getCrawlerName(), "2", new Doc(json2), null); esClient.flush(); } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java index b5ac3fc85..698664d99 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java @@ -19,12 +19,8 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration; -import fr.pilato.elasticsearch.crawler.fs.beans.Attributes; -import fr.pilato.elasticsearch.crawler.fs.beans.Doc; -import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; -import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; @@ -32,23 +28,23 @@ import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import org.junit.Test; -import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.hasKey; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeThat; /** * Test workplace search */ public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { - // TODO We will run it only if Workplace Search is running + private final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "88add3d24c354fd515d3089c4d11eabb174039c08f17df43481d2d478d37d529"); + private final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f21820383e069eb4c00829d"); @Test public void testWorkplaceSearch() throws Exception { + assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + testWorkplaceAccessToken == null || testWorkplaceKey == null); + Fs fs = startCrawlerDefinition().build(); FsSettings fsSettings = FsSettings.builder(getCrawlerName()) .setFs(fs) @@ -56,8 +52,8 @@ public void testWorkplaceSearch() throws Exception { .addNode(NODE_DEFAULT) .setUsername("elastic").setPassword("changeme").build()) .setWorkplaceSearch(WorkplaceSearch.builder() - .setAccessToken("5f15afdb6056c1d98c45bacd") - .setContentSourceKey("9e27917499d055fe3955c1b9e997a53ce3f1d9dcfb650358dcc7fc6e4e5b75d7") + .setAccessToken(testWorkplaceAccessToken) + .setContentSourceKey(testWorkplaceKey) .build()) .build(); diff --git a/pom.xml b/pom.xml index 6aed81f98..f6e907308 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ 7.8.0 6.8.10 ${elasticsearch7.version} + ${elasticsearch7.version}-SNAPSHOT 1.24.1 2.11.1 @@ -503,6 +504,37 @@ 2.7-SNAPSHOT + + com.sstory.workplace.search + workplace-search-sdk + ${workplace.version} + + + ch.qos.logback + logback-core + + + ch.qos.logback + logback-classic + + + + + com.sstory.workplace.search + workplace-search-client + ${workplace.version} + + + ch.qos.logback + logback-core + + + ch.qos.logback + logback-classic + + + + com.fasterxml.jackson.core jackson-core @@ -754,6 +786,16 @@ jersey-hk2 ${jersey.version} + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + + + org.glassfish.jersey.core + jersey-common + ${jersey.version} + jakarta.annotation diff --git a/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/UploadApi.java b/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/UploadApi.java index 60dcfd43a..4f979e6c3 100644 --- a/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/UploadApi.java +++ b/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/UploadApi.java @@ -123,11 +123,11 @@ public UploadResponse post( logger.debug("Simulate mode is on, so we skip sending document [{}] to elasticsearch at [{}].", filename, url); } else { logger.debug("Sending document [{}] to elasticsearch.", filename); - doc = this.getMergedJsonDoc(doc, tags); + final Doc mergedDoc = this.getMergedJsonDoc(doc, tags); esClient.index( index, id, - DocParser.toJson(doc), + mergedDoc, settings.getElasticsearch().getPipeline()); } diff --git a/tika/src/main/java/fr/pilato/elasticsearch/crawler/fs/tika/XmlDocParser.java b/tika/src/main/java/fr/pilato/elasticsearch/crawler/fs/tika/XmlDocParser.java index 4909cb80d..2228371f8 100644 --- a/tika/src/main/java/fr/pilato/elasticsearch/crawler/fs/tika/XmlDocParser.java +++ b/tika/src/main/java/fr/pilato/elasticsearch/crawler/fs/tika/XmlDocParser.java @@ -20,6 +20,7 @@ package fr.pilato.elasticsearch.crawler.fs.tika; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; @@ -52,7 +53,7 @@ public class XmlDocParser { .addDeserializer(Object.class, new FixedUntypedObjectDeserializer())); } - public static String generate(InputStream inputStream) throws IOException { + public static String generate(InputStream inputStream) { logger.trace("Converting XML document [{}]"); // Extracting XML content // See #185: https://github.com/dadoonet/fscrawler/issues/185 @@ -60,10 +61,14 @@ public static String generate(InputStream inputStream) throws IOException { Map map = generateMap(inputStream); // Serialize to JSON - String json = mapper.writeValueAsString(map); - - logger.trace("Generated JSON: {}", json); - return json; + try { + String json = mapper.writeValueAsString(map); + logger.trace("Generated JSON: {}", json); + return json; + } catch (JsonProcessingException e) { + // TODO Fix that code. We should log here and return null. + throw new RuntimeException(e); + } } /** From 7a0692e4c315febb3fb103d71b8a2c3a41435ba4 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 30 Jul 2020 11:59:52 +0200 Subject: [PATCH 07/67] Add tests for all documents --- .../docker-compose.yml | 11 + .../crawler/fs/FsCrawlerImpl.java | 27 +- .../crawler/fs/FsParserAbstract.java | 52 ++-- .../crawler/fs/FsParserLocal.java | 5 +- .../elasticsearch/crawler/fs/FsParserSsh.java | 5 +- .../fs/service/FsCrawlerDocumentService.java | 54 ++++ .../service/FsCrawlerManagementService.java | 54 ++++ .../crawler/fs/service/FsCrawlerService.java | 20 ++ .../wpsearch/fscrawler-custom-source.png | Bin 0 -> 377685 bytes .../wpsearch/fscrawler-display-settings-1.png | Bin 0 -> 432856 bytes .../wpsearch/fscrawler-display-settings-2.png | Bin 0 -> 480800 bytes docs/source/dev/build.rst | 43 +++ .../fs/test/integration/AbstractITCase.java | 3 + ...wlerTestWorkplaceSearchAllDocumentsIT.java | 271 ++++++++++++++++++ .../FsCrawlerTestWorkplaceSearchIT.java | 3 - 15 files changed, 502 insertions(+), 46 deletions(-) create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerService.java create mode 100644 docs/source/_static/wpsearch/fscrawler-custom-source.png create mode 100644 docs/source/_static/wpsearch/fscrawler-display-settings-1.png create mode 100644 docs/source/_static/wpsearch/fscrawler-display-settings-2.png create mode 100644 integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml index 680d31a96..a1013afc2 100644 --- a/contrib/docker-compose-workplacesearch/docker-compose.yml +++ b/contrib/docker-compose-workplacesearch/docker-compose.yml @@ -21,6 +21,17 @@ services: ports: ['9200:9200'] networks: ['stack'] + kibana: + image: docker.elastic.co/kibana/kibana:$ELASTIC_VERSION + environment: + - ELASTICSEARCH_USERNAME=elastic + - ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD + ports: ['5601:5601'] + networks: ['stack'] + links: ['elasticsearch'] + restart: always + depends_on: ['elasticsearch'] + enterprisesearch: image: docker.elastic.co/enterprise-search/enterprise-search:$ELASTIC_VERSION environment: diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java index 122deac80..a5166c88d 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java @@ -22,9 +22,12 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientNoOp; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.Server; @@ -57,6 +60,10 @@ public class FsCrawlerImpl { private final ElasticsearchClient esClient; private final WorkplaceSearchClient wpClient; + + private final FsCrawlerDocumentService documentService; + private final FsCrawlerManagementService managementService; + private FsParser fsParser; public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean rest) { @@ -69,6 +76,15 @@ public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean res this.esClient = ElasticsearchClientUtil.getInstance(config, settings); this.wpClient = WorkplaceSearchClientUtil.getInstance(config, settings); + this.managementService = new FsCrawlerManagementService(this.esClient); + if (wpClient instanceof WorkplaceSearchClientNoOp) { + // The documentService is using the esSearch instance + this.documentService = new FsCrawlerDocumentService(this.esClient); + } else { + // The documentService is using the wpSearch instance + this.documentService = new FsCrawlerDocumentService(this.wpClient); + } + // We don't go further as we have critical errors // It's just a double check as settings must be validated before creating the instance if (FsCrawlerValidator.validateSettings(logger, settings, rest)) { @@ -99,19 +115,19 @@ public void start() throws Exception { return; } - esClient.start(); + managementService.start(); esClient.createIndices(); - wpClient.start(); + documentService.start(); // Start the crawler thread - but not if only in rest mode if (loop != 0) { // What is the protocol used? if (settings.getServer() == null || Server.PROTOCOL.LOCAL.equals(settings.getServer().getProtocol())) { // Local FS - fsParser = new FsParserLocal(settings, config, esClient, wpClient, loop); + fsParser = new FsParserLocal(settings, config, managementService, documentService, loop); } else if (Server.PROTOCOL.SSH.equals(settings.getServer().getProtocol())) { // Remote SSH FS - fsParser = new FsParserSsh(settings, config, esClient, wpClient, loop); + fsParser = new FsParserSsh(settings, config, managementService, documentService, loop); } else { // Non supported protocol throw new RuntimeException(settings.getServer().getProtocol() + " is not supported yet. Please use " + @@ -149,7 +165,8 @@ public void close() throws InterruptedException, IOException { logger.debug("FS crawler thread is now stopped"); } - esClient.close(); + managementService.close(); + documentService.close(); logger.debug("ES Client Manager stopped"); logger.info("FS crawler [{}] stopped", settings.getName()); diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java index 91f866602..d577242ed 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java @@ -30,13 +30,12 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractModel; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; import fr.pilato.elasticsearch.crawler.fs.framework.SignTool; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.tika.TikaDocParser; import fr.pilato.elasticsearch.crawler.fs.tika.XmlDocParser; @@ -58,7 +57,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.function.Function; import java.util.stream.Collectors; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.computeVirtualPathName; @@ -79,29 +77,19 @@ public abstract class FsParserAbstract extends FsParser { final FsSettings fsSettings; private final FsJobFileHandler fsJobFileHandler; - private final ElasticsearchClient documentIndexer; - - private final ElasticsearchClient esClient; - private final WorkplaceSearchClient wpClient; + private final FsCrawlerService managementService; + private final FsCrawlerService documentService; private final Integer loop; private final MessageDigest messageDigest; private final String pathSeparator; private ScanStatistic stats; - FsParserAbstract(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { + FsParserAbstract(FsSettings fsSettings, Path config, FsCrawlerService managementService, FsCrawlerService documentService, Integer loop) { this.fsSettings = fsSettings; this.fsJobFileHandler = new FsJobFileHandler(config); - this.esClient = esClient; - this.wpClient = wpClient; - - if (wpClient != null) { - logger.info("Using Workplace Search implementation to index documents"); - documentIndexer = wpClient; - } else { - logger.info("Using Elasticsearch implementation to index documents"); - documentIndexer = esClient; - } + this.managementService = managementService; + this.documentService = documentService; this.loop = loop; logger.debug("creating fs crawler thread [{}] for [{}] every [{}]", fsSettings.getName(), @@ -341,8 +329,8 @@ private void addFilesRecursively(FileAbstractor path, String filepath, LocalD String virtualFileName = computeVirtualPathName(stats.getRootPath(), new File(filepath, esfile).toString()); if (isIndexable(false, virtualFileName, fsSettings.getFs().getIncludes(), fsSettings.getFs().getExcludes()) && !fsFiles.contains(esfile)) { - logger.trace("Removing file [{}] in elasticsearch", esfile); - esDelete(fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(esfile, filepath)); + logger.trace("Removing file [{}] in elasticsearch/workplace", esfile); + esDelete(documentService, fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(esfile, filepath)); stats.removeFile(); } } @@ -378,7 +366,7 @@ private Collection getFileDirectory(String path) logger.trace("Querying elasticsearch for files in dir [{}:{}]", PATH_ROOT, SignTool.sign(path)); Collection files = new ArrayList<>(); - ESSearchResponse response = esClient.search( + ESSearchResponse response = managementService.getClient().search( new ESSearchRequest() .withIndex(fsSettings.getElasticsearch().getIndex()) .withSize(REQUEST_SIZE) @@ -417,7 +405,7 @@ private Collection getFolderDirectory(String path) throws Exception { return files; } - ESSearchResponse response = esClient.search( + ESSearchResponse response = managementService.getClient().search( new ESSearchRequest() .withIndex(fsSettings.getElasticsearch().getIndexFolder()) .withSize(REQUEST_SIZE) // TODO: WHAT? DID I REALLY WROTE THAT? :p @@ -502,7 +490,7 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, // We index the data structure if (isIndexable(doc.getContent(), fsSettings.getFs().getFilters())) { - esIndex(fsSettings.getElasticsearch().getIndex(), + esIndex(documentService, fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), doc, fsSettings.getElasticsearch().getPipeline()); @@ -513,7 +501,7 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, } else { if (fsSettings.getFs().isJsonSupport()) { // We index the json content directly - esIndex(fsSettings.getElasticsearch().getIndex(), + esIndex(documentService, fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), new Doc(read(inputStream)), fsSettings.getElasticsearch().getPipeline()); @@ -521,7 +509,7 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, // We index the xml content directly Doc doc = new Doc(); doc.setContent(XmlDocParser.generate(inputStream)); - esIndex(fsSettings.getElasticsearch().getIndex(), + esIndex(documentService, fsSettings.getElasticsearch().getIndex(), generateIdFromFilename(filename, dirname), new Doc(XmlDocParser.generate(inputStream)), fsSettings.getElasticsearch().getPipeline()); @@ -551,7 +539,7 @@ private String read(InputStream input) throws IOException { * @param path path object */ private void indexDirectory(String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) { - esIndex(fsSettings.getElasticsearch().getIndexFolder(), + esIndex(managementService, fsSettings.getElasticsearch().getIndexFolder(), id, new Doc(PathParser.toJson(path)), null); @@ -582,7 +570,7 @@ private void removeEsDirectoryRecursively(final String path) throws Exception { Collection listFile = getFileDirectory(path); for (String esfile : listFile) { - esDelete(fsSettings.getElasticsearch().getIndex(), SignTool.sign(path.concat(pathSeparator).concat(esfile))); + esDelete(managementService, fsSettings.getElasticsearch().getIndex(), SignTool.sign(path.concat(pathSeparator).concat(esfile))); } Collection listFolder = getFolderDirectory(path); @@ -590,17 +578,17 @@ private void removeEsDirectoryRecursively(final String path) throws Exception { removeEsDirectoryRecursively(esfolder); } - esDelete(fsSettings.getElasticsearch().getIndexFolder(), SignTool.sign(path)); + esDelete(managementService, fsSettings.getElasticsearch().getIndexFolder(), SignTool.sign(path)); } /** * Add to bulk an IndexRequest in JSon format */ - private void esIndex(String index, String id, Doc doc, String pipeline) { + private void esIndex(FsCrawlerService service, String index, String id, Doc doc, String pipeline) { logger.debug("Indexing {}/{}?pipeline={}", index, id, pipeline); if (!closed) { - documentIndexer.index(index, id, doc, pipeline); + service.getClient().index(index, id, doc, pipeline); } else { logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", index, id); } @@ -609,10 +597,10 @@ private void esIndex(String index, String id, Doc doc, String pipeline) { /** * Add to bulk a DeleteRequest */ - private void esDelete(String index, String id) { + private void esDelete(FsCrawlerService service, String index, String id) { logger.debug("Deleting {}/{}", index, id); if (!closed) { - documentIndexer.delete(index, id); + service.getClient().delete(index, id); } else { logger.warn("trying to remove a file while closing crawler. Document [{}]/[{}] has been ignored", index, id); } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java index 83c3c1871..5dcf19f18 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java @@ -19,17 +19,16 @@ package fr.pilato.elasticsearch.crawler.fs; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.fs.FileAbstractorFile; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import java.nio.file.Path; public class FsParserLocal extends FsParserAbstract { - public FsParserLocal(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { + public FsParserLocal(FsSettings fsSettings, Path config, FsCrawlerService esClient, FsCrawlerService wpClient, Integer loop) { super(fsSettings, config, esClient, wpClient, loop); } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java index 5602456d0..0a9a2b799 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java @@ -19,17 +19,16 @@ package fr.pilato.elasticsearch.crawler.fs; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.ssh.FileAbstractorSSH; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import java.nio.file.Path; public class FsParserSsh extends FsParserAbstract { - public FsParserSsh(FsSettings fsSettings, Path config, ElasticsearchClient esClient, WorkplaceSearchClient wpClient, Integer loop) { + public FsParserSsh(FsSettings fsSettings, Path config, FsCrawlerService esClient, FsCrawlerService wpClient, Integer loop) { super(fsSettings, config, esClient, wpClient, loop); } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java new file mode 100644 index 000000000..f8b8d4493 --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; + +public class FsCrawlerDocumentService implements FsCrawlerService { + + private static final Logger logger = LogManager.getLogger(FsCrawlerDocumentService.class); + + private final ElasticsearchClient client; + + public FsCrawlerDocumentService(ElasticsearchClient client) { + this.client = client; + } + + @Override + public void start() throws IOException { + client.start(); + logger.debug("Document Service started"); + } + + @Override + public ElasticsearchClient getClient() { + return client; + } + + @Override + public void close() throws IOException { + client.close(); + logger.debug("Document Service stopped"); + } +} diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java new file mode 100644 index 000000000..a231aef25 --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; + +public class FsCrawlerManagementService implements FsCrawlerService { + + private static final Logger logger = LogManager.getLogger(FsCrawlerManagementService.class); + + private final ElasticsearchClient client; + + public FsCrawlerManagementService(ElasticsearchClient client) { + this.client = client; + } + + @Override + public void start() throws IOException { + client.start(); + logger.debug("Management Service started"); + } + + @Override + public ElasticsearchClient getClient() { + return client; + } + + @Override + public void close() throws IOException { + client.close(); + logger.debug("Management Service stopped"); + } +} diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerService.java new file mode 100644 index 000000000..4d80c95cd --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerService.java @@ -0,0 +1,20 @@ +package fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; + +import java.io.Closeable; +import java.io.IOException; + +public interface FsCrawlerService extends Closeable { + + /** + * Start the service + */ + void start() throws IOException; + + /** + * Get the elasticsearch client + * @return elasticsearch client + */ + ElasticsearchClient getClient(); +} diff --git a/docs/source/_static/wpsearch/fscrawler-custom-source.png b/docs/source/_static/wpsearch/fscrawler-custom-source.png new file mode 100644 index 0000000000000000000000000000000000000000..13cc70338e2dfa6fde6f2d4e31b10f2f3e4a79a7 GIT binary patch literal 377685 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

h{9|5um1RMbPq42G_1@F*Ffw$$3Z+w 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
{>KT7juAzs~g?9u0`wHWMX(7N>?!*aT`8=r)ZL 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/wpsearch/fscrawler-display-settings-1.png b/docs/source/_static/wpsearch/fscrawler-display-settings-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6b596a3a8d32c9e79e0ab060a47184446144e8 GIT binary patch literal 432856 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 z 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ⅈN-+n#M&BR02_jj9gaVulQ0~&ugc`!$A24q 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œ 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 z

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 J`S%|^{U5XYM>GHc literal 0 HcmV?d00001 diff --git a/docs/source/_static/wpsearch/fscrawler-display-settings-2.png b/docs/source/_static/wpsearch/fscrawler-display-settings-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4c20478cd9a30e6dfaa0dad4609926f45a6644 GIT binary patch literal 480800 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�krLjU;l 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%0D+n00?(+nNK<(4jO3XSYW?422L^AkVU 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%1%#Lhn@0qiQmg>u5^B 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 P;HRZ_SGD}6ZP>p7lhlRz literal 0 HcmV?d00001 diff --git a/docs/source/dev/build.rst b/docs/source/dev/build.rst index 40e10839c..2bb59170f 100644 --- a/docs/source/dev/build.rst +++ b/docs/source/dev/build.rst @@ -110,6 +110,49 @@ You can change this by using ``tests.cluster.pass`` option:: mvn verify -Psecurity -Dtests.cluster.pass=mystrongpassword +Testing Workplace Search connector +"""""""""""""""""""""""""""""""""" + +To test the Workplace Search connector, some manual steps needs to be performed as you need to start +Enterprise Search and create manually the custom source as there is no API yet to do that. + +.. versionadded:: 2.7 + +* Run the following steps:: + + cd contrib/docker-compose-workplacesearch + docker-compose up + +* Wait for it to start and open http://localhost:3002/ws. +* Enter ``enterprise_search`` as the login and ``changeme`` as the password. +* Click on "Add sources" button and choose `Custom API `_. +* Name it ``fscrawler`` and click on "Create Custom API Source" button. +* Copy the "Access Token" value. We will mention it as ``ACCESS_TOKEN`` for the rest of this documentation. +* Copy the "Key" value. We will mention it as ``KEY`` for the rest of this documentation. + +.. image:: /_static/wpsearch/fscrawler-custom-source.png + +* You can now run in another terminal:: + + mvn verify -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 \ + -Dtests.workplace.access_token=ACCESS_TOKEN \ + -Dtests.workplace.key=KEY + +* Then you should be able to see the documents in http://localhost:3002/ws/search + +.. hint:: + + If you want to modify the look, go to the source and choose "Display Settings". + Adapt the settings accordingly. + + .. image:: /_static/wpsearch/fscrawler-display-settings-1.png + + In "Result Detail" tab, add the missing fields. And click on "Save". + + .. image:: /_static/wpsearch/fscrawler-display-settings-2.png + + + Tests options """"""""""""" diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 91c8d3861..4dd024964 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -115,6 +115,9 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); + final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); + final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f228f0d98503e16e8db596c"); + static Elasticsearch elasticsearchWithSecurity; static WebTarget target; static Client client; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java new file mode 100644 index 000000000..c3d3638ac --- /dev/null +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -0,0 +1,271 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.test.integration; + +import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.beans.File; +import fr.pilato.elasticsearch.crawler.fs.beans.Meta; +import fr.pilato.elasticsearch.crawler.fs.client.ESBoolQuery; +import fr.pilato.elasticsearch.crawler.fs.client.ESMatchQuery; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; +import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; +import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; +import org.apache.tika.parser.external.ExternalParser; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; + +import static fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.LOOP_INFINITE; +import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; +import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; + +/** + * Test all type of documents we have with workplace search + */ +public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractITCase { + + private static FsCrawlerImpl crawler = null; + + @BeforeClass + public static void startCrawling() throws Exception { + assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + testWorkplaceAccessToken == null || testWorkplaceKey == null); + + Path testResourceTarget = rootTmpDir.resolve("resources").resolve("documents"); + if (Files.notExists(testResourceTarget)) { + copyResourcesToTestDir(); + } + + Long numFiles = 0L; + + try { + Files.walk(testResourceTarget) + .filter(path -> Files.isRegularFile(path)) + .forEach(path -> staticLogger.debug(" - [{}]", path)); + numFiles = Files.list(testResourceTarget).count(); + } catch (NoSuchFileException e) { + staticLogger.error("directory [{}] should exist before we can start tests.", testResourceTarget); + throw new RuntimeException(testResourceTarget + " doesn't seem to exist. Check your JUnit tests."); + } + + staticLogger.info(" -> Removing existing index [.ent-search-engine-*]"); + esClient.deleteIndex(".ent-search-engine-*"); + + staticLogger.info(" --> starting crawler in [{}] which contains [{}] files", testResourceTarget, numFiles); + + crawler = new FsCrawlerImpl(metadataDir, + FsSettings.builder("fscrawler_workplacesearch_test_all_documents") + .setElasticsearch(generateElasticsearchConfig("fscrawler_workplacesearch_test_all_documents", "fscrawler_workplacesearch_test_all_documents_folder", + 5, TimeValue.timeValueSeconds(1), null)) + .setFs(Fs.builder() + .setUrl(testResourceTarget.toString()) + .setLangDetect(true) + .build()) + .setWorkplaceSearch(WorkplaceSearch.builder() + .setAccessToken(testWorkplaceAccessToken) + .setContentSourceKey(testWorkplaceKey) + .build()) + .build(), LOOP_INFINITE, false); + + crawler.start(); + + // We wait until we have all docs + countTestHelper(new ESSearchRequest().withIndex(".ent-search-engine-*"), numFiles, null, TimeValue.timeValueMinutes(5)); + } + + @AfterClass + public static void stopCrawling() throws Exception { + if (crawler != null) { + staticLogger.info(" --> Stopping crawler"); + crawler.close(); + crawler = null; + } + } + + /** + * Test case for https://github.com/dadoonet/fscrawler/issues/163 + */ + @Test + public void testXmlIssue163() throws IOException { + runSearch("issue-163.xml"); + } + + @Test + public void testJson() throws IOException { + runSearch("test.json", "json"); + } + + @Test + public void testExtractFromDoc() throws IOException { + runSearch("test.doc", "sample"); + } + + @Test + public void testExtractFromDocx() throws IOException { + ESSearchResponse response = runSearch("test.docx", "sample"); + for (ESSearchHit hit : response.getHits()) { + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.FILENAME), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.CONTENT_TYPE), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.URL), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.FILESIZE), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.INDEXING_DATE), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.CREATED), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.LAST_MODIFIED), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.LAST_ACCESSED), notNullValue()); + + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.TITLE), notNullValue()); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.KEYWORDS), notNullValue()); + } + } + + @Test + public void testExtractFromEml() throws IOException { + ESSearchResponse response = runSearch("test.eml", "test"); + for (ESSearchHit hit : response.getHits()) { + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.TITLE), is("Test")); + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.AUTHOR), is("鲨掉 <2428617664@qq.com>")); + } + } + + @Test + public void testExtractFromHtml() throws IOException { + runSearch("test.html", "sample"); + } + + @Test + public void testExtractFromMp3() throws IOException { + runSearch("test.mp3", "tika"); + } + + @Test + public void testExtractFromOdt() throws IOException { + runSearch("test.odt", "sample"); + } + + @Test + public void testExtractFromPdf() throws IOException { + runSearch("test.pdf", "sample"); + } + + @Test + public void testExtractFromRtf() throws IOException { + runSearch("test.rtf", "sample"); + } + + @Test + public void testExtractFromTxt() throws IOException { + runSearch("test.txt", "contains"); + } + + @Test + public void testExtractFromWav() throws IOException { + runSearch("test.wav"); + } + + /** + * Test case for https://github.com/dadoonet/fscrawler/issues/229 + */ + @Test + public void testProtectedDocument229() throws IOException { + runSearch("test-protected.docx"); + } + + /** + * Test case for https://github.com/dadoonet/fscrawler/issues/221 + */ + @Test + public void testProtectedDocument221() throws IOException { + runSearch("issue-221-doc1.pdf", "Formations"); + runSearch("issue-221-doc2.pdf", "FORMATIONS"); + } + + @Test + public void testLanguageDetection() throws IOException { + ESSearchResponse response = runSearch("test-fr.txt", "fichier"); + for (ESSearchHit hit : response.getHits()) { + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("fr")); + } + response = runSearch("test-de.txt", "Datei"); + for (ESSearchHit hit : response.getHits()) { + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("de")); + } + response = runSearch("test.txt", "contains"); + for (ESSearchHit hit : response.getHits()) { + assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("en")); + } + } + + @Test + public void testChineseContent369() throws IOException { + runSearch("issue-369.txt", "今天天气晴好"); + } + + @Test + public void testOcr() throws IOException { + assumeTrue("Tesseract is not installed so we are skipping this test", ExternalParser.check("tesseract")); + runSearch("test-ocr.png", "words"); + runSearch("test-ocr.pdf", "words"); + } + + @Test + public void testShiftJisEncoding() throws IOException { + runSearch("issue-400-shiftjis.txt", "elasticsearch"); + } + + @Test + public void testNonUtf8Filename418() throws IOException { + runSearch("issue-418-中文名称.txt"); + } + + private ESSearchResponse runSearch(String filename) throws IOException { + return runSearch(filename, null); + } + + private ESSearchResponse runSearch(String filename, String content) throws IOException { + logger.info(" -> Testing if file [{}] has been indexed correctly{}.", filename, + content == null ? "" : " and contains [" + content + "]"); + ESBoolQuery query = new ESBoolQuery().addMust(new ESTermQuery("file.filename", filename)); + if (content != null) { + query.addMust(new ESMatchQuery("content", content)); + } + ESSearchResponse response = esClient.search(new ESSearchRequest() + .withIndex(".ent-search-engine-*") + .withESQuery(query)); + assertThat(response.getTotalHits(), is(1L)); + return response; + } +} diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java index 698664d99..c3c10a3ac 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java @@ -37,9 +37,6 @@ */ public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { - private final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "88add3d24c354fd515d3089c4d11eabb174039c08f17df43481d2d478d37d529"); - private final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f21820383e069eb4c00829d"); - @Test public void testWorkplaceSearch() throws Exception { assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", From 73248dcc3f800ec8ff5cf32ac4fce760f0f9258a Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 30 Jul 2020 12:49:19 +0200 Subject: [PATCH 08/67] Add a warning when running tests --- docs/source/dev/build.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/dev/build.rst b/docs/source/dev/build.rst index 2bb59170f..949b89d62 100644 --- a/docs/source/dev/build.rst +++ b/docs/source/dev/build.rst @@ -116,6 +116,10 @@ Testing Workplace Search connector To test the Workplace Search connector, some manual steps needs to be performed as you need to start Enterprise Search and create manually the custom source as there is no API yet to do that. + .. warning:: + + Running the integration tests **will remove everything** you have indexed so far in the workplace local instance. + .. versionadded:: 2.7 * Run the following steps:: From d893310c632b1f8e78cf96f4994fef9e60344ac2 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 31 Jul 2020 18:56:47 +0200 Subject: [PATCH 09/67] Add a Service abstraction layer Make more tests to pass --- .../crawler/fs/cli/FsCrawlerCli.java | 6 +- .../crawler/fs/FsCrawlerImpl.java | 32 ++-- .../crawler/fs/FsParserAbstract.java | 153 ++++++------------ .../crawler/fs/FsParserLocal.java | 8 +- .../elasticsearch/crawler/fs/FsParserSsh.java | 8 +- .../fs/service/FsCrawlerDocumentService.java | 54 +++---- ...awlerDocumentServiceElasticsearchImpl.java | 76 +++++++++ ...lerDocumentServiceWorkplaceSearchImpl.java | 75 +++++++++ .../service/FsCrawlerManagementService.java | 59 ++++--- ...lerManagementServiceElasticsearchImpl.java | 136 ++++++++++++++++ .../fs/client/ElasticsearchClient.java | 10 +- .../fs/client/WorkplaceSearchClientNoOp.java | 38 +++-- .../client/ElasticsearchClientDummyBase.java | 5 + .../fs/client/v6/ElasticsearchClientV6.java | 5 + .../fs/client/v7/ElasticsearchClientV7.java | 20 ++- .../fs/client/v7/WorkplaceSearchClientV7.java | 16 +- .../fs/test/integration/AbstractITCase.java | 2 + .../test/integration/AbstractRestITCase.java | 40 +++-- .../test/integration/FsCrawlerTestRawIT.java | 4 +- .../integration/FsCrawlerTestRestOnlyIT.java | 2 +- rest/pom.xml | 28 +--- .../crawler/fs/rest/RestServer.java | 12 +- .../framework/AbstractFSCrawlerTestCase.java | 21 ++- 23 files changed, 545 insertions(+), 265 deletions(-) create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java create mode 100644 core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java diff --git a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java index e48ea940b..a2ac76f09 100644 --- a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java +++ b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java @@ -254,18 +254,18 @@ public static void main(String[] args) throws Exception { logger.info("Upgrading job [{}]. No rule implemented. Skipping.", jobName); } else { try { - fsCrawler.getEsClient().start(); + fsCrawler.start(); } catch (Exception t) { logger.fatal("We can not start Elasticsearch Client. Exiting.", t); return; } - String elasticsearchVersion = fsCrawler.getEsClient().getVersion(); + String elasticsearchVersion = fsCrawler.getManagementService().getClient().getVersion(); checkForDeprecatedResources(configDir, elasticsearchVersion); fsCrawler.start(); // Start the REST Server if needed if (commands.rest) { - RestServer.start(fsSettings, fsCrawler.getEsClient()); + RestServer.start(fsSettings, fsCrawler.getManagementService(), fsCrawler.getDocumentService()); } // We just have to wait until the process is stopped diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java index a5166c88d..9ecdc79d8 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsCrawlerImpl.java @@ -19,15 +19,13 @@ package fr.pilato.elasticsearch.crawler.fs; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientNoOp; -import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementServiceElasticsearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.Server; @@ -58,9 +56,6 @@ public class FsCrawlerImpl { private Thread fsCrawlerThread; - private final ElasticsearchClient esClient; - private final WorkplaceSearchClient wpClient; - private final FsCrawlerDocumentService documentService; private final FsCrawlerManagementService managementService; @@ -73,16 +68,15 @@ public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean res this.settings = settings; this.loop = loop; this.rest = rest; - this.esClient = ElasticsearchClientUtil.getInstance(config, settings); - this.wpClient = WorkplaceSearchClientUtil.getInstance(config, settings); - this.managementService = new FsCrawlerManagementService(this.esClient); - if (wpClient instanceof WorkplaceSearchClientNoOp) { + this.managementService = new FsCrawlerManagementServiceElasticsearchImpl(config, settings); + + if (settings.getWorkplaceSearch() == null) { // The documentService is using the esSearch instance - this.documentService = new FsCrawlerDocumentService(this.esClient); + this.documentService = new FsCrawlerDocumentServiceElasticsearchImpl(config, settings); } else { // The documentService is using the wpSearch instance - this.documentService = new FsCrawlerDocumentService(this.wpClient); + this.documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(config, settings); } // We don't go further as we have critical errors @@ -100,8 +94,12 @@ public FsCrawlerImpl(Path config, FsSettings settings, Integer loop, boolean res } } - public ElasticsearchClient getEsClient() { - return esClient; + public FsCrawlerDocumentService getDocumentService() { + return documentService; + } + + public FsCrawlerManagementService getManagementService() { + return managementService; } public void start() throws Exception { @@ -116,8 +114,8 @@ public void start() throws Exception { } managementService.start(); - esClient.createIndices(); documentService.start(); + documentService.createSchema(); // Start the crawler thread - but not if only in rest mode if (loop != 0) { diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java index d577242ed..b1c803ef0 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserAbstract.java @@ -26,15 +26,13 @@ import fr.pilato.elasticsearch.crawler.fs.beans.FsJobFileHandler; import fr.pilato.elasticsearch.crawler.fs.beans.PathParser; import fr.pilato.elasticsearch.crawler.fs.beans.ScanStatistic; -import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; -import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; -import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; -import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractModel; import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; import fr.pilato.elasticsearch.crawler.fs.framework.SignTool; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.tika.TikaDocParser; @@ -56,7 +54,6 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.stream.Collectors; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.computeVirtualPathName; @@ -67,25 +64,20 @@ public abstract class FsParserAbstract extends FsParser { private static final Logger logger = LogManager.getLogger(FsParserAbstract.class); - private static final String PATH_ROOT = Doc.FIELD_NAMES.PATH + "." + fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.ROOT; - private static final String FILE_FILENAME = Doc.FIELD_NAMES.FILE + "." + fr.pilato.elasticsearch.crawler.fs.beans.File.FIELD_NAMES.FILENAME; - private static final String FSCRAWLER_IGNORE_FILENAME = ".fscrawlerignore"; - private static final int REQUEST_SIZE = 10000; - final FsSettings fsSettings; private final FsJobFileHandler fsJobFileHandler; - private final FsCrawlerService managementService; - private final FsCrawlerService documentService; + private final FsCrawlerManagementService managementService; + private final FsCrawlerDocumentService documentService; private final Integer loop; private final MessageDigest messageDigest; private final String pathSeparator; private ScanStatistic stats; - FsParserAbstract(FsSettings fsSettings, Path config, FsCrawlerService managementService, FsCrawlerService documentService, Integer loop) { + FsParserAbstract(FsSettings fsSettings, Path config, FsCrawlerManagementService managementService, FsCrawlerDocumentService documentService, Integer loop) { this.fsSettings = fsSettings; this.fsJobFileHandler = new FsJobFileHandler(config); this.managementService = managementService; @@ -173,7 +165,10 @@ public void run() { try { path.close(); } catch (Exception e) { - logger.warn("Error while closing the connection: {}", e, e.getMessage()); + logger.warn("Error while closing the connection: {}", e.getMessage()); + if (logger.isDebugEnabled()) { + logger.warn("Full stacktrace", e); + } } } } @@ -354,71 +349,21 @@ private void addFilesRecursively(FileAbstractor path, String filepath, LocalD } } - // TODO Optimize it. We can probably use a search for a big array of filenames instead of - // Searching fo 10000 files (which is somehow limited). private Collection getFileDirectory(String path) throws Exception { - // If the crawler is being closed, we return if (closed) { - return Collections.emptyList(); - } - - logger.trace("Querying elasticsearch for files in dir [{}:{}]", PATH_ROOT, SignTool.sign(path)); - Collection files = new ArrayList<>(); - ESSearchResponse response = managementService.getClient().search( - new ESSearchRequest() - .withIndex(fsSettings.getElasticsearch().getIndex()) - .withSize(REQUEST_SIZE) - .addField(FILE_FILENAME) - .withESQuery(new ESTermQuery(PATH_ROOT, SignTool.sign(path)))); - - logger.trace("Response [{}]", response.toString()); - if (response.getHits() != null) { - for (ESSearchHit hit : response.getHits()) { - String name; - if (hit.getFields() != null - && hit.getFields().get(FILE_FILENAME) != null) { - // In case someone disabled _source which is not recommended - name = hit.getFields().get(FILE_FILENAME).getValue(); - } else { - // Houston, we have a problem ! We can't get the old files from ES - logger.warn("Can't find stored field name to check existing filenames in path [{}]. " + - "Please set store: true on field [{}]", path, FILE_FILENAME); - throw new RuntimeException("Mapping is incorrect: please set stored: true on field [" + - FILE_FILENAME + "]."); - } - files.add(name); - } + return new ArrayList<>(); } - - logger.trace("We found: {}", files); - - return files; + return managementService.getFileDirectory(path); } private Collection getFolderDirectory(String path) throws Exception { - Collection files = new ArrayList<>(); - // If the crawler is being closed, we return if (closed) { - return files; - } - - ESSearchResponse response = managementService.getClient().search( - new ESSearchRequest() - .withIndex(fsSettings.getElasticsearch().getIndexFolder()) - .withSize(REQUEST_SIZE) // TODO: WHAT? DID I REALLY WROTE THAT? :p - .withESQuery(new ESTermQuery(fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.ROOT, SignTool.sign(path)))); - - if (response.getHits() != null) { - for (ESSearchHit hit : response.getHits()) { - String name = hit.getSourceAsMap().get(fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.REAL).toString(); - files.add(name); - } + return new ArrayList<>(); } - - return files; + return managementService.getFolderDirectory(path); } /** @@ -437,6 +382,7 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, try { // Create the Doc object (only needed when we have add_as_inner_object: true (default) or when we don't index json or xml) + String id = generateIdFromFilename(filename, dirname); if (fsSettings.getFs().isAddAsInnerObject() || (!fsSettings.getFs().isJsonSupport() && !fsSettings.getFs().isXmlSupport())) { String fullFilename = new File(dirname, filename).toString(); @@ -490,10 +436,16 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, // We index the data structure if (isIndexable(doc.getContent(), fsSettings.getFs().getFilters())) { - esIndex(documentService, fsSettings.getElasticsearch().getIndex(), - generateIdFromFilename(filename, dirname), - doc, - fsSettings.getElasticsearch().getPipeline()); + if (!closed) { + documentService.index( + fsSettings.getElasticsearch().getIndex(), + id, + doc, + fsSettings.getElasticsearch().getPipeline()); + } else { + logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", + fsSettings.getElasticsearch().getIndex(), id); + } } else { logger.debug("We ignore file [{}] because it does not match all the patterns {}", filename, fsSettings.getFs().getFilters()); @@ -501,18 +453,28 @@ private void indexFile(FileAbstractModel fileAbstractModel, ScanStatistic stats, } else { if (fsSettings.getFs().isJsonSupport()) { // We index the json content directly - esIndex(documentService, fsSettings.getElasticsearch().getIndex(), - generateIdFromFilename(filename, dirname), - new Doc(read(inputStream)), - fsSettings.getElasticsearch().getPipeline()); + if (!closed) { + documentService.indexRawJson( + fsSettings.getElasticsearch().getIndex(), + id, + read(inputStream), + fsSettings.getElasticsearch().getPipeline()); + } else { + logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", + fsSettings.getElasticsearch().getIndex(), id); + } } else if (fsSettings.getFs().isXmlSupport()) { - // We index the xml content directly - Doc doc = new Doc(); - doc.setContent(XmlDocParser.generate(inputStream)); - esIndex(documentService, fsSettings.getElasticsearch().getIndex(), - generateIdFromFilename(filename, dirname), - new Doc(XmlDocParser.generate(inputStream)), - fsSettings.getElasticsearch().getPipeline()); + // We index the xml content directly (after transformation to json) + if (!closed) { + documentService.indexRawJson( + fsSettings.getElasticsearch().getIndex(), + id, + XmlDocParser.generate(inputStream), + fsSettings.getElasticsearch().getPipeline()); + } else { + logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", + fsSettings.getElasticsearch().getIndex(), id); + } } } } finally { @@ -538,11 +500,13 @@ private String read(InputStream input) throws IOException { * @param id id of the path * @param path path object */ - private void indexDirectory(String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) { - esIndex(managementService, fsSettings.getElasticsearch().getIndexFolder(), - id, - new Doc(PathParser.toJson(path)), - null); + private void indexDirectory(String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) throws IOException { + if (!closed) { + managementService.storeVisitedDirectory(fsSettings.getElasticsearch().getIndexFolder(), id, path); + } else { + logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", + fsSettings.getElasticsearch().getIndexFolder(), id); + } } /** @@ -581,19 +545,6 @@ private void removeEsDirectoryRecursively(final String path) throws Exception { esDelete(managementService, fsSettings.getElasticsearch().getIndexFolder(), SignTool.sign(path)); } - /** - * Add to bulk an IndexRequest in JSon format - */ - private void esIndex(FsCrawlerService service, String index, String id, Doc doc, String pipeline) { - logger.debug("Indexing {}/{}?pipeline={}", index, id, pipeline); - - if (!closed) { - service.getClient().index(index, id, doc, pipeline); - } else { - logger.warn("trying to add new file while closing crawler. Document [{}]/[{}] has been ignored", index, id); - } - } - /** * Add to bulk a DeleteRequest */ diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java index 5dcf19f18..a201e367a 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserLocal.java @@ -21,15 +21,17 @@ import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.fs.FileAbstractorFile; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import java.nio.file.Path; public class FsParserLocal extends FsParserAbstract { - public FsParserLocal(FsSettings fsSettings, Path config, FsCrawlerService esClient, FsCrawlerService wpClient, Integer loop) { - super(fsSettings, config, esClient, wpClient, loop); + public FsParserLocal(FsSettings fsSettings, Path config, FsCrawlerManagementService managementService, + FsCrawlerDocumentService documentService, Integer loop) { + super(fsSettings, config, managementService, documentService, loop); } protected FileAbstractor buildFileAbstractor() { diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java index 0a9a2b799..cc899807c 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/FsParserSsh.java @@ -21,15 +21,17 @@ import fr.pilato.elasticsearch.crawler.fs.crawler.FileAbstractor; import fr.pilato.elasticsearch.crawler.fs.crawler.ssh.FileAbstractorSSH; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import java.nio.file.Path; public class FsParserSsh extends FsParserAbstract { - public FsParserSsh(FsSettings fsSettings, Path config, FsCrawlerService esClient, FsCrawlerService wpClient, Integer loop) { - super(fsSettings, config, esClient, wpClient, loop); + public FsParserSsh(FsSettings fsSettings, Path config, FsCrawlerManagementService managementService, + FsCrawlerDocumentService documentService, Integer loop) { + super(fsSettings, config, managementService, documentService, loop); } protected FileAbstractor buildFileAbstractor() { diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java index f8b8d4493..ada07ffb1 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java @@ -19,36 +19,32 @@ package fr.pilato.elasticsearch.crawler.fs.service; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import java.io.IOException; -public class FsCrawlerDocumentService implements FsCrawlerService { - - private static final Logger logger = LogManager.getLogger(FsCrawlerDocumentService.class); - - private final ElasticsearchClient client; - - public FsCrawlerDocumentService(ElasticsearchClient client) { - this.client = client; - } - - @Override - public void start() throws IOException { - client.start(); - logger.debug("Document Service started"); - } - - @Override - public ElasticsearchClient getClient() { - return client; - } - - @Override - public void close() throws IOException { - client.close(); - logger.debug("Document Service stopped"); - } +public interface FsCrawlerDocumentService extends FsCrawlerService { + /** + * Create a schema for the dataset. This is called when the service starts + * @throws Exception in case of error + */ + void createSchema() throws Exception; + + /** + * Send a document to the target service + * @param index Index name + * @param id Document id + * @param doc Document to index + * @param pipeline Pipeline (can be null) + */ + void index(String index, String id, Doc doc, String pipeline); + + /** + * Send a Raw Json to the target service + * @param index Index name + * @param id Document ID + * @param json Document to index + * @param pipeline Pipeline (can be null) + */ + void indexRawJson(String index, String id, String json, String pipeline); } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java new file mode 100644 index 000000000..418d5d4ee --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.beans.DocParser; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.Path; + +public class FsCrawlerDocumentServiceElasticsearchImpl implements FsCrawlerDocumentService { + + private static final Logger logger = LogManager.getLogger(FsCrawlerDocumentServiceElasticsearchImpl.class); + + private final ElasticsearchClient client; + + public FsCrawlerDocumentServiceElasticsearchImpl(Path config, FsSettings settings) { + this.client = ElasticsearchClientUtil.getInstance(config, settings); + } + + @Override + public void start() throws IOException { + client.start(); + logger.debug("Elasticsearch Document Service started"); + } + + @Override + public ElasticsearchClient getClient() { + return client; + } + + @Override + public void close() throws IOException { + client.close(); + logger.debug("Elasticsearch Service stopped"); + } + + @Override + public void createSchema() throws Exception { + client.createIndices(); + } + + @Override + public void index(String index, String id, Doc doc, String pipeline) { + indexRawJson(index, id, DocParser.toJson(doc), pipeline); + } + + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { + logger.debug("Indexing {}/{}?pipeline={}", index, id, pipeline); + client.indexRawJson(index, id, json, pipeline); + } + +} diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java new file mode 100644 index 000000000..54c74caca --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java @@ -0,0 +1,75 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.Path; + +public class FsCrawlerDocumentServiceWorkplaceSearchImpl implements FsCrawlerDocumentService { + + private static final Logger logger = LogManager.getLogger(FsCrawlerDocumentServiceWorkplaceSearchImpl.class); + + private final WorkplaceSearchClient client; + + public FsCrawlerDocumentServiceWorkplaceSearchImpl(Path config, FsSettings settings) { + this.client = WorkplaceSearchClientUtil.getInstance(config, settings); + } + + @Override + public void start() throws IOException { + client.start(); + logger.debug("Workplace Search Document Service started"); + } + + @Override + public ElasticsearchClient getClient() { + return client; + } + + @Override + public void close() throws IOException { + client.close(); + logger.debug("Workplace Search Document Service stopped"); + } + + @Override + public void createSchema() { + // There is no way yet to create a schema in workplace before hand. + } + + @Override + public void index(String index, String id, Doc doc, String pipeline) { + logger.debug("Indexing {}/{}?pipeline={}", index, id, pipeline); + client.index(index, id, doc, pipeline); + } + + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { + throw new RuntimeException("We can't send Raw Json Documents to Workplace Search"); + } +} diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java index a231aef25..c313f67e8 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java @@ -19,36 +19,35 @@ package fr.pilato.elasticsearch.crawler.fs.service; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import fr.pilato.elasticsearch.crawler.fs.beans.Path; import java.io.IOException; - -public class FsCrawlerManagementService implements FsCrawlerService { - - private static final Logger logger = LogManager.getLogger(FsCrawlerManagementService.class); - - private final ElasticsearchClient client; - - public FsCrawlerManagementService(ElasticsearchClient client) { - this.client = client; - } - - @Override - public void start() throws IOException { - client.start(); - logger.debug("Management Service started"); - } - - @Override - public ElasticsearchClient getClient() { - return client; - } - - @Override - public void close() throws IOException { - client.close(); - logger.debug("Management Service stopped"); - } +import java.util.Collection; + +public interface FsCrawlerManagementService extends FsCrawlerService { + + /** + * Retrieve the list of files that are currently available within a dir + * @param path the virtual path + * @return a list of known files + * @throws Exception In case of problems + */ + Collection getFileDirectory(String path) throws Exception; + + /** + * Retrieve the list of sub folders that are currently available within a dir + * @param path the virtual path + * @return a list of known folders + * @throws Exception In case of problems + */ + Collection getFolderDirectory(String path) throws Exception; + + /** + * Store a visited directory. It will be used to compare old dirs vs + * current directories. So we will be able to remove data if needed. + * @param indexFolder index name to store this information + * @param id id of the directory + * @param path Path to store + */ + void storeVisitedDirectory(String indexFolder, String id, Path path) throws IOException; } diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java new file mode 100644 index 000000000..08483abdc --- /dev/null +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java @@ -0,0 +1,136 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.service; + +import fr.pilato.elasticsearch.crawler.fs.beans.Doc; +import fr.pilato.elasticsearch.crawler.fs.beans.PathParser; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.framework.SignTool; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; + +public class FsCrawlerManagementServiceElasticsearchImpl implements FsCrawlerManagementService { + + private static final Logger logger = LogManager.getLogger(FsCrawlerManagementServiceElasticsearchImpl.class); + private static final String PATH_ROOT = Doc.FIELD_NAMES.PATH + "." + fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.ROOT; + private static final String FILE_FILENAME = Doc.FIELD_NAMES.FILE + "." + fr.pilato.elasticsearch.crawler.fs.beans.File.FIELD_NAMES.FILENAME; + + // TODO Optimize it. We can probably use a search for a big array of filenames instead of + // searching fo 10000 files (which is somehow limited). + private static final int REQUEST_SIZE = 10000; + + private final ElasticsearchClient client; + private final FsSettings settings; + + public FsCrawlerManagementServiceElasticsearchImpl(Path config, FsSettings settings) { + this.settings = settings; + this.client = ElasticsearchClientUtil.getInstance(config, settings); + } + + @Override + public void start() throws IOException { + client.start(); + logger.debug("Management Service started"); + } + + @Override + public ElasticsearchClient getClient() { + return client; + } + + @Override + public void close() throws IOException { + client.close(); + logger.debug("Management Service stopped"); + } + + @Override + public Collection getFileDirectory(String path) + throws Exception { + + logger.trace("Querying elasticsearch for files in dir [{}:{}]", PATH_ROOT, SignTool.sign(path)); + Collection files = new ArrayList<>(); + ESSearchResponse response = client.search( + new ESSearchRequest() + .withIndex(settings.getElasticsearch().getIndex()) + .withSize(REQUEST_SIZE) + .addField(FILE_FILENAME) + .withESQuery(new ESTermQuery(PATH_ROOT, SignTool.sign(path)))); + + logger.trace("Response [{}]", response.toString()); + if (response.getHits() != null) { + for (ESSearchHit hit : response.getHits()) { + String name; + if (hit.getFields() != null + && hit.getFields().get(FILE_FILENAME) != null) { + // In case someone disabled _source which is not recommended + name = hit.getFields().get(FILE_FILENAME).getValue(); + } else { + // Houston, we have a problem ! We can't get the old files from ES + logger.warn("Can't find stored field name to check existing filenames in path [{}]. " + + "Please set store: true on field [{}]", path, FILE_FILENAME); + throw new RuntimeException("Mapping is incorrect: please set stored: true on field [" + + FILE_FILENAME + "]."); + } + files.add(name); + } + } + + logger.trace("We found: {}", files); + + return files; + } + + @Override + public Collection getFolderDirectory(String path) throws Exception { + Collection files = new ArrayList<>(); + + ESSearchResponse response = client.search( + new ESSearchRequest() + .withIndex(settings.getElasticsearch().getIndexFolder()) + .withSize(REQUEST_SIZE) // TODO: WHAT? DID I REALLY WROTE THAT? :p + .withESQuery(new ESTermQuery(fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.ROOT, SignTool.sign(path)))); + + if (response.getHits() != null) { + for (ESSearchHit hit : response.getHits()) { + String name = hit.getSourceAsMap().get(fr.pilato.elasticsearch.crawler.fs.beans.Path.FIELD_NAMES.REAL).toString(); + files.add(name); + } + } + + return files; + } + + @Override + public void storeVisitedDirectory(String indexFolder, String id, fr.pilato.elasticsearch.crawler.fs.beans.Path path) throws IOException { + client.indexRawJson(indexFolder, id, PathParser.toJson(path), null); + } +} diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java index 9faddf3b3..ffc34ff8d 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java @@ -24,7 +24,6 @@ import java.io.Closeable; import java.io.IOException; -import java.util.function.Supplier; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.extractMajorVersion; @@ -108,6 +107,15 @@ public interface ElasticsearchClient extends Closeable { */ void index(String index, String id, Doc doc, String pipeline); + /** + * Index a Raw Json in Elasticsearch + * @param index Index name + * @param id Document ID + * @param json Document to index + * @param pipeline Pipeline (can be null) + */ + void indexRawJson(String index, String id, String json, String pipeline); + /** * Index a document (for test purposes only) * @param index Index name diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java index df82dd2a0..0af22acd1 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java @@ -23,7 +23,6 @@ import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import java.io.IOException; -import java.util.function.Supplier; /** * Workplace Search Client when we don't need at all any Workplace feature. @@ -36,11 +35,11 @@ public String compatibleVersion() { } @Override - public void start() throws IOException { + public void start() { } @Override - public String getVersion() throws IOException { + public String getVersion() { return "NoOp"; } @@ -49,9 +48,9 @@ public String getVersion() throws IOException { * @param index index name * @param ignoreErrors don't fail if the index already exists * @param indexSettings index settings if any - * @throws IOException In case of error */ - public void createIndex(String index, boolean ignoreErrors, String indexSettings) throws IOException { + @Override + public void createIndex(String index, boolean ignoreErrors, String indexSettings) { } /** @@ -60,6 +59,7 @@ public void createIndex(String index, boolean ignoreErrors, String indexSettings * @return true if the index exists, false otherwise * @throws IOException In case of error */ + @Override public boolean isExistingIndex(String index) throws IOException { throw new IOException("NoOp"); } @@ -68,9 +68,9 @@ public boolean isExistingIndex(String index) throws IOException { * Check if a pipeline exists * @param pipelineName pipeline name * @return true if the pipeline exists, false otherwise - * @throws IOException In case of error */ - public boolean isExistingPipeline(String pipelineName) throws IOException { + @Override + public boolean isExistingPipeline(String pipelineName) { return false; } @@ -79,6 +79,7 @@ public boolean isExistingPipeline(String pipelineName) throws IOException { * @param index index name * @throws IOException In case of error */ + @Override public void refresh(String index) throws IOException { throw new IOException("NoOp"); } @@ -86,17 +87,19 @@ public void refresh(String index) throws IOException { /** * Wait for an index to become at least yellow (all primaries assigned) * @param index index name - * @throws IOException In case of error */ - public void waitForHealthyIndex(String index) throws IOException { + @Override + public void waitForHealthyIndex(String index) { } // Utility methods + @Override public boolean isIngestSupported() { return false; } + @Override public String getDefaultTypeName() { return "NoOp"; } @@ -105,6 +108,10 @@ public String getDefaultTypeName() { public void index(String index, String id, Doc doc, String pipeline) { } + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { + } + @Override public void indexSingle(String index, String id, Doc doc) { } @@ -114,20 +121,20 @@ public void delete(String index, String id) { } @Override - public void close() throws IOException { + public void close() { } - public void createIndices() throws Exception { + @Override + public void createIndices() { } @Override - public ESSearchResponse search(ESSearchRequest request) throws IOException { + public ESSearchResponse search(ESSearchRequest request) { return new ESSearchResponse(); } @Override - public void deleteIndex(String index) throws IOException { - throw new IOException("NoOp"); + public void deleteIndex(String index) { } @Override @@ -135,8 +142,7 @@ public void flush() { } @Override - public void performLowLevelRequest(String method, String endpoint, String jsonEntity) throws IOException { - throw new IOException("NoOp"); + public void performLowLevelRequest(String method, String endpoint, String jsonEntity) { } @Override diff --git a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java index 36308171c..b732b2ed4 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java +++ b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java @@ -81,6 +81,11 @@ public void index(String index, String id, Doc doc, String pipeline) { // Testing purpose only } + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { + // Testing purpose only + } + @Override public void indexSingle(String index, String id, Doc doc) { // Testing purpose only diff --git a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java index 3ed578074..c4e7ad67b 100644 --- a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java +++ b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java @@ -375,6 +375,11 @@ public String getDefaultTypeName() { @Override public void index(String index, String id, Doc doc, String pipeline) { String json = DocParser.toJson(doc); + indexRawJson(index, id, json, pipeline); + } + + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { logger.trace("JSon indexed : {}", json); bulkProcessor.add(new IndexRequest(index, getDefaultTypeName(), id).setPipeline(pipeline).source(json, XContentType.JSON)); } diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java index 77961b7d7..edf452efe 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java @@ -85,7 +85,6 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.nio.file.Path; @@ -95,7 +94,6 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; -import java.util.function.Supplier; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FILE; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FOLDER_FILE; @@ -212,6 +210,7 @@ class DebugListener implements BulkProcessor.Listener { * @param indexSettings index settings if any * @throws IOException In case of error */ + @Override public void createIndex(String index, boolean ignoreErrors, String indexSettings) throws IOException { logger.debug("create index [{}]", index); logger.trace("index settings: [{}]", indexSettings); @@ -238,6 +237,7 @@ public void createIndex(String index, boolean ignoreErrors, String indexSettings * @return true if the index exists, false otherwise * @throws IOException In case of error */ + @Override public boolean isExistingIndex(String index) throws IOException { logger.debug("is existing index [{}]", index); return client.indices().exists(new GetIndexRequest(index), RequestOptions.DEFAULT); @@ -249,6 +249,7 @@ public boolean isExistingIndex(String index) throws IOException { * @return true if the pipeline exists, false otherwise * @throws IOException In case of error */ + @Override public boolean isExistingPipeline(String pipelineName) throws IOException { logger.debug("is existing pipeline [{}]", pipelineName); try { @@ -266,6 +267,7 @@ public boolean isExistingPipeline(String pipelineName) throws IOException { * @param index index name * @throws IOException In case of error */ + @Override public void refresh(String index) throws IOException { logger.debug("refresh index [{}]", index); RefreshRequest request = new RefreshRequest(); @@ -281,6 +283,7 @@ public void refresh(String index) throws IOException { * @param index index name * @throws IOException In case of error */ + @Override public void waitForHealthyIndex(String index) throws IOException { logger.debug("wait for yellow health on index [{}]", index); ClusterHealthResponse health = client.cluster().health(new ClusterHealthRequest(index).waitForYellowStatus(), @@ -345,10 +348,12 @@ public void deleteByQuery(String index, String type) throws IOException { // Utility methods + @Override public boolean isIngestSupported() { return true; } + @Override public String getDefaultTypeName() { return INDEX_TYPE_DOC; } @@ -356,15 +361,19 @@ public String getDefaultTypeName() { @Override public void index(String index, String id, Doc doc, String pipeline) { String json = DocParser.toJson(doc); + indexRawJson(index, id, json, pipeline); + } + + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { logger.trace("JSon indexed : {}", json); bulkProcessor.add(new IndexRequest(index).id(id).setPipeline(pipeline).source(json, XContentType.JSON)); } @Override public void indexSingle(String index, String id, Doc doc) throws IOException { - String json = DocParser.toJson(doc); - logger.trace("JSon indexed : {}", json); - client.index(new IndexRequest(index).id(id).source(json, XContentType.JSON), RequestOptions.DEFAULT); + logger.trace("JSon indexed : {}", doc.getContent()); + client.index(new IndexRequest(index).id(id).source(doc.getContent(), XContentType.JSON), RequestOptions.DEFAULT); } @Override @@ -408,6 +417,7 @@ private static RestClientBuilder buildRestClient(Elasticsearch settings) { return builder; } + @Override public void createIndices() throws Exception { String elasticsearchVersion; Path jobMappingDir = config.resolve(settings.getName()).resolve("_mappings"); diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 540ef49ca..613abc38a 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -136,11 +136,6 @@ public String getDefaultTypeName() { @Override public void index(String index, String id, Doc doc, String pipeline) { - indexSingle(index, id, doc); - } - - @Override - public void indexSingle(String index, String id, Doc doc) { Map document = new HashMap<>(); document.put("body", doc.getContent()); // to content, document.put("name", doc.getFile().getFilename()); // to file.name, @@ -158,6 +153,16 @@ public void indexSingle(String index, String id, Doc doc) { client.indexDocuments(settings.getWorkplaceSearch().getContentSourceKey(), documents); } + @Override + public void indexRawJson(String index, String id, String json, String pipeline) { + throw new RuntimeException("Not supported by the workplace search client. Should not be called."); + } + + @Override + public void indexSingle(String index, String id, Doc doc) { + throw new RuntimeException("Not supported by the workplace search client. Should not be called."); + } + @Override public void delete(String index, String id) { throw new RuntimeException("Not implemented yet"); @@ -176,6 +181,7 @@ public void createIndices() throws Exception { @Override public ESSearchResponse search(ESSearchRequest request) throws IOException { + throw new RuntimeException("Not implemented yet"); // return esClient.search(request); } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 4dd024964..7e159b328 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -379,6 +379,8 @@ public static ESSearchResponse countTestHelper(final ESSearchRequest request, fi // Let's search for entries try { + // Make sure we refresh indexed docs before counting + refresh(); response[0] = esClient.search(request); } catch (RuntimeException|IOException e) { staticLogger.warn("error caught", e); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java index 14356b669..a026154e8 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java @@ -19,9 +19,12 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.rest.RestServer; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementServiceElasticsearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.Rest; @@ -32,7 +35,8 @@ public abstract class AbstractRestITCase extends AbstractITCase { - private ElasticsearchClient esTmpClient; + private FsCrawlerManagementService managementService; + private FsCrawlerDocumentService documentService; @Before public void startRestServer() throws Exception { @@ -42,12 +46,24 @@ public void startRestServer() throws Exception { .build(); fsSettings.getElasticsearch().setIndex(getCrawlerName()); FsCrawlerValidator.validateSettings(logger, fsSettings, true); - esTmpClient = ElasticsearchClientUtil.getInstance(metadataDir, fsSettings); - esTmpClient.start(); - RestServer.start(fsSettings, esTmpClient); + + this.managementService = new FsCrawlerManagementServiceElasticsearchImpl(metadataDir, fsSettings); + + if (fsSettings.getWorkplaceSearch() == null) { + // The documentService is using the esSearch instance + this.documentService = new FsCrawlerDocumentServiceElasticsearchImpl(metadataDir, fsSettings); + } else { + // The documentService is using the wpSearch instance + this.documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + } + + managementService.start(); + documentService.start(); + + RestServer.start(fsSettings, managementService, documentService); logger.info(" -> Removing existing index [{}]", getCrawlerName() + "*"); - esTmpClient.deleteIndex(getCrawlerName() + "*"); + managementService.getClient().deleteIndex(getCrawlerName() + "*"); logger.info(" -> Creating index [{}]", fsSettings.getElasticsearch().getIndex()); } @@ -55,9 +71,13 @@ public void startRestServer() throws Exception { @After public void stopRestServer() throws IOException { RestServer.close(); - if (esTmpClient != null) { - esTmpClient.close(); - esTmpClient = null; + if (managementService != null) { + managementService.close(); + managementService = null; + } + if (documentService != null) { + documentService.close(); + documentService = null; } } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java index b79a7f2a3..e6c3873ac 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java @@ -67,8 +67,8 @@ public void test_mapping() throws Exception { // This will cause an Elasticsearch Exception as the String is not a Date // If the mapping is incorrect - esClient.index(getCrawlerName(), "1", new Doc(json1), null); - esClient.index(getCrawlerName(), "2", new Doc(json2), null); + esClient.indexRawJson(getCrawlerName(), "1", json1, null); + esClient.indexRawJson(getCrawlerName(), "2", json2, null); esClient.flush(); } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java index 331100f89..6cf22edf9 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java @@ -61,7 +61,7 @@ public void test_with_rest_only() throws Exception { 0, true); crawler.start(); - RestServer.start(fsSettings, crawler.getEsClient()); + RestServer.start(fsSettings, crawler.getManagementService(), crawler.getDocumentService()); Path from = rootTmpDir.resolve("resources").resolve("documents"); if (Files.notExists(from)) { diff --git a/rest/pom.xml b/rest/pom.xml index cb833ddd6..117298e43 100644 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -46,34 +46,10 @@ - + fr.pilato.elasticsearch.crawler - fscrawler-framework - - - - - fr.pilato.elasticsearch.crawler - fscrawler-settings - - - - - fr.pilato.elasticsearch.crawler - fscrawler-beans - - - - - fr.pilato.elasticsearch.crawler - fscrawler-tika - - - - - fr.pilato.elasticsearch.crawler - fscrawler-elasticsearch-client-base + fscrawler-core diff --git a/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/RestServer.java b/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/RestServer.java index 926ebea74..8db5047f8 100644 --- a/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/RestServer.java +++ b/rest/src/main/java/fr/pilato/elasticsearch/crawler/fs/rest/RestServer.java @@ -19,7 +19,8 @@ package fr.pilato.elasticsearch.crawler.fs.rest; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,17 +40,18 @@ public class RestServer { /** * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application. * @param settings FSCrawler settings - * @param esClient Elasticsearch client + * @param managementService The management service + * @param documentService The document service */ - public static void start(FsSettings settings, ElasticsearchClient esClient) { + public static void start(FsSettings settings, FsCrawlerManagementService managementService, FsCrawlerDocumentService documentService) { // We create the service only one if (httpServer == null) { // create a resource config that scans for JAX-RS resources and providers // in fr.pilato.elasticsearch.crawler.fs.rest package final ResourceConfig rc = new ResourceConfig() .registerInstances( - new ServerStatusApi(esClient, settings), - new UploadApi(settings, esClient)) + new ServerStatusApi(managementService.getClient(), settings), + new UploadApi(settings, documentService.getClient())) .register(MultiPartFeature.class) .register(RestJsonProvider.class) .register(JacksonFeature.class) diff --git a/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerTestCase.java b/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerTestCase.java index ed26b7756..7654c560e 100644 --- a/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerTestCase.java +++ b/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerTestCase.java @@ -146,14 +146,19 @@ public static long awaitBusy(LongSupplier breakSupplier, Long expected, long max long sum = 0; while (sum + timeInMillis < maxTimeInMillis) { - long current = breakSupplier.getAsLong(); - if (current < 0) { - return current; - } - if (expected == null && current >= 1) { - return current; - } else if (expected != null && current == expected) { - return expected; + try { + long current = breakSupplier.getAsLong(); + if (current < 0) { + return current; + } + if (expected == null && current >= 1) { + return current; + } else if (expected != null && current == expected) { + return expected; + } + } catch (RuntimeException ignored) { + // If we have a Runtime error, it might indicates that shards are no all ready + // Let's wait for the next cycle and fail only when we have the timeout. } Thread.sleep(timeInMillis); sum += timeInMillis; From 4d5e8e924ab7c90f05899ecc35ff856f000693c5 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 31 Jul 2020 19:07:03 +0200 Subject: [PATCH 10/67] Remove non needed NoOp implemntation --- ...lerDocumentServiceWorkplaceSearchImpl.java | 5 + .../fs/client/WorkplaceSearchClientNoOp.java | 157 ------------------ .../fs/client/WorkplaceSearchClientUtil.java | 4 +- .../fs/client/v7/WorkplaceSearchClientV7.java | 2 - 4 files changed, 7 insertions(+), 161 deletions(-) delete mode 100644 elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java index 54c74caca..ac9198f6b 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java @@ -38,6 +38,11 @@ public class FsCrawlerDocumentServiceWorkplaceSearchImpl implements FsCrawlerDoc public FsCrawlerDocumentServiceWorkplaceSearchImpl(Path config, FsSettings settings) { this.client = WorkplaceSearchClientUtil.getInstance(config, settings); + + if (client == null) { + throw new RuntimeException("As we can not find an existing Workplace Search client for elastic stack before 7.8," + + " you can't define workplace settings in your configuration. FSCrawler will refuse to start."); + } } @Override diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java deleted file mode 100644 index 0af22acd1..000000000 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientNoOp.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Licensed to David Pilato (the "Author") under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.client; - - -import fr.pilato.elasticsearch.crawler.fs.beans.Doc; - -import java.io.IOException; - -/** - * Workplace Search Client when we don't need at all any Workplace feature. - */ -public class WorkplaceSearchClientNoOp implements WorkplaceSearchClient { - - @Override - public String compatibleVersion() { - return "NoOp"; - } - - @Override - public void start() { - } - - @Override - public String getVersion() { - return "NoOp"; - } - - /** - * Create an index - * @param index index name - * @param ignoreErrors don't fail if the index already exists - * @param indexSettings index settings if any - */ - @Override - public void createIndex(String index, boolean ignoreErrors, String indexSettings) { - } - - /** - * Check if an index exists - * @param index index name - * @return true if the index exists, false otherwise - * @throws IOException In case of error - */ - @Override - public boolean isExistingIndex(String index) throws IOException { - throw new IOException("NoOp"); - } - - /** - * Check if a pipeline exists - * @param pipelineName pipeline name - * @return true if the pipeline exists, false otherwise - */ - @Override - public boolean isExistingPipeline(String pipelineName) { - return false; - } - - /** - * Refresh an index - * @param index index name - * @throws IOException In case of error - */ - @Override - public void refresh(String index) throws IOException { - throw new IOException("NoOp"); - } - - /** - * Wait for an index to become at least yellow (all primaries assigned) - * @param index index name - */ - @Override - public void waitForHealthyIndex(String index) { - } - - // Utility methods - - @Override - public boolean isIngestSupported() { - return false; - } - - @Override - public String getDefaultTypeName() { - return "NoOp"; - } - - @Override - public void index(String index, String id, Doc doc, String pipeline) { - } - - @Override - public void indexRawJson(String index, String id, String json, String pipeline) { - } - - @Override - public void indexSingle(String index, String id, Doc doc) { - } - - @Override - public void delete(String index, String id) { - } - - @Override - public void close() { - } - - @Override - public void createIndices() { - } - - @Override - public ESSearchResponse search(ESSearchRequest request) { - return new ESSearchResponse(); - } - - @Override - public void deleteIndex(String index) { - } - - @Override - public void flush() { - } - - @Override - public void performLowLevelRequest(String method, String endpoint, String jsonEntity) { - } - - @Override - public ESSearchHit get(String index, String id) throws IOException { - throw new IOException("NoOp"); - } - - @Override - public boolean exists(String index, String id) throws IOException { - throw new IOException("NoOp"); - } -} diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java index 8263d8951..93908712d 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/WorkplaceSearchClientUtil.java @@ -55,7 +55,7 @@ public static WorkplaceSearchClient getInstance(Path config, FsSettings settings } } - return new WorkplaceSearchClientNoOp(); + return null; } /** @@ -69,7 +69,7 @@ public static WorkplaceSearchClient getInstance(Path config, FsSettings settings Objects.requireNonNull(settings, "settings can not be null"); if (settings.getWorkplaceSearch() == null) { - return new WorkplaceSearchClientNoOp(); + return null; } Class clazz = null; diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 613abc38a..16ed42468 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -38,7 +38,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Supplier; /** * Workplace Search Client for Clusters running v7. @@ -181,7 +180,6 @@ public void createIndices() throws Exception { @Override public ESSearchResponse search(ESSearchRequest request) throws IOException { - throw new RuntimeException("Not implemented yet"); // return esClient.search(request); } From 136b71a3d749ead69bf07274651763787903810c Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 3 Aug 2020 10:13:31 +0200 Subject: [PATCH 11/67] Add the delete method --- .../crawler/fs/client/v7/WorkplaceSearchClientV7.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 16ed42468..00b5032ad 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -159,12 +159,12 @@ public void indexRawJson(String index, String id, String json, String pipeline) @Override public void indexSingle(String index, String id, Doc doc) { - throw new RuntimeException("Not supported by the workplace search client. Should not be called."); + index(index, id, doc, null); } @Override public void delete(String index, String id) { - throw new RuntimeException("Not implemented yet"); + client.destroyDocuments(settings.getWorkplaceSearch().getContentSourceKey(), Collections.singletonList(id)); } @Override @@ -180,6 +180,11 @@ public void createIndices() throws Exception { @Override public ESSearchResponse search(ESSearchRequest request) throws IOException { + // For now we are going to run a dummy search in elasticsearch directly + // and ignore the request in most times + request.withIndex(".ent-search-engine-*"); + esClient.search(request); + throw new RuntimeException("Not implemented yet"); // return esClient.search(request); } From bca1ff7d56f238bce8d12b242b1be5bde883f0aa Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 3 Aug 2020 11:00:17 +0200 Subject: [PATCH 12/67] Split tests for elasticsearch and workplace search --- .../fs/client/v7/WorkplaceSearchClientV7.java | 5 +--- .../integration/AbstractFsCrawlerITCase.java | 17 +++++------ .../fs/test/integration/AbstractITCase.java | 28 +++++++++---------- .../ElasticsearchClientIT.java | 3 +- .../FsCrawlerImplAllDocumentsIT.java | 3 +- .../{ => elasticsearch}/FsCrawlerRestIT.java | 3 +- .../FsCrawlerTestAttributesIT.java | 3 +- .../FsCrawlerTestChecksumIT.java | 3 +- .../FsCrawlerTestDatesIT.java | 3 +- .../FsCrawlerTestDefaultsIT.java | 3 +- .../FsCrawlerTestFilenameAsIdIT.java | 3 +- .../FsCrawlerTestFilesizeIT.java | 3 +- .../FsCrawlerTestFiltersIT.java | 3 +- .../FsCrawlerTestFollowSymlinksIT.java | 3 +- .../FsCrawlerTestIgnoreFoldersIT.java | 3 +- .../FsCrawlerTestIncludesIT.java | 3 +- .../FsCrawlerTestIndexContentIT.java | 3 +- .../FsCrawlerTestIngestPipelineIT.java | 3 +- .../FsCrawlerTestJsonSupportIT.java | 3 +- .../FsCrawlerTestLoopsIT.java | 3 +- .../FsCrawlerTestMultipleCrawlersIT.java | 3 +- .../FsCrawlerTestRawIT.java | 3 +- .../FsCrawlerTestRemoveDeletedIT.java | 3 +- .../FsCrawlerTestRestOnlyIT.java | 5 ++-- .../FsCrawlerTestSettingsIT.java | 3 +- .../FsCrawlerTestSshIT.java | 3 +- .../FsCrawlerTestStoreSourceIT.java | 3 +- .../FsCrawlerTestSubDirsIT.java | 3 +- .../FsCrawlerTestUnparsableIT.java | 3 +- .../FsCrawlerTestXmlSupportIT.java | 3 +- .../FsCrawlerTestZipFilesIT.java | 3 +- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 3 +- .../FsCrawlerTestWorkplaceSearchIT.java | 3 +- .../AbstractFSCrawlerMetadataTestCase.java | 2 +- 34 files changed, 86 insertions(+), 58 deletions(-) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/ElasticsearchClientIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerImplAllDocumentsIT.java (98%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerRestIT.java (98%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestAttributesIT.java (95%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestChecksumIT.java (95%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestDatesIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestDefaultsIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestFilenameAsIdIT.java (95%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestFilesizeIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestFiltersIT.java (93%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestFollowSymlinksIT.java (93%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestIgnoreFoldersIT.java (93%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestIncludesIT.java (94%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestIndexContentIT.java (92%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestIngestPipelineIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestJsonSupportIT.java (97%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestLoopsIT.java (94%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestMultipleCrawlersIT.java (92%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestRawIT.java (96%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestRemoveDeletedIT.java (98%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestRestOnlyIT.java (94%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestSettingsIT.java (93%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestSshIT.java (94%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestStoreSourceIT.java (95%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestSubDirsIT.java (98%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestUnparsableIT.java (94%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestXmlSupportIT.java (93%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => elasticsearch}/FsCrawlerTestZipFilesIT.java (91%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => workplacesearch}/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java (98%) rename integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/{ => workplacesearch}/FsCrawlerTestWorkplaceSearchIT.java (94%) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 00b5032ad..9277bc41b 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -183,10 +183,7 @@ public ESSearchResponse search(ESSearchRequest request) throws IOException { // For now we are going to run a dummy search in elasticsearch directly // and ignore the request in most times request.withIndex(".ent-search-engine-*"); - esClient.search(request); - - throw new RuntimeException("Not implemented yet"); - // return esClient.search(request); + return esClient.search(request); } @Override diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java index 7005934b4..0bb9405f9 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java @@ -52,15 +52,15 @@ public void shutdownCrawler() throws InterruptedException, IOException { stopCrawler(); } - Fs.Builder startCrawlerDefinition() { + protected Fs.Builder startCrawlerDefinition() { return startCrawlerDefinition(currentTestResourceDir.toString(), TimeValue.timeValueSeconds(5)); } - Fs.Builder startCrawlerDefinition(TimeValue updateRate) { + protected Fs.Builder startCrawlerDefinition(TimeValue updateRate) { return startCrawlerDefinition(currentTestResourceDir.toString(), updateRate); } - Fs.Builder startCrawlerDefinition(String dir) { + protected Fs.Builder startCrawlerDefinition(String dir) { return startCrawlerDefinition(dir, TimeValue.timeValueSeconds(5)); } @@ -72,7 +72,7 @@ private Fs.Builder startCrawlerDefinition(String dir, TimeValue updateRate) { .setUpdateRate(updateRate); } - Elasticsearch endCrawlerDefinition(String indexName) { + protected Elasticsearch endCrawlerDefinition(String indexName) { return endCrawlerDefinition(indexName, indexName + INDEX_SUFFIX_FOLDER); } @@ -80,7 +80,7 @@ private Elasticsearch endCrawlerDefinition(String indexDocName, String indexFold return generateElasticsearchConfig(indexDocName, indexFolderName, 1, null, null); } - void startCrawler() throws Exception { + protected void startCrawler() throws Exception { startCrawler(getCrawlerName()); } @@ -88,17 +88,18 @@ private void startCrawler(final String jobName) throws Exception { startCrawler(jobName, startCrawlerDefinition().build(), endCrawlerDefinition(jobName), null); } - FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsearch, Server server) throws Exception { + protected FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsearch, Server server) throws Exception { return startCrawler(jobName, fs, elasticsearch, server, null, TimeValue.timeValueSeconds(10)); } - FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsearch, Server server, Rest rest, TimeValue duration) + protected FsCrawlerImpl startCrawler(final String jobName, Fs fs, Elasticsearch elasticsearch, Server server, Rest rest, + TimeValue duration) throws Exception { startCrawler(jobName, FsSettings.builder(jobName).setElasticsearch(elasticsearch).setFs(fs).setServer(server).setRest(rest).build(), duration); return crawler; } - FsCrawlerImpl startCrawler(final String jobName, FsSettings fsSettings, TimeValue duration) + protected FsCrawlerImpl startCrawler(final String jobName, FsSettings fsSettings, TimeValue duration) throws Exception { logger.info(" --> starting crawler [{}]", jobName); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 7e159b328..fbebb1388 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -97,10 +97,10 @@ @ThreadLeakLingering(linger = 5000) // 5 sec lingering public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { - static Path metadataDir = null; + protected static Path metadataDir = null; - FsCrawlerImpl crawler = null; - Path currentTestResourceDir; + protected FsCrawlerImpl crawler = null; + protected Path currentTestResourceDir; private static final Path DEFAULT_RESOURCES = Paths.get(getUrl("samples", "common")); private final static String DEFAULT_TEST_CLUSTER_URL = "http://127.0.0.1:9200"; @@ -108,19 +108,19 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private final static String DEFAULT_PASSWORD = "changeme"; private final static Integer DEFAULT_TEST_REST_PORT = 8080; - static ElasticsearchClient esClient; + protected static ElasticsearchClient esClient; private static String testClusterUrl; private final static String testClusterUser = System.getProperty("tests.cluster.user", DEFAULT_USERNAME); private final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); - final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); + protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); - final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); - final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f228f0d98503e16e8db596c"); + protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); + protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f228f0d98503e16e8db596c"); static Elasticsearch elasticsearchWithSecurity; - static WebTarget target; - static Client client; + protected static WebTarget target; + protected static Client client; /** * We suppose that each test has its own set of files. Even if we duplicate them, that will make the code @@ -314,8 +314,8 @@ public static void stopElasticsearchClient() throws IOException { private static final String testCrawlerPrefix = "fscrawler_"; - static Elasticsearch generateElasticsearchConfig(String indexName, String indexFolderName, int bulkSize, - TimeValue timeValue, ByteSizeValue byteSize) { + protected static Elasticsearch generateElasticsearchConfig(String indexName, String indexFolderName, int bulkSize, + TimeValue timeValue, ByteSizeValue byteSize) { Elasticsearch.Builder builder = Elasticsearch.builder() .addNode(new ServerUrl(testClusterUrl)) .setBulkSize(bulkSize); @@ -340,7 +340,7 @@ static Elasticsearch generateElasticsearchConfig(String indexName, String indexF return builder.build(); } - static void refresh() throws IOException { + protected static void refresh() throws IOException { esClient.refresh(null); } @@ -413,7 +413,7 @@ public static ESSearchResponse countTestHelper(final ESSearchRequest request, fi return response[0]; } - static void logContentOfDir(Path path, Level level) { + protected static void logContentOfDir(Path path, Level level) { if (path != null) { try (Stream stream = Files.walk(path)) { stream.forEach(file -> { @@ -447,7 +447,7 @@ public static String getUrl(String... subdirs) { return dir.getAbsoluteFile().getAbsolutePath(); } - String getCrawlerName() { + protected String getCrawlerName() { String testName = testCrawlerPrefix.concat(getCurrentClassName()).concat("_").concat(getCurrentTestName()); return testName.contains(" ") ? split(testName, " ")[0] : testName; } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java index 915b860ca..ca60728ff 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/ElasticsearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java @@ -17,12 +17,13 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import org.junit.Before; import org.junit.Test; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerImplAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java similarity index 98% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerImplAllDocumentsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java index 2aad7f712..cd59a40bd 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerImplAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; @@ -32,6 +32,7 @@ import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerRestIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java similarity index 98% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerRestIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java index c246e5d11..bbc15881a 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerRestIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; @@ -27,6 +27,7 @@ import fr.pilato.elasticsearch.crawler.fs.framework.Version; import fr.pilato.elasticsearch.crawler.fs.rest.ServerStatusResponse; import fr.pilato.elasticsearch.crawler.fs.rest.UploadResponse; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractRestITCase; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; import org.junit.Before; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestAttributesIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestAttributesIT.java similarity index 95% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestAttributesIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestAttributesIT.java index 8c50f4862..b3f4556fb 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestAttributesIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestAttributesIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Attributes; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; @@ -26,6 +26,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestChecksumIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestChecksumIT.java similarity index 95% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestChecksumIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestChecksumIT.java index 1e9a7a410..a66f240c1 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestChecksumIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestChecksumIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.beans.File; @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.security.MessageDigest; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDatesIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDatesIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDatesIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDatesIT.java index 456a5ac5a..4952728da 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDatesIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDatesIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.beans.File; @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.framework.OsValidator; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.nio.file.Files; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDefaultsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDefaultsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java index c5a1ae21a..c4bd7df39 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestDefaultsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.beans.File; @@ -27,6 +27,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilenameAsIdIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java similarity index 95% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilenameAsIdIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java index 483c7d8cb..ca19d50a5 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilenameAsIdIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.io.IOException; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilesizeIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilesizeIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilesizeIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilesizeIT.java index c40b4976b..b17b66cfc 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFilesizeIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilesizeIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.beans.File; @@ -27,6 +27,7 @@ import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; import fr.pilato.elasticsearch.crawler.fs.framework.Percentage; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.nio.file.Files; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFiltersIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFiltersIT.java similarity index 93% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFiltersIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFiltersIT.java index d5f41ecc6..d86fb262f 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFiltersIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFiltersIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFollowSymlinksIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFollowSymlinksIT.java similarity index 93% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFollowSymlinksIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFollowSymlinksIT.java index aa2574f72..84abeac30 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestFollowSymlinksIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFollowSymlinksIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.nio.file.Files; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIgnoreFoldersIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java similarity index 93% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIgnoreFoldersIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java index acf1c3e1c..1a5ef9466 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIgnoreFoldersIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java @@ -17,11 +17,12 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SUFFIX_FOLDER; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIncludesIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIncludesIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIncludesIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIncludesIT.java index c1adf4e45..c411f9418 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIncludesIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIncludesIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIndexContentIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIndexContentIT.java similarity index 92% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIndexContentIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIndexContentIT.java index 8678dec87..1c67a643e 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIndexContentIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIndexContentIT.java @@ -17,12 +17,13 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESPrefixQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIngestPipelineIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIngestPipelineIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java index a2a5df214..846400c6d 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestIngestPipelineIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java @@ -17,13 +17,14 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESMatchQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SUFFIX_FOLDER; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestJsonSupportIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java similarity index 97% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestJsonSupportIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java index fdc515dca..2ed61af9d 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestJsonSupportIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java @@ -17,12 +17,13 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESMatchQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.io.IOException; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestLoopsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestLoopsIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestLoopsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestLoopsIT.java index 039efe7ee..b6c7966b4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestLoopsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestLoopsIT.java @@ -17,12 +17,13 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestMultipleCrawlersIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestMultipleCrawlersIT.java similarity index 92% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestMultipleCrawlersIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestMultipleCrawlersIT.java index 57c868b93..d2ac593fd 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestMultipleCrawlersIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestMultipleCrawlersIT.java @@ -17,11 +17,12 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java similarity index 96% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java index e6c3873ac..ce408cc88 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRawIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java @@ -17,13 +17,14 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static com.carrotsearch.randomizedtesting.RandomizedTest.rarely; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRemoveDeletedIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java similarity index 98% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRemoveDeletedIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java index a51f76dd1..9c17bcf23 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRemoveDeletedIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import com.google.common.base.Charsets; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.apache.logging.log4j.Level; import org.junit.Test; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRestOnlyIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRestOnlyIT.java index 6cf22edf9..d9290d4a6 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestRestOnlyIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRestOnlyIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; @@ -26,13 +26,14 @@ import fr.pilato.elasticsearch.crawler.fs.rest.UploadResponse; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.Rest; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import javax.ws.rs.client.WebTarget; import java.nio.file.Files; import java.nio.file.Path; -import static fr.pilato.elasticsearch.crawler.fs.test.integration.FsCrawlerRestIT.uploadFile; +import static fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch.FsCrawlerRestIT.uploadFile; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSettingsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSettingsIT.java similarity index 93% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSettingsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSettingsIT.java index 2e4eec1ba..d74ff625f 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSettingsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSettingsIT.java @@ -17,12 +17,13 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SUFFIX_FOLDER; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSshIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSshIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSshIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSshIT.java index 9955bf3e2..5aba9e21c 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSshIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSshIT.java @@ -17,11 +17,12 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.Server; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Ignore; import org.junit.Test; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestStoreSourceIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java similarity index 95% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestStoreSourceIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java index a8d4637d2..1d52cc25e 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestStoreSourceIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java @@ -17,13 +17,14 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSubDirsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java similarity index 98% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSubDirsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java index cc8aa763c..ee58adda6 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestSubDirsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESTermsAggregation; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.hamcrest.Matcher; import org.junit.Test; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestUnparsableIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestUnparsableIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestUnparsableIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestUnparsableIT.java index 9246e28f0..99e004512 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestUnparsableIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestUnparsableIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import java.nio.file.FileSystems; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestXmlSupportIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestXmlSupportIT.java similarity index 93% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestXmlSupportIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestXmlSupportIT.java index acc7a3c14..613dc8cd0 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestXmlSupportIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestXmlSupportIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESMatchQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESRangeQuery; @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestZipFilesIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestZipFilesIT.java similarity index 91% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestZipFilesIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestZipFilesIT.java index 4b2061e51..f0e41f612 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestZipFilesIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestZipFilesIT.java @@ -17,10 +17,11 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java similarity index 98% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index c3d3638ac..9cfbe19ec 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; @@ -34,6 +34,7 @@ import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java similarity index 94% rename from integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java rename to integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index c3c10a3ac..46b81587d 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.test.integration; +package fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; @@ -26,6 +26,7 @@ import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.Test; import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; diff --git a/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerMetadataTestCase.java b/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerMetadataTestCase.java index 84199d5cd..d436ca54e 100644 --- a/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerMetadataTestCase.java +++ b/test-framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/framework/AbstractFSCrawlerMetadataTestCase.java @@ -29,7 +29,7 @@ import static fr.pilato.elasticsearch.crawler.fs.test.framework.FsCrawlerUtilForTests.copyDefaultResources; -public class AbstractFSCrawlerMetadataTestCase extends AbstractFSCrawlerTestCase { +public abstract class AbstractFSCrawlerMetadataTestCase extends AbstractFSCrawlerTestCase { protected static Path metadataDir; From 3d28682ee4b158dd1afe32228ef749cc2b6947ba Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 3 Aug 2020 14:03:30 +0200 Subject: [PATCH 13/67] The path to make WPSearch testable --- .../integration/AbstractFsCrawlerITCase.java | 4 +- .../fs/test/integration/AbstractITCase.java | 94 ++++--------------- .../test/integration/AbstractRestITCase.java | 88 ++++++++--------- .../elasticsearch/ElasticsearchClientIT.java | 3 + .../FsCrawlerImplAllDocumentsIT.java | 7 +- .../elasticsearch/FsCrawlerRestIT.java | 57 ++++++++++- .../FsCrawlerTestDefaultsIT.java | 2 +- .../FsCrawlerTestFilenameAsIdIT.java | 6 +- .../FsCrawlerTestIgnoreFoldersIT.java | 2 +- .../FsCrawlerTestIngestPipelineIT.java | 12 +-- .../FsCrawlerTestJsonSupportIT.java | 10 +- .../elasticsearch/FsCrawlerTestRawIT.java | 6 +- .../FsCrawlerTestRemoveDeletedIT.java | 2 +- .../FsCrawlerTestStoreSourceIT.java | 2 +- .../elasticsearch/FsCrawlerTestSubDirsIT.java | 12 +-- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 49 ++++++---- .../FsCrawlerTestWorkplaceSearchIT.java | 52 +++++++++- 17 files changed, 226 insertions(+), 182 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java index 0bb9405f9..8926a3e73 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractFsCrawlerITCase.java @@ -39,12 +39,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -public abstract class AbstractFsCrawlerITCase extends AbstractITCase { +public abstract class AbstractFsCrawlerITCase extends AbstractRestITCase { @Before public void cleanExistingIndex() throws IOException { logger.info(" -> Removing existing index [{}*]", getCrawlerName()); - esClient.deleteIndex(getCrawlerName() + "*"); + documentService.getClient().deleteIndex(getCrawlerName() + "*"); } @After diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index fbebb1388..51cbea381 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -25,30 +25,22 @@ import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; -import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.framework.ByteSizeValue; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; -import fr.pilato.elasticsearch.crawler.fs.rest.RestJsonProvider; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl; import fr.pilato.elasticsearch.crawler.fs.test.framework.AbstractFSCrawlerTestCase; import fr.pilato.elasticsearch.crawler.fs.test.framework.TestContainerThreadFilter; import org.apache.logging.log4j.Level; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.hamcrest.Matcher; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import java.io.File; import java.io.IOException; import java.net.ConnectException; @@ -59,7 +51,6 @@ import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -108,8 +99,6 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private final static String DEFAULT_PASSWORD = "changeme"; private final static Integer DEFAULT_TEST_REST_PORT = 8080; - protected static ElasticsearchClient esClient; - private static String testClusterUrl; private final static String testClusterUser = System.getProperty("tests.cluster.user", DEFAULT_USERNAME); private final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); @@ -118,9 +107,9 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f228f0d98503e16e8db596c"); - static Elasticsearch elasticsearchWithSecurity; - protected static WebTarget target; - protected static Client client; + protected static Elasticsearch elasticsearchWithSecurity; + protected static FsCrawlerManagementService managementService; + protected static FsCrawlerDocumentService documentService; /** * We suppose that each test has its own set of files. Even if we duplicate them, that will make the code @@ -238,7 +227,7 @@ private static void copyTestDocumentsToTargetDir(Path target, String sourceDirNa } @BeforeClass - public static void startElasticsearchRestClient() throws IOException { + public static void startDocumentService() throws IOException { String testClusterCloudId = System.getProperty("tests.cluster.cloud_id"); if (testClusterCloudId != null && !testClusterCloudId.isEmpty()) { testClusterUrl = decodeCloudId(testClusterCloudId); @@ -259,41 +248,13 @@ public static void startElasticsearchRestClient() throws IOException { .setPassword(testClusterPass) .build(); FsSettings fsSettings = FsSettings.builder("esClient").setElasticsearch(elasticsearchWithSecurity).build(); - esClient = ElasticsearchClientUtil.getInstance(null, fsSettings); - esClient.start(); - - // We make sure the cluster is running - testClusterRunning(); - } - - @BeforeClass - public static void startRestClient() { - // create the client - client = ClientBuilder.newBuilder() - .register(MultiPartFeature.class) - .register(RestJsonProvider.class) - .register(JacksonFeature.class) - .build(); - - target = client.target("http://127.0.0.1:" + testRestPort + "/fscrawler"); - } - @AfterClass - public static void stopRestClient() throws IOException { - if (client != null) { - client.close(); - client = null; - } + documentService = new FsCrawlerDocumentServiceElasticsearchImpl(metadataDir, fsSettings); + documentService.start(); - if (esClient != null) { - esClient.close(); - esClient = null; - } - } - - private static void testClusterRunning() throws IOException { + // We make sure the cluster is running try { - String version = esClient.getVersion(); + String version = documentService.getClient().getVersion(); staticLogger.info("Starting integration tests against an external cluster running elasticsearch [{}]", version); } catch (ConnectException e) { // If we have an exception here, let's ignore the test @@ -303,11 +264,11 @@ private static void testClusterRunning() throws IOException { } @AfterClass - public static void stopElasticsearchClient() throws IOException { + public static void stopDocumentService() throws IOException { staticLogger.info("Stopping integration tests against an external cluster"); - if (esClient != null) { - esClient.close(); - esClient = null; + if (documentService != null) { + documentService.close(); + documentService = null; staticLogger.info("Elasticsearch client stopped"); } } @@ -341,7 +302,7 @@ protected static Elasticsearch generateElasticsearchConfig(String indexName, Str } protected static void refresh() throws IOException { - esClient.refresh(null); + documentService.getClient().refresh(null); } /** @@ -381,7 +342,7 @@ public static ESSearchResponse countTestHelper(final ESSearchRequest request, fi try { // Make sure we refresh indexed docs before counting refresh(); - response[0] = esClient.search(request); + response[0] = documentService.getClient().search(request); } catch (RuntimeException|IOException e) { staticLogger.warn("error caught", e); return -1; @@ -469,27 +430,6 @@ public static String[] split(String toSplit, String delimiter) { return new String[]{beforeDelimiter, afterDelimiter}; } - public static T restCall(String path, Class clazz) { - if (staticLogger.isDebugEnabled()) { - String response = target.path(path).request().get(String.class); - staticLogger.debug("Rest response: {}", response); - } - return target.path(path).request().get(clazz); - } - - public static T restCall(String path, FormDataMultiPart mp, Class clazz, Map params) { - return restCall(target, path, mp, clazz, params); - } - - public static T restCall(WebTarget target, String path, FormDataMultiPart mp, Class clazz, Map params) { - WebTarget targetPath = target.path(path); - params.forEach(targetPath::queryParam); - - return targetPath.request(MediaType.MULTIPART_FORM_DATA) - .accept(MediaType.APPLICATION_JSON) - .post(Entity.entity(mp, mp.getMediaType()), clazz); - } - public static void deleteRecursively(Path root) throws IOException { Files.walkFileTree(root, new SimpleFileVisitor() { @Override diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java index a026154e8..d077c40b4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java @@ -19,65 +19,57 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration; -import fr.pilato.elasticsearch.crawler.fs.rest.RestServer; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementServiceElasticsearchImpl; -import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; -import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; -import fr.pilato.elasticsearch.crawler.fs.settings.Rest; -import org.junit.After; -import org.junit.Before; +import fr.pilato.elasticsearch.crawler.fs.rest.RestJsonProvider; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.media.multipart.FormDataMultiPart; +import org.glassfish.jersey.media.multipart.MultiPartFeature; +import org.junit.AfterClass; +import org.junit.BeforeClass; -import java.io.IOException; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import java.util.Map; public abstract class AbstractRestITCase extends AbstractITCase { - private FsCrawlerManagementService managementService; - private FsCrawlerDocumentService documentService; + protected static WebTarget target; + protected static Client client; - @Before - public void startRestServer() throws Exception { - FsSettings fsSettings = FsSettings.builder(getCrawlerName()) - .setRest(new Rest("http://127.0.0.1:" + testRestPort + "/fscrawler")) - .setElasticsearch(elasticsearchWithSecurity) - .build(); - fsSettings.getElasticsearch().setIndex(getCrawlerName()); - FsCrawlerValidator.validateSettings(logger, fsSettings, true); - - this.managementService = new FsCrawlerManagementServiceElasticsearchImpl(metadataDir, fsSettings); - - if (fsSettings.getWorkplaceSearch() == null) { - // The documentService is using the esSearch instance - this.documentService = new FsCrawlerDocumentServiceElasticsearchImpl(metadataDir, fsSettings); - } else { - // The documentService is using the wpSearch instance - this.documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + public static T restCall(String path, Class clazz) { + if (staticLogger.isDebugEnabled()) { + String response = target.path(path).request().get(String.class); + staticLogger.debug("Rest response: {}", response); } + return target.path(path).request().get(clazz); + } - managementService.start(); - documentService.start(); - - RestServer.start(fsSettings, managementService, documentService); + public static T restCall(WebTarget target, String path, FormDataMultiPart mp, Class clazz, Map params) { + WebTarget targetPath = target.path(path); + params.forEach(targetPath::queryParam); - logger.info(" -> Removing existing index [{}]", getCrawlerName() + "*"); - managementService.getClient().deleteIndex(getCrawlerName() + "*"); + return targetPath.request(MediaType.MULTIPART_FORM_DATA) + .accept(MediaType.APPLICATION_JSON) + .post(Entity.entity(mp, mp.getMediaType()), clazz); + } - logger.info(" -> Creating index [{}]", fsSettings.getElasticsearch().getIndex()); + @BeforeClass + public static void startRestClient() { + // create the client + client = ClientBuilder.newBuilder() + .register(MultiPartFeature.class) + .register(RestJsonProvider.class) + .register(JacksonFeature.class) + .build(); } - @After - public void stopRestServer() throws IOException { - RestServer.close(); - if (managementService != null) { - managementService.close(); - managementService = null; - } - if (documentService != null) { - documentService.close(); - documentService = null; + @AfterClass + public static void stopRestClient() { + if (client != null) { + client.close(); + client = null; } } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java index ca60728ff..c9cf0898f 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java @@ -23,6 +23,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; +import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import org.junit.Before; import org.junit.Test; @@ -42,6 +43,8 @@ */ public class ElasticsearchClientIT extends AbstractITCase { + private ElasticsearchClient esClient = documentService.getClient(); + @Before public void cleanExistingIndex() throws IOException { logger.info(" -> Removing existing index [{}*]", getCrawlerName()); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java index cd59a40bd..732f27410 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java @@ -30,6 +30,8 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; @@ -56,6 +58,7 @@ public class FsCrawlerImplAllDocumentsIT extends AbstractITCase { private static FsCrawlerImpl crawler = null; + private static FsCrawlerDocumentService documentService = null; @BeforeClass public static void startCrawling() throws Exception { @@ -77,7 +80,7 @@ public static void startCrawling() throws Exception { } staticLogger.info(" -> Removing existing index [fscrawler_test_all_documents*]"); - esClient.deleteIndex("fscrawler_test_all_documents*"); + documentService.getClient().deleteIndex("fscrawler_test_all_documents*"); staticLogger.info(" --> starting crawler in [{}] which contains [{}] files", testResourceTarget, numFiles); @@ -252,7 +255,7 @@ private ESSearchResponse runSearch(String filename, String content) throws IOExc if (content != null) { query.addMust(new ESMatchQuery("content", content)); } - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex("fscrawler_test_all_documents") .withESQuery(query)); assertThat(response.getTotalHits(), is(1L)); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java index bbc15881a..d9ca84acc 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerRestIT.java @@ -25,11 +25,21 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.framework.Version; +import fr.pilato.elasticsearch.crawler.fs.rest.RestServer; import fr.pilato.elasticsearch.crawler.fs.rest.ServerStatusResponse; import fr.pilato.elasticsearch.crawler.fs.rest.UploadResponse; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerManagementServiceElasticsearchImpl; +import fr.pilato.elasticsearch.crawler.fs.settings.FsCrawlerValidator; +import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.Rest; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractRestITCase; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -56,6 +66,8 @@ public class FsCrawlerRestIT extends AbstractRestITCase { private Path currentTestTagDir; + private FsCrawlerManagementService managementService; + private FsCrawlerDocumentService documentService; @Before public void copyTags() throws IOException { @@ -77,6 +89,49 @@ public void copyTags() throws IOException { } } + @Before + public void startRestServer() throws Exception { + FsSettings fsSettings = FsSettings.builder(getCrawlerName()) + .setRest(new Rest("http://127.0.0.1:" + testRestPort + "/fscrawler")) + .setElasticsearch(elasticsearchWithSecurity) + .build(); + fsSettings.getElasticsearch().setIndex(getCrawlerName()); + FsCrawlerValidator.validateSettings(logger, fsSettings, true); + + this.managementService = new FsCrawlerManagementServiceElasticsearchImpl(metadataDir, fsSettings); + + if (fsSettings.getWorkplaceSearch() == null) { + // The documentService is using the esSearch instance + this.documentService = new FsCrawlerDocumentServiceElasticsearchImpl(metadataDir, fsSettings); + } else { + // The documentService is using the wpSearch instance + this.documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + } + + managementService.start(); + documentService.start(); + + RestServer.start(fsSettings, managementService, documentService); + + logger.info(" -> Removing existing index [{}]", getCrawlerName() + "*"); + managementService.getClient().deleteIndex(getCrawlerName() + "*"); + + logger.info(" -> Creating index [{}]", fsSettings.getElasticsearch().getIndex()); + } + + @After + public void stopRestServer() throws IOException { + RestServer.close(); + if (managementService != null) { + managementService.close(); + managementService = null; + } + if (documentService != null) { + documentService.close(); + documentService = null; + } + } + @Test public void testCallRoot() { ServerStatusResponse status = restCall("/", ServerStatusResponse.class); @@ -256,7 +311,7 @@ public void testDocumentWithExternalTags() throws Exception { } private void checkDocument(String filename, HitChecker checker) throws IOException { - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESTermQuery("file.filename", filename))); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java index c4bd7df39..f65dda795 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java @@ -99,7 +99,7 @@ public void test_highlight_documents() throws Exception { countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 1L, null); // Let's test highlighting - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("content", "exemplo")) .addHighlighter("content")); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java index ca19d50a5..6825fc3fe 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestFilenameAsIdIT.java @@ -47,7 +47,7 @@ public void test_filename_as_id() throws Exception { assertThat("Document should exists with [roottxtfile.txt] id...", awaitBusy(() -> { try { - return esClient.exists(getCrawlerName(), "roottxtfile.txt"); + return documentService.getClient().exists(getCrawlerName(), "roottxtfile.txt"); } catch (IOException e) { return false; } @@ -70,14 +70,14 @@ public void test_remove_deleted_with_filename_as_id() throws Exception { assertThat("Document should exists with [id1.txt] id...", awaitBusy(() -> { try { - return esClient.exists(getCrawlerName(), "id1.txt"); + return documentService.getClient().exists(getCrawlerName(), "id1.txt"); } catch (IOException e) { return false; } }), equalTo(true)); assertThat("Document should exists with [id2.txt] id...", awaitBusy(() -> { try { - return esClient.exists(getCrawlerName(), "id2.txt"); + return documentService.getClient().exists(getCrawlerName(), "id2.txt"); } catch (IOException e) { return false; } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java index 1a5ef9466..f00add962 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java @@ -48,7 +48,7 @@ public void test_ignore_folders() throws Exception { countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 2L, null); // We expect having no folders - ESSearchResponse response = esClient.search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER)); + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER)); staticLogger.trace("result {}", response.toString()); assertThat(response.getTotalHits(), is(0L)); } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java index 846400c6d..0ec73177a 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIngestPipelineIT.java @@ -47,7 +47,7 @@ public void test_ingest_pipeline() throws Exception { String crawlerName = getCrawlerName(); // We can only run this test against a 5.0 cluster or > - assumeThat("We skip the test as we are not running it with a 5.0 cluster or >", esClient.isIngestSupported(), is(true)); + assumeThat("We skip the test as we are not running it with a 5.0 cluster or >", documentService.getClient().isIngestSupported(), is(true)); // Create an empty ingest pipeline String pipeline = "{\n" + @@ -61,7 +61,7 @@ public void test_ingest_pipeline() throws Exception { " }\n" + " ]\n" + "}"; - esClient.performLowLevelRequest("PUT", "/_ingest/pipeline/" + crawlerName, pipeline); + documentService.getClient().performLowLevelRequest("PUT", "/_ingest/pipeline/" + crawlerName, pipeline); Elasticsearch elasticsearch = endCrawlerDefinition(crawlerName); elasticsearch.setPipeline(crawlerName); @@ -74,7 +74,7 @@ public void test_ingest_pipeline() throws Exception { .withESQuery(new ESMatchQuery("my_content_field", "perniciosoque")), 1L, currentTestResourceDir); // We expect to have one folder - ESSearchResponse response = esClient.search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER)); + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER)); assertThat(response.getTotalHits(), is(1L)); } @@ -86,7 +86,7 @@ public void test_ingest_pipeline_392() throws Exception { String crawlerName = getCrawlerName(); // We can only run this test against a 5.0 cluster or > - assumeThat("We skip the test as we are not running it with a 5.0 cluster or >", esClient.isIngestSupported(), is(true)); + assumeThat("We skip the test as we are not running it with a 5.0 cluster or >", documentService.getClient().isIngestSupported(), is(true)); // Create an empty ingest pipeline String pipeline = "{\n" + @@ -109,7 +109,7 @@ public void test_ingest_pipeline_392() throws Exception { " }\n" + " ]\n" + "}"; - esClient.performLowLevelRequest("PUT", "/_ingest/pipeline/" + crawlerName, pipeline); + documentService.getClient().performLowLevelRequest("PUT", "/_ingest/pipeline/" + crawlerName, pipeline); Elasticsearch elasticsearch = endCrawlerDefinition(crawlerName); elasticsearch.setPipeline(crawlerName); @@ -130,7 +130,7 @@ public void test_ingest_missing_pipeline_490() throws Exception { // We can only run this test against a 5.0 cluster or > assumeThat("We skip the test as we are not running it with a 5.0 cluster or >", - esClient.isIngestSupported(), is(true)); + documentService.getClient().isIngestSupported(), is(true)); Elasticsearch elasticsearch = endCrawlerDefinition(crawlerName); elasticsearch.setPipeline(crawlerName); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java index 2ed61af9d..7d7b32d10 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestJsonSupportIT.java @@ -48,7 +48,7 @@ public void test_json_support() throws Exception { assertThat("We should have 2 doc for tweet in text field...", awaitBusy(() -> { try { - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("text", "tweet"))); return response.getTotalHits() == 2; @@ -71,7 +71,7 @@ public void test_json_disabled() throws Exception { assertThat("We should have 0 doc for tweet in text field...", awaitBusy(() -> { try { - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("text", "tweet"))); return response.getTotalHits() == 0; @@ -83,7 +83,7 @@ public void test_json_disabled() throws Exception { assertThat("We should have 2 docs for tweet in content field...", awaitBusy(() -> { try { - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("content", "tweet"))); return response.getTotalHits() == 2; @@ -107,7 +107,7 @@ public void test_add_as_inner_object() throws Exception { assertThat("We should have 2 doc for tweet in object.text field...", awaitBusy(() -> { try { - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("object.text", "tweet"))); return response.getTotalHits() == 2; @@ -130,7 +130,7 @@ public void test_json_support_and_other_files() throws Exception { assertThat("We should have 2 docs only...", awaitBusy(() -> { try { - ESSearchResponse response = esClient.search(new ESSearchRequest().withIndex(getCrawlerName())); + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName())); return response.getTotalHits() == 2; } catch (IOException e) { logger.warn("Caught exception while running the test", e); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java index ce408cc88..630eb0769 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRawIT.java @@ -68,9 +68,9 @@ public void test_mapping() throws Exception { // This will cause an Elasticsearch Exception as the String is not a Date // If the mapping is incorrect - esClient.indexRawJson(getCrawlerName(), "1", json1, null); - esClient.indexRawJson(getCrawlerName(), "2", json2, null); - esClient.flush(); + documentService.getClient().indexRawJson(getCrawlerName(), "1", json1, null); + documentService.getClient().indexRawJson(getCrawlerName(), "2", json2, null); + documentService.getClient().flush(); } @Test diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java index 9c17bcf23..43c3ffc66 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestRemoveDeletedIT.java @@ -233,7 +233,7 @@ private void checkDocVersions(ESSearchResponse response, long maxVersion) { for (ESSearchHit hit : response.getHits()) { // Read the document. This is needed since 5.0 as search does not return the _version field try { - ESSearchHit getHit = esClient.get(hit.getIndex(), hit.getId()); + ESSearchHit getHit = documentService.getClient().get(hit.getIndex(), hit.getId()); assertThat(getHit.getVersion(), lessThanOrEqualTo(maxVersion)); } catch (IOException e) { fail("We got an IOException: " + e.getMessage()); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java index 1d52cc25e..0a53712f4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestStoreSourceIT.java @@ -56,7 +56,7 @@ public void test_do_not_store_source() throws Exception { countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 1L, null); - ESSearchResponse searchResponse = esClient.search(new ESSearchRequest().withIndex(getCrawlerName())); + ESSearchResponse searchResponse = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName())); for (ESSearchHit hit : searchResponse.getHits()) { // We check that the field is not part of _source assertThat(hit.getSourceAsMap().get(Doc.FIELD_NAMES.ATTACHMENT), nullValue()); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java index ee58adda6..be88fa864 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestSubDirsIT.java @@ -78,7 +78,7 @@ public void test_subdirs_deep_tree() throws Exception { countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 7L, null); // Run aggs - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withSize(0) .withAggregation(new ESTermsAggregation("folders", "path.virtual.tree"))); @@ -92,7 +92,7 @@ public void test_subdirs_deep_tree() throws Exception { assertThat(buckets, iterableWithSize(10)); // Check files - response = esClient.search(new ESSearchRequest().withIndex(getCrawlerName()).withSort("path.virtual")); + response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName()).withSort("path.virtual")); assertThat(response.getTotalHits(), is(7L)); int i = 0; @@ -106,7 +106,7 @@ public void test_subdirs_deep_tree() throws Exception { // Check folders - response = esClient.search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER).withSort("virtual")); + response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER).withSort("virtual")); assertThat(response.getTotalHits(), is(7L)); i = 0; @@ -144,7 +144,7 @@ public void test_subdirs_very_deep_tree() throws Exception { countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), subdirs+1, null); // Run aggs - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withSize(0) .withAggregation(new ESTermsAggregation("folders", "path.virtual.tree"))); @@ -158,7 +158,7 @@ public void test_subdirs_very_deep_tree() throws Exception { assertThat(buckets, iterableWithSize(10)); // Check files - response = esClient.search(new ESSearchRequest() + response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName()) .withSize(1000) .withSort("path.virtual")); @@ -169,7 +169,7 @@ public void test_subdirs_very_deep_tree() throws Exception { } // Check folders - response = esClient.search(new ESSearchRequest() + response = documentService.getClient().search(new ESSearchRequest() .withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER) .withSize(1000) .withSort("virtual")); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 9cfbe19ec..b190381e2 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -30,11 +30,12 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; -import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; -import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -47,7 +48,6 @@ import static fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.LOOP_INFINITE; import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; -import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -57,9 +57,10 @@ /** * Test all type of documents we have with workplace search */ -public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractITCase { +public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractFsCrawlerITCase { private static FsCrawlerImpl crawler = null; + private static FsCrawlerDocumentService oldDocumentService; @BeforeClass public static void startCrawling() throws Exception { @@ -83,25 +84,31 @@ public static void startCrawling() throws Exception { throw new RuntimeException(testResourceTarget + " doesn't seem to exist. Check your JUnit tests."); } + oldDocumentService = documentService; + + FsSettings fsSettings = FsSettings.builder("fscrawler_workplacesearch_test_all_documents") + .setElasticsearch(generateElasticsearchConfig("fscrawler_workplacesearch_test_all_documents", + "fscrawler_workplacesearch_test_all_documents_folder", + 5, TimeValue.timeValueSeconds(1), null)) + .setFs(Fs.builder() + .setUrl(testResourceTarget.toString()) + .setLangDetect(true) + .build()) + .setWorkplaceSearch(WorkplaceSearch.builder() + .setAccessToken(testWorkplaceAccessToken) + .setContentSourceKey(testWorkplaceKey) + .build()) + .build(); + + documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + documentService.start(); + staticLogger.info(" -> Removing existing index [.ent-search-engine-*]"); - esClient.deleteIndex(".ent-search-engine-*"); + documentService.getClient().deleteIndex(".ent-search-engine-*"); staticLogger.info(" --> starting crawler in [{}] which contains [{}] files", testResourceTarget, numFiles); - crawler = new FsCrawlerImpl(metadataDir, - FsSettings.builder("fscrawler_workplacesearch_test_all_documents") - .setElasticsearch(generateElasticsearchConfig("fscrawler_workplacesearch_test_all_documents", "fscrawler_workplacesearch_test_all_documents_folder", - 5, TimeValue.timeValueSeconds(1), null)) - .setFs(Fs.builder() - .setUrl(testResourceTarget.toString()) - .setLangDetect(true) - .build()) - .setWorkplaceSearch(WorkplaceSearch.builder() - .setAccessToken(testWorkplaceAccessToken) - .setContentSourceKey(testWorkplaceKey) - .build()) - .build(), LOOP_INFINITE, false); - + crawler = new FsCrawlerImpl(metadataDir, fsSettings, LOOP_INFINITE, false); crawler.start(); // We wait until we have all docs @@ -115,6 +122,8 @@ public static void stopCrawling() throws Exception { crawler.close(); crawler = null; } + documentService.close(); + documentService = oldDocumentService; } /** @@ -263,7 +272,7 @@ private ESSearchResponse runSearch(String filename, String content) throws IOExc if (content != null) { query.addMust(new ESMatchQuery("content", content)); } - ESSearchResponse response = esClient.search(new ESSearchRequest() + ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(".ent-search-engine-*") .withESQuery(query)); assertThat(response.getTotalHits(), is(1L)); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 46b81587d..d3778c705 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -22,14 +22,26 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; +import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; +import org.hamcrest.Matcher; +import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; +import java.io.IOException; +import java.util.Map; + import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeThat; @@ -38,13 +50,14 @@ */ public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { - @Test - public void testWorkplaceSearch() throws Exception { - assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - testWorkplaceAccessToken == null || testWorkplaceKey == null); + private FsCrawlerDocumentService oldDocumentService; + private FsSettings fsSettings; + @Before + public void overrideDocumentService() throws IOException { + oldDocumentService = documentService; Fs fs = startCrawlerDefinition().build(); - FsSettings fsSettings = FsSettings.builder(getCrawlerName()) + fsSettings = FsSettings.builder(getCrawlerName()) .setFs(fs) .setElasticsearch(Elasticsearch.builder() .addNode(NODE_DEFAULT) @@ -54,8 +67,37 @@ public void testWorkplaceSearch() throws Exception { .setContentSourceKey(testWorkplaceKey) .build()) .build(); + documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + documentService.start(); + + logger.info(" -> Removing existing index [.ent-search-engine-*]"); + documentService.getClient().deleteIndex(".ent-search-engine-*"); + } + + @After + public void resetDocumentService() throws IOException { + documentService.close(); + documentService = oldDocumentService; + } + + @Test + public void testWorkplaceSearch() throws Exception { + assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + testWorkplaceAccessToken == null || testWorkplaceKey == null); startCrawler(getCrawlerName(), fsSettings, TimeValue.timeValueSeconds(10)); ESSearchResponse searchResponse = countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 1L, null); + + Map source = searchResponse.getHits().get(0).getSourceAsMap(); + assertThat(source, hasEntry(is("path$string"), notNullValue())); + assertThat(source, hasEntry("extension$string", "txt")); + assertThat(source, hasEntry("size$float", 12230.0)); + assertThat(source, hasEntry(is("text_size$float"), nullValue())); + assertThat(source, hasEntry(is("mime_type$string"), notNullValue())); + assertThat(source, hasEntry("name$string", "roottxtfile.txt")); + assertThat(source, hasEntry(is("created_at$string"), notNullValue())); + assertThat(source, hasEntry(is("body$string"), notNullValue())); + assertThat(source, hasEntry(is("last_modified$string"), notNullValue())); + assertThat(source, hasEntry("url$string", "file:///roottxtfile.txt")); } } From da74dd1dc4a1b9d3b897ecb1ad56201483f3316f Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 3 Aug 2020 19:55:42 +0200 Subject: [PATCH 14/67] Fix some tests, add more fields and fix date format --- .../fs/client/v7/WorkplaceSearchClientV7.java | 43 ++++++++++---- .../fs/test/integration/AbstractITCase.java | 2 +- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 57 +++++++++++-------- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 9277bc41b..d7c6d3768 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -34,7 +34,9 @@ import java.io.IOException; import java.nio.file.Path; +import java.text.SimpleDateFormat; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,6 +50,7 @@ public class WorkplaceSearchClientV7 implements WorkplaceSearchClient { private static final Logger logger = LogManager.getLogger(WorkplaceSearchClientV7.class); private final Path config; private final FsSettings settings; + private static final SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZZZZZ"); private ElasticsearchClient esClient = null; private Client client = null; @@ -55,6 +58,7 @@ public class WorkplaceSearchClientV7 implements WorkplaceSearchClient { public WorkplaceSearchClientV7(Path config, FsSettings settings) { this.config = config; this.settings = settings; + } @Override @@ -136,16 +140,30 @@ public String getDefaultTypeName() { @Override public void index(String index, String id, Doc doc, String pipeline) { Map document = new HashMap<>(); - document.put("body", doc.getContent()); // to content, - document.put("name", doc.getFile().getFilename()); // to file.name, - document.put("mime_type", doc.getFile().getContentType()); // to tikaResult.metadata.mimeType, - document.put("extension", doc.getFile().getExtension()); // to tikaResult.metadata.extension, - document.put("size", doc.getFile().getFilesize()); // to tikaResult.metadata.origSize, - document.put("text_size", doc.getFile().getIndexedChars()); // to tikaResult.metadata.textSize, - document.put("url", "file://" + doc.getPath().getVirtual()); // to file.toURI().toURL().toString().replace("file:", "file://"), - document.put("path", doc.getPath().getReal()); // to file.absolutePath, - document.put("last_modified", doc.getFile().getLastModified()); // to Instant.ofEpochMilli(file.lastModified()).atZone(ZoneId.systemDefault()).format(format), - document.put("created_at", doc.getFile().getCreated()); // to attributes.creationTime().toInstant().atZone(ZoneId.systemDefault()).format(format), + // Index content + document.put("body", doc.getContent()); + + // Index main meta data + document.put("title", doc.getMeta().getTitle()); + document.put("author", doc.getMeta().getAuthor()); + document.put("keywords", doc.getMeta().getKeywords()); + document.put("language", doc.getMeta().getLanguage()); + document.put("comments", doc.getMeta().getComments()); + + // Index main file attributes + document.put("name", doc.getFile().getFilename()); + document.put("mime_type", doc.getFile().getContentType()); + document.put("extension", doc.getFile().getExtension()); + document.put("size", doc.getFile().getFilesize()); + document.put("text_size", doc.getFile().getIndexedChars()); + document.put("last_modified", toRFC3339(doc.getFile().getLastModified())); + document.put("created_at", toRFC3339(doc.getFile().getCreated())); + + // Index main path attributes + // document.put("url", "file://" + doc.getPath().getVirtual()); + document.put("url", "file://" + doc.getPath().getReal()); + document.put("path", doc.getPath().getReal()); + List> documents = Collections.singletonList(document); @@ -211,4 +229,9 @@ public boolean exists(String index, String id) throws IOException { throw new RuntimeException("Not implemented yet"); // return esClient.exists(index, id); } + + static String toRFC3339(Date d) + { + return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2"); + } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 51cbea381..1f0b3537f 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -105,7 +105,7 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); - protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f228f0d98503e16e8db596c"); + protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f284ee198503ef853db67a8"); protected static Elasticsearch elasticsearchWithSecurity; protected static FsCrawlerManagementService managementService; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index b190381e2..52aabdaa5 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -20,15 +20,11 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; import fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl; -import fr.pilato.elasticsearch.crawler.fs.beans.Doc; -import fr.pilato.elasticsearch.crawler.fs.beans.File; -import fr.pilato.elasticsearch.crawler.fs.beans.Meta; import fr.pilato.elasticsearch.crawler.fs.client.ESBoolQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESMatchQuery; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; -import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; @@ -45,10 +41,11 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.util.Map; import static fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.LOOP_INFINITE; -import static fr.pilato.elasticsearch.crawler.fs.framework.JsonUtil.extractFromPath; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assume.assumeFalse; @@ -148,17 +145,17 @@ public void testExtractFromDoc() throws IOException { public void testExtractFromDocx() throws IOException { ESSearchResponse response = runSearch("test.docx", "sample"); for (ESSearchHit hit : response.getHits()) { - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.FILENAME), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.CONTENT_TYPE), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.URL), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.FILESIZE), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.INDEXING_DATE), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.CREATED), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.LAST_MODIFIED), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.FILE).get(File.FIELD_NAMES.LAST_ACCESSED), notNullValue()); - - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.TITLE), notNullValue()); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.KEYWORDS), notNullValue()); + Map source = hit.getSourceAsMap(); + assertThat(source, hasEntry(is("name$string"), notNullValue())); + assertThat(source, hasEntry(is("mime_type$string"), notNullValue())); + assertThat(source, hasEntry(is("url$string"), notNullValue())); + assertThat(source, hasEntry(is("size$float"), notNullValue())); + assertThat(source, hasEntry(is("last_modified$string"), notNullValue())); + assertThat(source, hasEntry(is("path$string"), notNullValue())); + assertThat(source, hasEntry(is("created_at$string"), notNullValue())); + assertThat(source, hasEntry(is("title$string"), notNullValue())); + assertThat(source, hasEntry(is("keywords$string"), notNullValue())); + assertThat(source, hasEntry(is("body$string"), notNullValue())); } } @@ -166,8 +163,9 @@ public void testExtractFromDocx() throws IOException { public void testExtractFromEml() throws IOException { ESSearchResponse response = runSearch("test.eml", "test"); for (ESSearchHit hit : response.getHits()) { - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.TITLE), is("Test")); - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.AUTHOR), is("鲨掉 <2428617664@qq.com>")); + Map source = hit.getSourceAsMap(); + assertThat(source, hasEntry(is("title$string"), is("Test"))); + assertThat(source, hasEntry(is("author$string"), is("鲨掉 <2428617664@qq.com>"))); } } @@ -225,17 +223,24 @@ public void testProtectedDocument221() throws IOException { @Test public void testLanguageDetection() throws IOException { + // TODO fix this hack. We can't make sure we are returning one single file ESSearchResponse response = runSearch("test-fr.txt", "fichier"); for (ESSearchHit hit : response.getHits()) { - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("fr")); + if (hit.getSourceAsMap().get("name$string").equals("test-fr.txt")) { + assertThat(hit.getSourceAsMap(), hasEntry("language$string", "fr")); + } } response = runSearch("test-de.txt", "Datei"); for (ESSearchHit hit : response.getHits()) { - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("de")); + if (hit.getSourceAsMap().get("name$string").equals("test-de.txt")) { + assertThat(hit.getSourceAsMap(), hasEntry("language$string", "de")); + } } response = runSearch("test.txt", "contains"); for (ESSearchHit hit : response.getHits()) { - assertThat(extractFromPath(hit.getSourceAsMap(), Doc.FIELD_NAMES.META).get(Meta.FIELD_NAMES.LANGUAGE), is("en")); + if (hit.getSourceAsMap().get("name$string").equals("test.txt")) { + assertThat(hit.getSourceAsMap(), hasEntry("language$string", "en")); + } } } @@ -268,14 +273,18 @@ private ESSearchResponse runSearch(String filename) throws IOException { private ESSearchResponse runSearch(String filename, String content) throws IOException { logger.info(" -> Testing if file [{}] has been indexed correctly{}.", filename, content == null ? "" : " and contains [" + content + "]"); - ESBoolQuery query = new ESBoolQuery().addMust(new ESTermQuery("file.filename", filename)); + ESBoolQuery query = new ESBoolQuery().addMust(new ESMatchQuery("name$string", filename)); if (content != null) { - query.addMust(new ESMatchQuery("content", content)); + query.addMust(new ESMatchQuery("body$string", content)); } ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(".ent-search-engine-*") .withESQuery(query)); - assertThat(response.getTotalHits(), is(1L)); + // assertThat(response.getTotalHits(), is(1L)); + if (response.getTotalHits() != 1) { + logger.warn("With workplace search we can't search for exact filenames so we have {} hits instead " + + "of 1 when looking for [{}].", response.getTotalHits(), filename); + } return response; } } From a91f65a4f4e53e3d2bf10ed6d157864a5a67e795 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 14:59:37 +0200 Subject: [PATCH 15/67] Add an internal WPSearch Client Until we have an official one --- 3rdparty/pom.xml | 20 +++ 3rdparty/workplacesearch-client/pom.xml | 33 ++++ .../thirdparty/wpsearch/WPSearchClient.java | 141 ++++++++++++++++++ .../src/test/resources/log4j2.xml | 16 ++ core/pom.xml | 6 + .../elasticsearch-client-v7/pom.xml | 4 +- .../fs/client/v7/WorkplaceSearchClientV7.java | 21 ++- .../workplacesearch/WPSearchClientIT.java | 63 ++++++++ pom.xml | 40 +---- 9 files changed, 298 insertions(+), 46 deletions(-) create mode 100644 3rdparty/pom.xml create mode 100644 3rdparty/workplacesearch-client/pom.xml create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java create mode 100644 3rdparty/workplacesearch-client/src/test/resources/log4j2.xml create mode 100644 integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java diff --git a/3rdparty/pom.xml b/3rdparty/pom.xml new file mode 100644 index 000000000..52c205e3d --- /dev/null +++ b/3rdparty/pom.xml @@ -0,0 +1,20 @@ + + + + fr.pilato.elasticsearch.crawler + fscrawler-parent + 2.7-SNAPSHOT + + 4.0.0 + + fscrawler-3rdparty + FSCrawler 3rd Party libraries + pom + + + workplacesearch-client + + + diff --git a/3rdparty/workplacesearch-client/pom.xml b/3rdparty/workplacesearch-client/pom.xml new file mode 100644 index 000000000..953baf39e --- /dev/null +++ b/3rdparty/workplacesearch-client/pom.xml @@ -0,0 +1,33 @@ + + + + fscrawler-3rdparty + fr.pilato.elasticsearch.crawler + 2.7-SNAPSHOT + + 4.0.0 + + fscrawler-workplacesearch-client + FSCrawler Workplace Search Client + + + + + fr.pilato.elasticsearch.crawler + fscrawler-framework + + + + + org.glassfish.jersey.core + jersey-client + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + + diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java new file mode 100644 index 000000000..4246cbc7e --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -0,0 +1,141 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import java.io.Closeable; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +public class WPSearchClient implements Closeable { + + private static final Logger logger = LogManager.getLogger(WPSearchClient.class); + + private final static String CLIENT_NAME = "elastic-workplace-search-java"; + private final static String CLIENT_VERSION = "7.8.1"; + private final static String DEFAULT_ENDPOINT = "http://localhost:3002/api/ws/v1/"; + + private Client client; + private String userAgent; + private String endpoint = DEFAULT_ENDPOINT; + private final String accessToken; + private final String key; + + /** + * Create a client + * @param accessToken Access Token to use (get it from the Custom API interface) + * @param key Key to use (get it from the Custom API interface) + */ + public WPSearchClient(String accessToken, String key) { + this.accessToken = accessToken; + this.key = key; + } + + public WPSearchClient withUserAgent(String userAgent) { + this.userAgent = userAgent; + return this; + } + + public WPSearchClient withEndpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + /** + * Start the client + */ + public void start() { + logger.debug("Starting the WPSearchClient"); + client = ClientBuilder.newClient(); + } + + /** + * Index multiple documents + * @param sourceKey Source key (get it from the Custom API interface) + * @param documents Documents to index + */ + public void indexDocuments(String sourceKey, List> documents) { + logger.fatal("{}", documents); + String response = post("sources/" + key + "/documents/bulk_create.json", documents, String.class); + logger.fatal("{}", response); + } + + /** + * Index one single document + * @param sourceKey Source key (get it from the Custom API interface) + * @param document Document to index + */ + public void indexDocument(String sourceKey, Map document) { + + } + + /** + * Delete existing documents + * @param sourceKey Source key (get it from the Custom API interface) + * @param ids List of document ids to delete + */ + public void destroyDocuments(String sourceKey, List ids) { + + } + + /** + * Delete one document + * @param sourceKey Source key (get it from the Custom API interface) + * @param id Document id to delete + */ + public void destroyDocument(String sourceKey, String id) { + + } + + @Override + public void close() throws IOException { + logger.debug("Closing the WPSearchClient"); + if (client != null) { + client.close(); + } + } + + public T post(String path, Object data, Class clazz) { + WebTarget target = client + .target(endpoint) + .path(path); + + Invocation.Builder builder = target + .request(MediaType.APPLICATION_JSON) + .header("Content-Type", "application/json") + .header("X-Swiftype-Client", CLIENT_NAME) + .header("X-Swiftype-Client-Version", CLIENT_VERSION) + .header("Authorization", "Bearer " + accessToken); + + if (userAgent != null) { + builder.header("User-Agent", userAgent); + } + + return builder.post(Entity.entity(data, MediaType.APPLICATION_JSON), clazz); + } +} diff --git a/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml b/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml new file mode 100644 index 000000000..c673129fc --- /dev/null +++ b/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/core/pom.xml b/core/pom.xml index 9919582e1..353848fa9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -80,6 +80,12 @@ fscrawler-elasticsearch-client-base + + + fr.pilato.elasticsearch.crawler + fscrawler-workplacesearch-client + + org.apache.tika tika-parsers diff --git a/elasticsearch-client/elasticsearch-client-v7/pom.xml b/elasticsearch-client/elasticsearch-client-v7/pom.xml index 61b8a9666..673745779 100644 --- a/elasticsearch-client/elasticsearch-client-v7/pom.xml +++ b/elasticsearch-client/elasticsearch-client-v7/pom.xml @@ -33,8 +33,8 @@ ${elasticsearch7.version} - com.sstory.workplace.search - workplace-search-client + fr.pilato.elasticsearch.crawler + fscrawler-workplacesearch-client diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index d7c6d3768..d43cc3170 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -20,7 +20,6 @@ package fr.pilato.elasticsearch.crawler.fs.client.v7; -import com.sstory.workplace.search.client.Client; import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; @@ -29,16 +28,15 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.nio.file.Path; import java.text.SimpleDateFormat; -import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -53,12 +51,11 @@ public class WorkplaceSearchClientV7 implements WorkplaceSearchClient { private static final SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZZZZZ"); private ElasticsearchClient esClient = null; - private Client client = null; + private WPSearchClient wpSearchClient = null; public WorkplaceSearchClientV7(Path config, FsSettings settings) { this.config = config; this.settings = settings; - } @Override @@ -68,7 +65,9 @@ public String compatibleVersion() { @Override public void start() throws IOException { - client = new Client(settings.getWorkplaceSearch().getAccessToken()); + wpSearchClient = new WPSearchClient( + settings.getWorkplaceSearch().getAccessToken(), + settings.getWorkplaceSearch().getContentSourceKey()); esClient = ElasticsearchClientUtil.getInstance(config, settings); esClient.start(); } @@ -140,6 +139,9 @@ public String getDefaultTypeName() { @Override public void index(String index, String id, Doc doc, String pipeline) { Map document = new HashMap<>(); + // Id + document.put("id", id); + // Index content document.put("body", doc.getContent()); @@ -164,10 +166,7 @@ public void index(String index, String id, Doc doc, String pipeline) { document.put("url", "file://" + doc.getPath().getReal()); document.put("path", doc.getPath().getReal()); - - List> documents = Collections.singletonList(document); - - client.indexDocuments(settings.getWorkplaceSearch().getContentSourceKey(), documents); + wpSearchClient.indexDocument(settings.getWorkplaceSearch().getContentSourceKey(), document); } @Override @@ -182,7 +181,7 @@ public void indexSingle(String index, String id, Doc doc) { @Override public void delete(String index, String id) { - client.destroyDocuments(settings.getWorkplaceSearch().getContentSourceKey(), Collections.singletonList(id)); + wpSearchClient.destroyDocument(settings.getWorkplaceSearch().getContentSourceKey(), id); } @Override diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java new file mode 100644 index 000000000..6342c54a9 --- /dev/null +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -0,0 +1,63 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; + +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; +import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assume.assumeFalse; + +/** + * Test Workplace Search HTTP client + */ +public class WPSearchClientIT extends AbstractITCase { + + private static WPSearchClient client; + + @BeforeClass + public static void startClient() { + assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + testWorkplaceAccessToken == null || testWorkplaceKey == null); + + client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey); + } + + @AfterClass + public static void stopClient() throws IOException { + if (client != null) { + client.close(); + } + } + + @Test + public void testSendADocument() { + Map document = new HashMap<>(); + document.put("id", "foo"); + document.put("body", "Foo Bar Baz"); + client.indexDocument(null, document); + } +} diff --git a/pom.xml b/pom.xml index f6e907308..f243aee3c 100644 --- a/pom.xml +++ b/pom.xml @@ -11,13 +11,14 @@ test-framework settings test-documents + beans + 3rdparty elasticsearch-client core integration-tests distribution cli tika - beans crawler rest docs @@ -39,7 +40,6 @@ 7.8.0 6.8.10 ${elasticsearch7.version} - ${elasticsearch7.version}-SNAPSHOT 1.24.1 2.11.1 @@ -463,6 +463,11 @@ fscrawler-elasticsearch-client-v7 2.7-SNAPSHOT + + fr.pilato.elasticsearch.crawler + fscrawler-workplacesearch-client + 2.7-SNAPSHOT + fr.pilato.elasticsearch.crawler fscrawler-cli @@ -504,37 +509,6 @@ 2.7-SNAPSHOT - - com.sstory.workplace.search - workplace-search-sdk - ${workplace.version} - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - - - com.sstory.workplace.search - workplace-search-client - ${workplace.version} - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - - com.fasterxml.jackson.core jackson-core From 32ad3d652ce9fd84b579ce0adfd6bb30a91fec11 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:04:13 +0200 Subject: [PATCH 16/67] Update the internal WPSearch client --- .../thirdparty/wpsearch/WPSearchClient.java | 105 ++++++++++++++---- .../fs/client/v7/WorkplaceSearchClientV7.java | 7 +- .../workplacesearch/WPSearchClientIT.java | 18 ++- 3 files changed, 102 insertions(+), 28 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 4246cbc7e..c8512e1b0 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -20,7 +20,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import javax.ws.rs.NotFoundException; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; @@ -28,24 +31,36 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import java.io.Closeable; -import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Map; +/** + * Workplace Search Java client + * We make it as dumb as possible as it should be replaced in the future by + * an official implementation. + * TODO add a bulk mechanism + */ public class WPSearchClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchClient.class); private final static String CLIENT_NAME = "elastic-workplace-search-java"; private final static String CLIENT_VERSION = "7.8.1"; - private final static String DEFAULT_ENDPOINT = "http://localhost:3002/api/ws/v1/"; + private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; + private final static String DEFAULT_HOST = "http://localhost:3002"; private Client client; private String userAgent; private String endpoint = DEFAULT_ENDPOINT; + private String host = DEFAULT_HOST; private final String accessToken; private final String key; + private String urlForBulkCreate; + private String urlForBulkDestroy; + private String urlForApi; + /** * Create a client * @param accessToken Access Token to use (get it from the Custom API interface) @@ -56,64 +71,93 @@ public WPSearchClient(String accessToken, String key) { this.key = key; } + /** + * If needed we can allow passing a specific user-agent + * @param userAgent User Agent + * @return the current instance + */ public WPSearchClient withUserAgent(String userAgent) { this.userAgent = userAgent; return this; } + /** + * Define a specific endpoint. Defaults to "/api/ws/v1" + * @param endpoint If we need to change the default endpoint + * @return the current instance + */ public WPSearchClient withEndpoint(String endpoint) { this.endpoint = endpoint; return this; } + /** + * Define a specific host. Defaults to "http://localhost:3002" + * @param host If we need to change the default host + * @return the current instance + */ + public WPSearchClient withHost(String host) { + this.host = host; + return this; + } + /** * Start the client */ public void start() { logger.debug("Starting the WPSearchClient"); - client = ClientBuilder.newClient(); + ClientConfig config = new ClientConfig(); + // We need to suppress this so we can do DELETE with body + config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); + client = ClientBuilder.newClient(config); + urlForBulkCreate = "sources/" + key + "/documents/bulk_create"; + urlForBulkDestroy = "sources/" + key + "/documents/bulk_destroy"; + urlForApi = host + endpoint; } /** * Index multiple documents - * @param sourceKey Source key (get it from the Custom API interface) * @param documents Documents to index */ - public void indexDocuments(String sourceKey, List> documents) { - logger.fatal("{}", documents); - String response = post("sources/" + key + "/documents/bulk_create.json", documents, String.class); - logger.fatal("{}", response); + public void indexDocuments(List> documents) { + logger.debug("Adding documents {}", documents); + String response = post(urlForBulkCreate, documents, String.class); + logger.debug("Adding documents response: {}", response); } /** * Index one single document - * @param sourceKey Source key (get it from the Custom API interface) * @param document Document to index */ - public void indexDocument(String sourceKey, Map document) { - + public void indexDocument(Map document) { + indexDocuments(Collections.singletonList(document)); } /** * Delete existing documents - * @param sourceKey Source key (get it from the Custom API interface) - * @param ids List of document ids to delete + * @param ids List of document ids to delete */ - public void destroyDocuments(String sourceKey, List ids) { - + public void destroyDocuments(List ids) { + logger.debug("Removing documents {}", ids); + try { + String response = delete(urlForBulkDestroy, ids, String.class); + logger.debug("Removing documents response: {}", response); + // TODO parse the response to check for errors + } catch (NotFoundException e) { + logger.warn("We did not find the ressources: {}", ids); + } } /** * Delete one document - * @param sourceKey Source key (get it from the Custom API interface) - * @param id Document id to delete + * @param id Document id to delete */ - public void destroyDocument(String sourceKey, String id) { - + public void destroyDocument(String id) { + destroyDocuments(Collections.singletonList(id)); } @Override - public void close() throws IOException { + public void close() { logger.debug("Closing the WPSearchClient"); if (client != null) { client.close(); @@ -122,7 +166,7 @@ public void close() throws IOException { public T post(String path, Object data, Class clazz) { WebTarget target = client - .target(endpoint) + .target(urlForApi) .path(path); Invocation.Builder builder = target @@ -138,4 +182,23 @@ public T post(String path, Object data, Class clazz) { return builder.post(Entity.entity(data, MediaType.APPLICATION_JSON), clazz); } + + public T delete(String path, Object data, Class clazz) { + WebTarget target = client + .target(urlForApi) + .path(path); + + Invocation.Builder builder = target + .request(MediaType.APPLICATION_JSON) + .header("Content-Type", "application/json") + .header("X-Swiftype-Client", CLIENT_NAME) + .header("X-Swiftype-Client-Version", CLIENT_VERSION) + .header("Authorization", "Bearer " + accessToken); + + if (userAgent != null) { + builder.header("User-Agent", userAgent); + } + + return builder.method("DELETE", Entity.entity(data, MediaType.APPLICATION_JSON), clazz); + } } diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index d43cc3170..351c4184c 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -67,7 +67,8 @@ public String compatibleVersion() { public void start() throws IOException { wpSearchClient = new WPSearchClient( settings.getWorkplaceSearch().getAccessToken(), - settings.getWorkplaceSearch().getContentSourceKey()); + settings.getWorkplaceSearch().getContentSourceKey()) + .withHost(settings.getWorkplaceSearch().getServer().decodedUrl()); esClient = ElasticsearchClientUtil.getInstance(config, settings); esClient.start(); } @@ -166,7 +167,7 @@ public void index(String index, String id, Doc doc, String pipeline) { document.put("url", "file://" + doc.getPath().getReal()); document.put("path", doc.getPath().getReal()); - wpSearchClient.indexDocument(settings.getWorkplaceSearch().getContentSourceKey(), document); + wpSearchClient.indexDocument(document); } @Override @@ -181,7 +182,7 @@ public void indexSingle(String index, String id, Doc doc) { @Override public void delete(String index, String id) { - wpSearchClient.destroyDocument(settings.getWorkplaceSearch().getContentSourceKey(), id); + wpSearchClient.destroyDocument(id); } @Override diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index 6342c54a9..5692b4ef3 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -19,13 +19,13 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; +import com.carrotsearch.randomizedtesting.RandomizedTest; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -44,10 +44,11 @@ public static void startClient() { testWorkplaceAccessToken == null || testWorkplaceKey == null); client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey); + client.start(); } @AfterClass - public static void stopClient() throws IOException { + public static void stopClient() { if (client != null) { client.close(); } @@ -56,8 +57,17 @@ public static void stopClient() throws IOException { @Test public void testSendADocument() { Map document = new HashMap<>(); - document.put("id", "foo"); + document.put("id", "testSendADocument"); document.put("body", "Foo Bar Baz"); - client.indexDocument(null, document); + client.indexDocument(document); + } + + @Test + public void testSendAndRemoveADocument() throws InterruptedException { + Map document = new HashMap<>(); + document.put("id", "testSendAndRemoveADocument"); + document.put("title", "To be deleted " + RandomizedTest.randomAsciiLettersOfLength(10)); + client.indexDocument(document); + client.destroyDocument("testSendAndRemoveADocument"); } } From 2685c5ad30a4e2df0dd79427d00cf0ed82f21d9a Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:16:28 +0200 Subject: [PATCH 17/67] Add a comment (TODO) --- .../crawler/fs/thirdparty/wpsearch/WPSearchClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index c8512e1b0..7771be537 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -199,6 +199,7 @@ public T delete(String path, Object data, Class clazz) { builder.header("User-Agent", userAgent); } + // TODO This does not remove the entity. Something to fix in the future... return builder.method("DELETE", Entity.entity(data, MediaType.APPLICATION_JSON), clazz); } } From 3f9d97287b209ca4437bb44b3425217f23e043cd Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:20:08 +0200 Subject: [PATCH 18/67] Fix unit test --- .../crawler/fs/client/v7/ElasticsearchClientV7Test.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java b/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java index 895edec34..da9bb55a1 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7Test.java @@ -24,6 +24,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.framework.AbstractFSCrawlerTestCase; import org.junit.Test; @@ -45,7 +46,10 @@ public void testGetInstance() { @Test public void testGetWorkplaceSearchInstance() { - WorkplaceSearchClient instance = WorkplaceSearchClientUtil.getInstance(null, FsSettings.builder("foo").build()); + WorkplaceSearchClient instance = WorkplaceSearchClientUtil.getInstance(null, + FsSettings.builder("foo") + .setWorkplaceSearch(WorkplaceSearch.builder().build()) + .build()); assertThat(instance, instanceOf(WorkplaceSearchClientV7.class)); } } From bfbb0df3d2ec1262f88a60aacb4aaf9c113b4567 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:35:18 +0200 Subject: [PATCH 19/67] Add a skeleton for search --- .../thirdparty/wpsearch/WPSearchClient.java | 42 ++++++++++--------- .../workplacesearch/WPSearchClientIT.java | 11 +++++ 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 7771be537..767128a95 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -32,6 +32,7 @@ import javax.ws.rs.core.MediaType; import java.io.Closeable; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,6 +61,7 @@ public class WPSearchClient implements Closeable { private String urlForBulkCreate; private String urlForBulkDestroy; private String urlForApi; + private String urlForSearch; /** * Create a client @@ -112,6 +114,7 @@ public void start() { client = ClientBuilder.newClient(config); urlForBulkCreate = "sources/" + key + "/documents/bulk_create"; urlForBulkDestroy = "sources/" + key + "/documents/bulk_destroy"; + urlForSearch = "search"; urlForApi = host + endpoint; } @@ -156,6 +159,18 @@ public void destroyDocument(String id) { destroyDocuments(Collections.singletonList(id)); } + public String search(String query) { + logger.debug("Searching for {}", query); + Map request = new HashMap<>(); + request.put("query", query); + + // TODO Fix this. It needs a OAuth access apparently and we can't just use the existing credentials + // String response = post(urlForSearch, request, String.class); + String response = "Needs to be implemented..."; + logger.warn("Searching response: {}", response); + return response; + } + @Override public void close() { logger.debug("Closing the WPSearchClient"); @@ -164,26 +179,16 @@ public void close() { } } - public T post(String path, Object data, Class clazz) { - WebTarget target = client - .target(urlForApi) - .path(path); - - Invocation.Builder builder = target - .request(MediaType.APPLICATION_JSON) - .header("Content-Type", "application/json") - .header("X-Swiftype-Client", CLIENT_NAME) - .header("X-Swiftype-Client-Version", CLIENT_VERSION) - .header("Authorization", "Bearer " + accessToken); - - if (userAgent != null) { - builder.header("User-Agent", userAgent); - } + private T post(String path, Object data, Class clazz) { + return prepareHttpCall(path).post(Entity.entity(data, MediaType.APPLICATION_JSON), clazz); + } - return builder.post(Entity.entity(data, MediaType.APPLICATION_JSON), clazz); + private T delete(String path, Object data, Class clazz) { + // TODO This does not remove the entity. Something to fix in the future... + return prepareHttpCall(path).method("DELETE", Entity.entity(data, MediaType.APPLICATION_JSON), clazz); } - public T delete(String path, Object data, Class clazz) { + private Invocation.Builder prepareHttpCall(String path) { WebTarget target = client .target(urlForApi) .path(path); @@ -199,7 +204,6 @@ public T delete(String path, Object data, Class clazz) { builder.header("User-Agent", userAgent); } - // TODO This does not remove the entity. Something to fix in the future... - return builder.method("DELETE", Entity.entity(data, MediaType.APPLICATION_JSON), clazz); + return builder; } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index 5692b4ef3..fafbcd376 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -62,6 +62,17 @@ public void testSendADocument() { client.indexDocument(document); } + @Test + public void testSearch() { + Map document = new HashMap<>(); + String uniqueId = RandomizedTest.randomAsciiLettersOfLength(10); + document.put("id", "testSearch"); + document.put("title", "To be searched " + uniqueId); + document.put("body", "Foo Bar Baz " + uniqueId); + client.indexDocument(document); + client.search(uniqueId); + } + @Test public void testSendAndRemoveADocument() throws InterruptedException { Map document = new HashMap<>(); From f3c1fbb889398a84aa70b59a18885217dc8722a7 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:39:11 +0200 Subject: [PATCH 20/67] Fix failing test --- .../crawler/fs/test/integration/AbstractRestITCase.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java index d077c40b4..4da696909 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java @@ -63,6 +63,8 @@ public static void startRestClient() { .register(RestJsonProvider.class) .register(JacksonFeature.class) .build(); + + target = client.target("http://127.0.0.1:" + testRestPort + "/fscrawler"); } @AfterClass From 0262c39923735d0aed100b7ae4d611207aa2fef2 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 16:48:32 +0200 Subject: [PATCH 21/67] Force using `--loop 1` when using Workplace Search --- .../elasticsearch/crawler/fs/cli/FsCrawlerCli.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java index a2ac76f09..7599f51d8 100644 --- a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java +++ b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java @@ -245,6 +245,19 @@ public static void main(String[] args) throws Exception { return; } + // We add a special case here in case someone tries to use workplace search + if (fsSettings.getWorkplaceSearch() != null) { + logger.info("Workplace Search integration is an experimental feature. " + + "As is it is not fully implemented and settings might change in the future."); + if (commands.loop == -1 || commands.loop > 1) { + logger.warn("Workplace Search integration does not support yet watching a directory. " + + "It will be able to run only once and exit. We manually force from --loop {} to --loop 1. " + + "If you want to remove this message next time, please start FSCrawler with --loop 1", + commands.loop); + commands.loop = 1; + } + } + FsCrawlerImpl fsCrawler = new FsCrawlerImpl(configDir, fsSettings, commands.loop, commands.rest); Runtime.getRuntime().addShutdownHook(new FSCrawlerShutdownHook(fsCrawler)); From 23652ab060fdac6a5ca277f06cc9ee578a60ebfe Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 17:17:50 +0200 Subject: [PATCH 22/67] Rename settings and add more documentation --- .../thirdparty/wpsearch/WPSearchClient.java | 2 +- docs/source/admin/fs/wpsearch.rst | 80 +++++++++++++++++++ docs/source/index.rst | 1 + .../fs/client/v7/WorkplaceSearchClientV7.java | 2 +- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 2 +- .../FsCrawlerTestWorkplaceSearchIT.java | 5 +- .../crawler/fs/settings/WorkplaceSearch.java | 32 ++++---- 7 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 docs/source/admin/fs/wpsearch.rst diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 767128a95..eab31ebac 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -49,7 +49,7 @@ public class WPSearchClient implements Closeable { private final static String CLIENT_NAME = "elastic-workplace-search-java"; private final static String CLIENT_VERSION = "7.8.1"; private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; - private final static String DEFAULT_HOST = "http://localhost:3002"; + private final static String DEFAULT_HOST = "http://127.0.0.1:3002"; private Client client; private String userAgent; diff --git a/docs/source/admin/fs/wpsearch.rst b/docs/source/admin/fs/wpsearch.rst new file mode 100644 index 000000000..772bb32f6 --- /dev/null +++ b/docs/source/admin/fs/wpsearch.rst @@ -0,0 +1,80 @@ +.. _wpsearch-settings: + +Workplace Search settings +------------------------- + +.. versionadded:: 2.7 + +FSCrawler can now send documents to `Workplace Search `_. + +.. note:: + + Although this won't be needed in the future, it is still mandatory to have access to the elasticsearch + instance running behind Workplace Search. In this section of the documentation, we will only cover the + specifics for workplace search. Please refer to :ref:`elasticsearch-settings` chapter. + +.. hint:: + + To easily start with Workplace Search, follow the steps: + + * Check-out the source code on `GitHub `_:: + + git clone git@github.com:dadoonet/fscrawler.git + cd fscrawler + cd contrib/docker-compose-workplacesearch + docker-compose up + + This will start Elasticsearch, Kibana (not used) and Workplace Search. + + * Wait for it to start and open http://127.0.0.1:3002/ws. + * Enter ``enterprise_search`` as the login and ``changeme`` as the password. + * Click on "Add sources" button and choose `Custom API `_. + * Name it ``fscrawler`` and click on "Create Custom API Source" button. + * Copy the "Access Token" value. We will mention it as ``ACCESS_TOKEN`` for the rest of this documentation. + * Copy the "Key" value. We will mention it as ``KEY`` for the rest of this documentation. + + .. image:: /_static/wpsearch/fscrawler-custom-source.png + +Here is a list of Workplace Search settings (under ``workplace_search.`` prefix)`: + ++----------------------------------+---------------------------+---------------------------------+ +| Name | Default value | Documentation | ++==================================+===========================+=================================+ +| ``workplace_search.access_token``| None (Must be set) | `Keys`_ | ++----------------------------------+---------------------------+---------------------------------+ +| ``workplace_search.key`` | None (Must be set) | `Keys`_ | ++----------------------------------+---------------------------+---------------------------------+ +| ``workplace_search.server`` | ``http://127.0.0.1:3002`` | `Server`_ | ++----------------------------------+---------------------------+---------------------------------+ + + +Keys +^^^^ + +Once you have created your Custom API and have the ``ACCESS_TOKEN`` and ``KEY``, you can add to your existing +FSCrawler configuration file: + +.. code:: yaml + + name: "test" + workplace_search: + access_token: "ACCESS_TOKEN" + key: "KEY" + +Server +^^^^^^ + +When using Workplace Search, FSCrawler will by default connect to ``http://127.0.0.1:3002`` +which is the default when running a local node on your machine. + +Of course, in production, you would probably change this and connect to +a production cluster: + +.. code:: yaml + + name: "test" + workplace_search: + access_token: "ACCESS_TOKEN" + key: "KEY" + server: "http://wpsearch.mycompany.com:3002" + diff --git a/docs/source/index.rst b/docs/source/index.rst index 0e399a65f..ee0d19b57 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -57,6 +57,7 @@ This crawler helps to index binary documents such as PDF, Open Office, MS Office admin/fs/local-fs admin/fs/ssh admin/fs/elasticsearch + admin/fs/wpsearch admin/fs/rest diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 351c4184c..bce4f81fe 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -67,7 +67,7 @@ public String compatibleVersion() { public void start() throws IOException { wpSearchClient = new WPSearchClient( settings.getWorkplaceSearch().getAccessToken(), - settings.getWorkplaceSearch().getContentSourceKey()) + settings.getWorkplaceSearch().getKey()) .withHost(settings.getWorkplaceSearch().getServer().decodedUrl()); esClient = ElasticsearchClientUtil.getInstance(config, settings); esClient.start(); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 52aabdaa5..975fdad87 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -93,7 +93,7 @@ public static void startCrawling() throws Exception { .build()) .setWorkplaceSearch(WorkplaceSearch.builder() .setAccessToken(testWorkplaceAccessToken) - .setContentSourceKey(testWorkplaceKey) + .setKey(testWorkplaceKey) .build()) .build(); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index d3778c705..59dcbfac5 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -29,11 +29,8 @@ import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; -import org.hamcrest.Matcher; -import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; @@ -64,7 +61,7 @@ public void overrideDocumentService() throws IOException { .setUsername("elastic").setPassword("changeme").build()) .setWorkplaceSearch(WorkplaceSearch.builder() .setAccessToken(testWorkplaceAccessToken) - .setContentSourceKey(testWorkplaceKey) + .setKey(testWorkplaceKey) .build()) .build(); documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java index f489fde31..b6b2364e9 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java @@ -27,19 +27,19 @@ public class WorkplaceSearch { protected static final Logger logger = LogManager.getLogger(WorkplaceSearch.class); - public static final ServerUrl SERVER_DEFAULT = new ServerUrl("http://localhost:3002"); + public static final ServerUrl SERVER_DEFAULT = new ServerUrl("http://127.0.0.1:3002"); private ServerUrl server = SERVER_DEFAULT; - private String contentSourceKey; + private String key; private String accessToken; public WorkplaceSearch() { } - public WorkplaceSearch(ServerUrl server, String contentSourceKey, String accessToken) { + public WorkplaceSearch(ServerUrl server, String key, String accessToken) { this.server = server; - this.contentSourceKey = contentSourceKey; + this.key = key; this.accessToken = accessToken; } @@ -55,12 +55,12 @@ public void setServer(ServerUrl server) { this.server = server; } - public String getContentSourceKey() { - return contentSourceKey; + public String getKey() { + return key; } - public void setContentSourceKey(String contentSourceKey) { - this.contentSourceKey = contentSourceKey; + public void setKey(String key) { + this.key = key; } public String getAccessToken() { @@ -73,7 +73,7 @@ public void setAccessToken(String accessToken) { public static class Builder { private ServerUrl server = SERVER_DEFAULT; - private String contentSourceKey; + private String key; private String accessToken; public Builder setServer(ServerUrl server) { @@ -81,8 +81,8 @@ public Builder setServer(ServerUrl server) { return this; } - public Builder setContentSourceKey(String contentSourceKey) { - this.contentSourceKey = contentSourceKey; + public Builder setKey(String key) { + this.key = key; return this; } @@ -92,7 +92,7 @@ public Builder setAccessToken(String accessToken) { } public WorkplaceSearch build() { - return new WorkplaceSearch(server, contentSourceKey, accessToken); + return new WorkplaceSearch(server, key, accessToken); } } @@ -102,19 +102,19 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; WorkplaceSearch that = (WorkplaceSearch) o; return Objects.equals(server, that.server) && - Objects.equals(contentSourceKey, that.contentSourceKey) && + Objects.equals(key, that.key) && Objects.equals(accessToken, that.accessToken); } @Override public int hashCode() { - return Objects.hash(server, contentSourceKey, accessToken); + return Objects.hash(server, key, accessToken); } @Override public String toString() { - return "EnterpriseSearch{" + "server=" + server + - ", contentSourceKey='" + contentSourceKey + '\'' + + return "WorkplaceSearch{" + "server=" + server + + ", key='" + key + '\'' + ", accessToken='" + accessToken + '\'' + '}'; } From 8b6c5aa4a07a74324c7764b9fd56d3a92f5b79c5 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 17:19:21 +0200 Subject: [PATCH 23/67] Do not test WPSearch by default as it needs credentials --- .../crawler/fs/test/integration/AbstractITCase.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 1f0b3537f..56960e409 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -104,8 +104,10 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); - protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token", "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); - protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key", "5f284ee198503ef853db67a8"); + protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token"); + // , "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); + protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key"); + // , "5f284ee198503ef853db67a8"); protected static Elasticsearch elasticsearchWithSecurity; protected static FsCrawlerManagementService managementService; From 35c70063e0ff27483b2770e29be13be554704a0a Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 17:28:06 +0200 Subject: [PATCH 24/67] Fix license headers --- .../fs/thirdparty/wpsearch/WPSearchClient.java | 15 ++++++++------- .../fs/service/FsCrawlerDocumentService.java | 14 +++++++------- ...FsCrawlerDocumentServiceElasticsearchImpl.java | 14 +++++++------- ...CrawlerDocumentServiceWorkplaceSearchImpl.java | 14 +++++++------- .../fs/service/FsCrawlerManagementService.java | 14 +++++++------- ...CrawlerManagementServiceElasticsearchImpl.java | 14 +++++++------- .../FsCrawlerImplAllDocumentsIT.java | 1 - 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index eab31ebac..823403436 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; import org.apache.logging.log4j.LogManager; diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java index ada07ffb1..39a3d737c 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java index 418d5d4ee..61ab21019 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java index ac9198f6b..565c2878e 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java index c313f67e8..5137304c3 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementService.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java index 08483abdc..1cc7bfe57 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java @@ -1,11 +1,11 @@ /* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch 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 + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 * diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java index 732f27410..f084b4d84 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java @@ -31,7 +31,6 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; -import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceElasticsearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; From b7c138722d93de43b3db44c2e690f52fe9492c8b Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 17:36:53 +0200 Subject: [PATCH 25/67] Fix failing test --- .../elasticsearch/FsCrawlerImplAllDocumentsIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java index f084b4d84..1694671d5 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerImplAllDocumentsIT.java @@ -33,6 +33,7 @@ import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; @@ -54,10 +55,9 @@ /** * Test all type of documents we have */ -public class FsCrawlerImplAllDocumentsIT extends AbstractITCase { +public class FsCrawlerImplAllDocumentsIT extends AbstractFsCrawlerITCase { private static FsCrawlerImpl crawler = null; - private static FsCrawlerDocumentService documentService = null; @BeforeClass public static void startCrawling() throws Exception { From 0d873b3c6abee4fc0ff2ec7b3cb63b63a5fa40d3 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 18:22:02 +0200 Subject: [PATCH 26/67] Fix failing tests --- ...lerDocumentServiceWorkplaceSearchImpl.java | 5 ++-- ...sCrawlerIllegalConfigurationException.java | 29 +++++++++++++++++++ ...wlerTestWorkplaceSearchAllDocumentsIT.java | 25 ++++++++++------ .../FsCrawlerTestWorkplaceSearchIT.java | 15 +++++++--- 4 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/FsCrawlerIllegalConfigurationException.java diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java index 565c2878e..71d33d79f 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceWorkplaceSearchImpl.java @@ -23,6 +23,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClientUtil; +import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerIllegalConfigurationException; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -36,11 +37,11 @@ public class FsCrawlerDocumentServiceWorkplaceSearchImpl implements FsCrawlerDoc private final WorkplaceSearchClient client; - public FsCrawlerDocumentServiceWorkplaceSearchImpl(Path config, FsSettings settings) { + public FsCrawlerDocumentServiceWorkplaceSearchImpl(Path config, FsSettings settings) throws RuntimeException { this.client = WorkplaceSearchClientUtil.getInstance(config, settings); if (client == null) { - throw new RuntimeException("As we can not find an existing Workplace Search client for elastic stack before 7.8," + + throw new FsCrawlerIllegalConfigurationException("As we can not find an existing Workplace Search client for elastic stack before 7.8," + " you can't define workplace settings in your configuration. FSCrawler will refuse to start."); } } diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/FsCrawlerIllegalConfigurationException.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/FsCrawlerIllegalConfigurationException.java new file mode 100644 index 000000000..dd164d1c1 --- /dev/null +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/FsCrawlerIllegalConfigurationException.java @@ -0,0 +1,29 @@ +/* + * Licensed to David Pilato under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.framework; + +/** + * In case we need to throw a Runtime Exception when we detect something wrong + */ +public class FsCrawlerIllegalConfigurationException extends RuntimeException { + public FsCrawlerIllegalConfigurationException(String s) { + super(s); + } +} diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 975fdad87..78cbaa528 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerIllegalConfigurationException; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; @@ -34,6 +35,7 @@ import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; +import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Test; @@ -97,19 +99,24 @@ public static void startCrawling() throws Exception { .build()) .build(); - documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); - documentService.start(); + try { + documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + documentService.start(); - staticLogger.info(" -> Removing existing index [.ent-search-engine-*]"); - documentService.getClient().deleteIndex(".ent-search-engine-*"); + staticLogger.info(" -> Removing existing index [.ent-search-engine-*]"); + documentService.getClient().deleteIndex(".ent-search-engine-*"); - staticLogger.info(" --> starting crawler in [{}] which contains [{}] files", testResourceTarget, numFiles); + staticLogger.info(" --> starting crawler in [{}] which contains [{}] files", testResourceTarget, numFiles); - crawler = new FsCrawlerImpl(metadataDir, fsSettings, LOOP_INFINITE, false); - crawler.start(); + crawler = new FsCrawlerImpl(metadataDir, fsSettings, LOOP_INFINITE, false); + crawler.start(); - // We wait until we have all docs - countTestHelper(new ESSearchRequest().withIndex(".ent-search-engine-*"), numFiles, null, TimeValue.timeValueMinutes(5)); + // We wait until we have all docs + countTestHelper(new ESSearchRequest().withIndex(".ent-search-engine-*"), numFiles, null, TimeValue.timeValueMinutes(5)); + } catch (FsCrawlerIllegalConfigurationException e) { + documentService = oldDocumentService; + Assume.assumeNoException("We don't have a compatible client for this version of the stack.", e); + } } @AfterClass diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 59dcbfac5..fb9088381 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -21,6 +21,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerIllegalConfigurationException; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; @@ -30,6 +31,7 @@ import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; @@ -64,11 +66,16 @@ public void overrideDocumentService() throws IOException { .setKey(testWorkplaceKey) .build()) .build(); - documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); - documentService.start(); + try { + documentService = new FsCrawlerDocumentServiceWorkplaceSearchImpl(metadataDir, fsSettings); + documentService.start(); - logger.info(" -> Removing existing index [.ent-search-engine-*]"); - documentService.getClient().deleteIndex(".ent-search-engine-*"); + logger.info(" -> Removing existing index [.ent-search-engine-*]"); + documentService.getClient().deleteIndex(".ent-search-engine-*"); + } catch (FsCrawlerIllegalConfigurationException e) { + documentService = oldDocumentService; + Assume.assumeNoException("We don't have a compatible client for this version of the stack.", e); + } } @After From 1244127c0fb8585534a7d19eabd90eb12db5f186 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 18:51:33 +0200 Subject: [PATCH 27/67] Fix failing tests --- .../crawler/fs/client/ElasticsearchClient.java | 4 ++-- .../fs/client/ElasticsearchClientDummyBase.java | 2 +- .../crawler/fs/client/v6/ElasticsearchClientV6.java | 13 +++---------- .../crawler/fs/client/v7/ElasticsearchClientV7.java | 6 +++--- .../fs/client/v7/WorkplaceSearchClientV7.java | 4 ++-- .../elasticsearch/ElasticsearchClientIT.java | 4 ++-- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java index ffc34ff8d..49044d6ad 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java +++ b/elasticsearch-client/elasticsearch-client-base/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClient.java @@ -120,9 +120,9 @@ public interface ElasticsearchClient extends Closeable { * Index a document (for test purposes only) * @param index Index name * @param id Document ID - * @param doc Document to index + * @param json Document to index */ - void indexSingle(String index, String id, Doc doc) throws IOException; + void indexSingle(String index, String id, String json) throws IOException; /** * Delete a document using a BulkProcessor behind the scenes diff --git a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java index b732b2ed4..839255754 100644 --- a/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java +++ b/elasticsearch-client/elasticsearch-client-base/src/test/java/fr/pilato/elasticsearch/crawler/fs/client/ElasticsearchClientDummyBase.java @@ -87,7 +87,7 @@ public void indexRawJson(String index, String id, String json, String pipeline) } @Override - public void indexSingle(String index, String id, Doc doc) { + public void indexSingle(String index, String id, String json) { // Testing purpose only } diff --git a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java index c4e7ad67b..bf55058c6 100644 --- a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java +++ b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java @@ -94,14 +94,8 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; -import java.util.function.Supplier; - -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FILE; -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.INDEX_SETTINGS_FOLDER_FILE; -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.extractMajorVersion; -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.extractMinorVersion; -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.isNullOrEmpty; -import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.readJsonFile; + +import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.*; import static org.elasticsearch.action.support.IndicesOptions.LENIENT_EXPAND_OPEN; /** @@ -385,8 +379,7 @@ public void indexRawJson(String index, String id, String json, String pipeline) } @Override - public void indexSingle(String index, String id, Doc doc) throws IOException { - String json = DocParser.toJson(doc); + public void indexSingle(String index, String id, String json) throws IOException { logger.trace("JSon indexed : {}", json); IndexRequest request = new IndexRequest(index, getDefaultTypeName(), id); request.source(json, XContentType.JSON); diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java index edf452efe..c68d58772 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java @@ -371,9 +371,9 @@ public void indexRawJson(String index, String id, String json, String pipeline) } @Override - public void indexSingle(String index, String id, Doc doc) throws IOException { - logger.trace("JSon indexed : {}", doc.getContent()); - client.index(new IndexRequest(index).id(id).source(doc.getContent(), XContentType.JSON), RequestOptions.DEFAULT); + public void indexSingle(String index, String id, String json) throws IOException { + logger.trace("JSon indexed : {}", json); + client.index(new IndexRequest(index).id(id).source(json, XContentType.JSON), RequestOptions.DEFAULT); } @Override diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index bce4f81fe..41beaaa70 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -176,8 +176,8 @@ public void indexRawJson(String index, String id, String json, String pipeline) } @Override - public void indexSingle(String index, String id, Doc doc) { - index(index, id, doc, null); + public void indexSingle(String index, String id, String json) { + throw new RuntimeException("Not supported by the workplace search client. Should not be called."); } @Override diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java index c9cf0898f..46608504d 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java @@ -100,8 +100,8 @@ public void testSearch() throws IOException { esClient.createIndex(getCrawlerName(), false, null); esClient.waitForHealthyIndex(getCrawlerName()); - esClient.indexSingle(getCrawlerName(), "1", new Doc("{ \"foo\": { \"bar\": \"bar\" } }")); - esClient.indexSingle(getCrawlerName(), "2", new Doc("{ \"foo\": { \"bar\": \"baz\" } }")); + esClient.indexSingle(getCrawlerName(), "1", "{ \"foo\": { \"bar\": \"bar\" } }"); + esClient.indexSingle(getCrawlerName(), "2", "{ \"foo\": { \"bar\": \"baz\" } }"); esClient.refresh(getCrawlerName()); From fc863daddbab45712bb9135c355a89524e1565bc Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 19:02:16 +0200 Subject: [PATCH 28/67] Fix NPE --- .../crawler/fs/client/v7/WorkplaceSearchClientV7.java | 1 + 1 file changed, 1 insertion(+) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 41beaaa70..8b1554eeb 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -69,6 +69,7 @@ public void start() throws IOException { settings.getWorkplaceSearch().getAccessToken(), settings.getWorkplaceSearch().getKey()) .withHost(settings.getWorkplaceSearch().getServer().decodedUrl()); + wpSearchClient.start(); esClient = ElasticsearchClientUtil.getInstance(config, settings); esClient.start(); } From c02250d20449d1272f7df2511dd48df48739592d Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 4 Aug 2020 19:06:07 +0200 Subject: [PATCH 29/67] Missing call to close the Http Client --- .../crawler/fs/client/v7/WorkplaceSearchClientV7.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 8b1554eeb..b09ef0542 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -191,6 +191,9 @@ public void close() throws IOException { if (esClient != null) { esClient.close(); } + if (wpSearchClient != null) { + wpSearchClient.close(); + } } public void createIndices() throws Exception { From a97cc10db6b029db48fb7b472c89fed7330ab095 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 11:36:57 +0200 Subject: [PATCH 30/67] Fix typo --- .../crawler/fs/client/v7/WorkplaceSearchClientV7.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index b09ef0542..73d6a4d79 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -147,7 +147,7 @@ public void index(String index, String id, Doc doc, String pipeline) { // Index content document.put("body", doc.getContent()); - // Index main meta data + // Index main metadata document.put("title", doc.getMeta().getTitle()); document.put("author", doc.getMeta().getAuthor()); document.put("keywords", doc.getMeta().getKeywords()); From 8c56b56d0f54007f7188efab12545aee5e9ad918 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 14:10:40 +0200 Subject: [PATCH 31/67] Add support for running tests against Cloud And associated documentation --- docs/source/admin/fs/wpsearch.rst | 29 ++++++++++++++++++- docs/source/dev/build.rst | 7 +++++ .../fs/test/integration/AbstractITCase.java | 4 +-- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 2 ++ .../FsCrawlerTestWorkplaceSearchIT.java | 2 ++ .../workplacesearch/WPSearchClientIT.java | 3 +- pom.xml | 6 ++++ 7 files changed, 49 insertions(+), 4 deletions(-) diff --git a/docs/source/admin/fs/wpsearch.rst b/docs/source/admin/fs/wpsearch.rst index 772bb32f6..beb1d2ab4 100644 --- a/docs/source/admin/fs/wpsearch.rst +++ b/docs/source/admin/fs/wpsearch.rst @@ -15,7 +15,7 @@ FSCrawler can now send documents to `Workplace Search `_:: @@ -78,3 +78,30 @@ a production cluster: key: "KEY" server: "http://wpsearch.mycompany.com:3002" +Running on Cloud +^^^^^^^^^^^^^^^^ + +The easiest way to get started is to deploy Enterprise Search on +`Elastic Cloud Service `_. + +Then you can define the following: + +.. code:: yaml + + name: "test" + elasticsearch: + username: "elastic" + password: "PASSWORD" + nodes: + - cloud_id: "CLOUD_ID" + workplace_search: + access_token: "ACCESS_TOKEN" + key: "KEY" + server: "https://XYZ.ent-search.ZONE.CLOUD_PROVIDER.elastic-cloud.com" + +.. note:: + + Change the ``PASSWORD``, ``CLOUD_ID`` by values coming from the `Elastic Console `_. + And get the ``ACCESS_TOKEN`` and ``KEY`` from your Enterprise Search deployment once you have created the + Custom API source as seen previously. + diff --git a/docs/source/dev/build.rst b/docs/source/dev/build.rst index 949b89d62..13fdb9dc2 100644 --- a/docs/source/dev/build.rst +++ b/docs/source/dev/build.rst @@ -155,7 +155,14 @@ Enterprise Search and create manually the custom source as there is no API yet t .. image:: /_static/wpsearch/fscrawler-display-settings-2.png +To run Workplace Search tests against another instance (ie. running on +`Enterprise Search service by Elastic `_, +you can also use ``tests.workplace.url`` to set where Enterprise Search is running:: + mvn verify -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 \ + -Dtests.workplace.url=https://XYZ.ent-search.ZONE.CLOUD_PROVIDER.elastic-cloud.com \ + -Dtests.workplace.access_token=ACCESS_TOKEN \ + -Dtests.workplace.key=KEY Tests options """"""""""""" diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 56960e409..c046580c2 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -95,6 +95,7 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private static final Path DEFAULT_RESOURCES = Paths.get(getUrl("samples", "common")); private final static String DEFAULT_TEST_CLUSTER_URL = "http://127.0.0.1:9200"; + private final static String DEFAULT_TEST_WPSEARCH_URL = "http://127.0.0.1:3002"; private final static String DEFAULT_USERNAME = "elastic"; private final static String DEFAULT_PASSWORD = "changeme"; private final static Integer DEFAULT_TEST_REST_PORT = 8080; @@ -105,9 +106,8 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token"); - // , "8ac946cb85f81b281255cddb5af266fe64b5c154a5c468692e005e165daab198"); protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key"); - // , "5f284ee198503ef853db67a8"); + protected final static String testWorkplaceUrl = System.getProperty("tests.workplace.url", DEFAULT_TEST_WPSEARCH_URL); protected static Elasticsearch elasticsearchWithSecurity; protected static FsCrawlerManagementService managementService; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 78cbaa528..b835fcb5c 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -31,6 +31,7 @@ import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentServiceWorkplaceSearchImpl; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.apache.tika.parser.external.ExternalParser; @@ -94,6 +95,7 @@ public static void startCrawling() throws Exception { .setLangDetect(true) .build()) .setWorkplaceSearch(WorkplaceSearch.builder() + .setServer(new ServerUrl(testWorkplaceUrl)) .setAccessToken(testWorkplaceAccessToken) .setKey(testWorkplaceKey) .build()) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index fb9088381..60e0c15d3 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -28,6 +28,7 @@ import fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch; import fr.pilato.elasticsearch.crawler.fs.settings.Fs; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; +import fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.After; @@ -62,6 +63,7 @@ public void overrideDocumentService() throws IOException { .addNode(NODE_DEFAULT) .setUsername("elastic").setPassword("changeme").build()) .setWorkplaceSearch(WorkplaceSearch.builder() + .setServer(new ServerUrl(testWorkplaceUrl)) .setAccessToken(testWorkplaceAccessToken) .setKey(testWorkplaceKey) .build()) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index fafbcd376..9593382af 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -43,7 +43,8 @@ public static void startClient() { assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", testWorkplaceAccessToken == null || testWorkplaceKey == null); - client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey); + client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey) + .withHost(testWorkplaceUrl); client.start(); } diff --git a/pom.xml b/pom.xml index f243aee3c..503e58c62 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,9 @@ elastic changeme + + + 8080 @@ -201,6 +204,9 @@ ${tests.cluster.cloud_id} ${tests.cluster.user} ${tests.cluster.pass} + ${tests.workplace.url} + ${tests.workplace.access_token} + ${tests.workplace.key} ${tests.rest.port} From d2b30df5ddc2522cecb191c778a324cd3e60a4df Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 15:18:32 +0200 Subject: [PATCH 32/67] Fix failing test --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 503e58c62..33f9e957c 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ elastic changeme - + http://127.0.0.1:3002 8080 From 1d2257f00aa1f07da6b2e08021370aad12d36a32 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 16:29:13 +0200 Subject: [PATCH 33/67] Fix failing test --- .../workplacesearch/FsCrawlerTestWorkplaceSearchIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 60e0c15d3..75256e8e8 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -55,6 +55,9 @@ public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { @Before public void overrideDocumentService() throws IOException { + assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + testWorkplaceAccessToken == null || testWorkplaceKey == null); + oldDocumentService = documentService; Fs fs = startCrawlerDefinition().build(); fsSettings = FsSettings.builder(getCrawlerName()) @@ -88,9 +91,6 @@ public void resetDocumentService() throws IOException { @Test public void testWorkplaceSearch() throws Exception { - assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - testWorkplaceAccessToken == null || testWorkplaceKey == null); - startCrawler(getCrawlerName(), fsSettings, TimeValue.timeValueSeconds(10)); ESSearchResponse searchResponse = countTestHelper(new ESSearchRequest().withIndex(getCrawlerName()), 1L, null); From 4daec540f23d0369572834859244807190bcd3a2 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 17:08:12 +0200 Subject: [PATCH 34/67] Fix failing test --- .../crawler/fs/test/integration/AbstractITCase.java | 11 +++++++++++ .../FsCrawlerTestWorkplaceSearchAllDocumentsIT.java | 3 +-- .../FsCrawlerTestWorkplaceSearchIT.java | 3 +-- .../integration/workplacesearch/WPSearchClientIT.java | 3 +-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index c046580c2..aea13fcde 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -65,6 +65,7 @@ import static org.hamcrest.Matchers.not; import static org.junit.Assert.fail; import static org.junit.Assume.assumeThat; +import static org.junit.Assume.assumeTrue; /** * Integration tests expect to have an elasticsearch instance running on http://127.0.0.1:9200. @@ -447,4 +448,14 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx } }); } + + /** + * This method will ignore tests if Workplace Settings are not set. + */ + protected static void checkWorkplaceSettings() { + boolean isWorkplaceAccessTokenSet = testWorkplaceAccessToken != null && !testWorkplaceAccessToken.isEmpty(); + boolean isWorkplaceKeySet = testWorkplaceKey != null && !testWorkplaceKey.isEmpty(); + assumeTrue("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", + isWorkplaceAccessTokenSet && isWorkplaceKeySet); + } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index b835fcb5c..677c2191f 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -64,8 +64,7 @@ public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractFsCrawle @BeforeClass public static void startCrawling() throws Exception { - assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - testWorkplaceAccessToken == null || testWorkplaceKey == null); + checkWorkplaceSettings(); Path testResourceTarget = rootTmpDir.resolve("resources").resolve("documents"); if (Files.notExists(testResourceTarget)) { diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 75256e8e8..a93235e83 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -55,8 +55,7 @@ public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { @Before public void overrideDocumentService() throws IOException { - assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - testWorkplaceAccessToken == null || testWorkplaceKey == null); + checkWorkplaceSettings(); oldDocumentService = documentService; Fs fs = startCrawlerDefinition().build(); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index 9593382af..aa89a77b3 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -40,8 +40,7 @@ public class WPSearchClientIT extends AbstractITCase { @BeforeClass public static void startClient() { - assumeFalse("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - testWorkplaceAccessToken == null || testWorkplaceKey == null); + checkWorkplaceSettings(); client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey) .withHost(testWorkplaceUrl); From fb5a4eeeb3eb76cf4301abd9d2dcd7c0a64736af Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 5 Aug 2020 17:10:24 +0200 Subject: [PATCH 35/67] Fix imports --- .../FsCrawlerTestWorkplaceSearchAllDocumentsIT.java | 1 - .../workplacesearch/FsCrawlerTestWorkplaceSearchIT.java | 2 -- .../fs/test/integration/workplacesearch/WPSearchClientIT.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 677c2191f..cba45c43e 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -51,7 +51,6 @@ import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; /** diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index a93235e83..b585b1c41 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -42,8 +42,6 @@ import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.Assume.assumeFalse; -import static org.junit.Assume.assumeThat; /** * Test workplace search diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index aa89a77b3..5016b9c16 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -29,8 +29,6 @@ import java.util.HashMap; import java.util.Map; -import static org.junit.Assume.assumeFalse; - /** * Test Workplace Search HTTP client */ From 728eec25ca684f352817e8e196d165b6cbc56fa4 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 6 Aug 2020 15:30:03 +0200 Subject: [PATCH 36/67] Add a BulkProcessor mechanism for WPSearch Also fix failing tests when running on cloud Also fix an issue with cloud ids Replace the `file://` url by a temporary `http://fscrawler-repository` URL. This will be configurable in the future. --- .gitignore | 1 + .../fs/thirdparty/wpsearch/Engine.java | 34 +++ ...sCrawlerAdvancedBulkProcessorListener.java | 60 ++++++ .../wpsearch/FsCrawlerBulkProcessor.java | 204 ++++++++++++++++++ .../wpsearch/FsCrawlerBulkRequest.java | 40 ++++ .../wpsearch/FsCrawlerBulkResponse.java | 142 ++++++++++++ .../wpsearch/FsCrawlerOperation.java | 23 ++ .../FsCrawlerRetryBulkProcessorListener.java | 63 ++++++ .../FsCrawlerSimpleBulkProcessorListener.java | 64 ++++++ .../wpsearch/WPSearchBulkRequest.java | 23 ++ .../wpsearch/WPSearchBulkResponse.java | 31 +++ .../thirdparty/wpsearch/WPSearchClient.java | 60 ++++-- .../thirdparty/wpsearch/WPSearchEngine.java | 52 +++++ .../wpsearch/WPSearchOperation.java | 42 ++++ docs/source/dev/build.rst | 3 + .../fs/client/v6/ElasticsearchClientV6.java | 2 +- .../fs/client/v7/ElasticsearchClientV7.java | 2 +- .../fs/client/v7/WorkplaceSearchClientV7.java | 4 +- .../fs/test/integration/AbstractITCase.java | 6 +- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 13 +- .../FsCrawlerTestWorkplaceSearchIT.java | 18 +- .../workplacesearch/WPSearchClientIT.java | 24 ++- .../crawler/fs/settings/ServerUrl.java | 4 +- 23 files changed, 860 insertions(+), 55 deletions(-) create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java diff --git a/.gitignore b/.gitignore index 4db33f382..cfb28020e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ target /.project .idea *.iml +/.run diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java new file mode 100644 index 000000000..406108d39 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java @@ -0,0 +1,34 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +/** + * Defines an Engine which is responsible to execute a bulk operation + */ +public interface Engine, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse> { + /** + * Actually execute the Bulk Request behind the scene + * @param request The request to execute + * @return The outcome + */ + Res bulk(Req request); +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java new file mode 100644 index 000000000..b399b4680 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java @@ -0,0 +1,60 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * This Listener exposes the number of successive errors that might have seen previously. So the caller can if needed slow down + * a bit the injection. + * A retry mechanism is implemented in RetryBulkProcessorListener + * @see FsCrawlerRetryBulkProcessorListener + */ +public class FsCrawlerAdvancedBulkProcessorListener< + O extends FsCrawlerOperation, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse + > extends FsCrawlerSimpleBulkProcessorListener { + private static final Logger logger = LogManager.getLogger(FsCrawlerAdvancedBulkProcessorListener.class); + + private final AtomicInteger successiveErrors = new AtomicInteger(0); + + public int getErrors() { + return successiveErrors.get(); + } + + @Override + public void afterBulk(long executionId, Req request, Res response) { + super.afterBulk(executionId, request, response); + if (response.hasFailures()) { + int previousErrors = successiveErrors.getAndIncrement(); + logger.warn("Throttling is activated. Got [{}] successive errors so far.", previousErrors); + } else { + int previousErrors = successiveErrors.get(); + if (previousErrors > 0) { + successiveErrors.set(0); + logger.debug("We are back to normal behavior after [{}] errors. \\o/", previousErrors); + } + } + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java new file mode 100644 index 000000000..852e11e82 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java @@ -0,0 +1,204 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Supplier; + +/** + * Bulk processor + */ +public class FsCrawlerBulkProcessor< + O extends FsCrawlerOperation, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse + > implements Closeable { + + private static final Logger logger = LogManager.getLogger(FsCrawlerBulkProcessor.class); + + private final int bulkActions; + private final Listener listener; + private final Engine engine; + private Req bulkRequest; + private final Supplier requestSupplier; + private final ScheduledExecutorService executor; + private volatile boolean closed = false; + private final AtomicLong executionIdGen = new AtomicLong(); + + public FsCrawlerBulkProcessor(Engine engine, + Listener listener, + int bulkActions, + TimeValue flushInterval, + Supplier requestSupplier) { + this.engine = engine; + this.listener = listener; + this.bulkActions = bulkActions; + this.requestSupplier = requestSupplier; + this.bulkRequest = requestSupplier.get(); + this.listener.setBulkProcessor(this); + + if (flushInterval != null) { + executor = Executors.newScheduledThreadPool(1); + executor.scheduleWithFixedDelay(this::executeWhenNeeded, 0, flushInterval.millis(), TimeUnit.MILLISECONDS); + } else { + executor = null; + } + } + + @Override + public void close() throws IOException { + try { + internalClose(); + } catch (InterruptedException e) { + throw new IOException(e); + } + } + + private void internalClose() throws InterruptedException { + if (closed) { + return; + } + closed = true; + + if (executor != null) { + logger.debug("Closing BulkProcessor"); + executor.shutdown(); + executor.awaitTermination(10, TimeUnit.SECONDS); + logger.debug("BulkProcessor is now closed"); + } + + if (bulkRequest.numberOfActions() > 0) { + logger.debug("Executing [{}] remaining actions", bulkRequest.numberOfActions()); + execute(); + } + } + + /** + * Add a request to the processor + * @param request request to add + * @return this so we can link methods. + */ + public synchronized FsCrawlerBulkProcessor add(O request) { + ensureOpen(); + bulkRequest.add(request); + executeIfNeeded(); + return this; + } + + private void ensureOpen() { + if (closed) { + throw new IllegalStateException("bulk process already closed"); + } + } + + private void executeIfNeeded() { + ensureOpen(); + if (isOverTheLimit()) { + execute(); + } + } + + private void executeWhenNeeded() { + ensureOpen(); + if (bulkRequest.numberOfActions() > 0) { + execute(); + } + } + + private void execute() { + final Req bulkRequest = this.bulkRequest; + this.bulkRequest = requestSupplier.get(); + final long executionId = executionIdGen.incrementAndGet(); + + // execute in a blocking fashion... + boolean afterCalled = false; + try { + listener.beforeBulk(executionId, bulkRequest); + Res bulkItemResponses = engine.bulk(bulkRequest); + afterCalled = true; + listener.afterBulk(executionId, bulkRequest, bulkItemResponses); + } catch (Exception e) { + if (!afterCalled) { + listener.afterBulk(executionId, bulkRequest, e); + } + } + } + + private boolean isOverTheLimit() { + return (bulkActions != -1) && (bulkRequest.numberOfActions() >= bulkActions); + } + + public Listener getListener() { + return listener; + } + + public static class Builder, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse> { + + private int bulkActions; + private TimeValue flushInterval; + private final Engine engine; + private final Listener listener; + private final Supplier requestSupplier; + + public Builder(Engine engine, Listener listener, Supplier requestSupplier) { + this.engine = engine; + this.listener = listener; + this.requestSupplier = requestSupplier; + } + + public Builder setBulkActions(int bulkActions) { + this.bulkActions = bulkActions; + return this; + } + + public Builder setFlushInterval(TimeValue flushInterval) { + this.flushInterval = flushInterval; + return this; + } + + public FsCrawlerBulkProcessor build() { + return new FsCrawlerBulkProcessor<>(engine, listener, bulkActions, flushInterval, requestSupplier); + } + } + + public interface Listener, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse> { + + void beforeBulk(long executionId, Req request); + + void afterBulk(long executionId, Req request, Res response); + + void afterBulk(long executionId, Req request, Throwable failure); + + void setBulkProcessor(FsCrawlerBulkProcessor bulkProcessor); + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java new file mode 100644 index 000000000..6a04d5ec4 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java @@ -0,0 +1,40 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import java.util.ArrayList; +import java.util.List; + +abstract public class FsCrawlerBulkRequest> { + + private final List operations = new ArrayList<>(); + + public int numberOfActions() { + return operations.size(); + } + + public void add(T request) { + operations.add(request); + } + + public List getOperations() { + return operations; + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java new file mode 100644 index 000000000..b94a40bdd --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java @@ -0,0 +1,142 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; + +@SuppressWarnings("CanBeFinal") +abstract public class FsCrawlerBulkResponse> { + + private static final Logger logger = LogManager.getLogger(FsCrawlerBulkResponse.class); + + private boolean errors; + private BulkItemResponse[] items; + + @SuppressWarnings("ConstantConditions") + public boolean hasFailures() { + if (errors) return errors; + for (BulkItemResponse item : items) { + if (item.failed) { + return true; + } + } + return false; + } + + public BulkItemResponse[] getItems() { + return items; + } + + public boolean isErrors() { + return errors; + } + + public Throwable buildFailureMessage() { + StringBuilder sbf = new StringBuilder(); + int failures = 0; + for (BulkItemResponse item : items) { + if (item.failed) { + if (logger.isTraceEnabled()) { + sbf.append(item.getOperation()); + sbf.append(":").append(item.getOpType()).append(":").append(item.getFailureMessage()); + } + failures++; + } + } + if (logger.isTraceEnabled()) { + sbf.append("\n"); + } + sbf.append(failures).append(" failures"); + return new RuntimeException(sbf.toString()); + } + + @SuppressWarnings("CanBeFinal") + public static class BulkItemResponse> { + private boolean failed; + private O operation; + private String opType; + private String failureMessage; + + // We use Object here as in 1.7 it will be a String and from 2.0 it will be a Map + private Object error; + + public boolean isFailed() { + return failed; + } + + public O getOperation() { + return operation; + } + + public String getOpType() { + return opType; + } + + public String getFailureMessage() { + return failureMessage; + } + + public void setFailed(boolean failed) { + this.failed = failed; + } + + public void setOperation(O operation) { + this.operation = operation; + } + + public void setOpType(String opType) { + this.opType = opType; + } + + public void setFailureMessage(String failureMessage) { + this.failureMessage = failureMessage; + } + + public Object getError() { + return error; + } + + public void setError(Object error) { + this.error = error; + this.failed = true; + this.failureMessage = error.toString(); + } + + @Override + public String toString() { + String sb = "BulkItemResponse{" + "failed=" + failed + + ", operation='" + operation + '\'' + + ", opType=" + opType + + ", failureMessage='" + failureMessage + '\'' + + '}'; + return sb; + } + } + + @Override + public String toString() { + String sb = "BulkResponse{" + "items=" + (items == null ? "null" : Arrays.asList(items).toString()) + + '}'; + return sb; + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java new file mode 100644 index 000000000..38c4cd808 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java @@ -0,0 +1,23 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +interface FsCrawlerOperation> extends Comparable { +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java new file mode 100644 index 000000000..1ad040fc1 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java @@ -0,0 +1,63 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * This Listener implements a simple and naive retry mechanism. When a document is rejected because of a es_rejected_execution_exception + * the same document is sent again to the bulk processor. + */ +public class FsCrawlerRetryBulkProcessorListener< + O extends FsCrawlerOperation, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse + > extends FsCrawlerAdvancedBulkProcessorListener { + + private static final Logger logger = LogManager.getLogger(FsCrawlerRetryBulkProcessorListener.class); + + @Override + public void afterBulk(long executionId, Req request, Res response) { + super.afterBulk(executionId, request, response); + if (response.hasFailures()) { + for (Res.BulkItemResponse item : response.getItems()) { + if (item.isFailed() && item.getFailureMessage().contains("es_rejected_execution_exception")) { + logger.debug("We are going to retry document [{}] because of [{}]", + item.getOperation(), item.getFailureMessage()); + // Find request + boolean requestFound = false; + for (O operation : request.getOperations()) { + if (operation.compareTo(item.getOperation()) == 0) { + this.bulkProcessor.add(operation); + requestFound = true; + logger.debug("Document [{}] found. Can be retried.", item.getOperation()); + break; + } + } + if (!requestFound) { + logger.warn("Can not retry document [{}] because we can't find it anymore.", + item.getOperation()); + } + } + } + } + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java new file mode 100644 index 000000000..584838eb7 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java @@ -0,0 +1,64 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class FsCrawlerSimpleBulkProcessorListener< + O extends FsCrawlerOperation, + Req extends FsCrawlerBulkRequest, + Res extends FsCrawlerBulkResponse + > implements FsCrawlerBulkProcessor.Listener { + private static final Logger logger = LogManager.getLogger(FsCrawlerSimpleBulkProcessorListener.class); + + protected FsCrawlerBulkProcessor bulkProcessor; + + @Override + public void beforeBulk(long executionId, Req request) { + logger.debug("Going to execute new bulk composed of {} actions", request.numberOfActions()); + } + + @Override + public void afterBulk(long executionId, Req request, Res response) { + logger.debug("Executed bulk composed of {} actions", request.numberOfActions()); + if (response.hasFailures()) { + logger.warn("There was failures while executing bulk", response.buildFailureMessage()); + if (logger.isDebugEnabled()) { + for (FsCrawlerBulkResponse.BulkItemResponse item : response.getItems()) { + if (item.isFailed()) { + logger.debug("Error for {} for {} operation: {}", item.getOperation(), + item.getOpType(), item.getFailureMessage()); + } + } + } + } + } + + @Override + public void afterBulk(long executionId, Req request, Throwable failure) { + logger.warn("Error executing bulk", failure); + } + + @Override + public void setBulkProcessor(FsCrawlerBulkProcessor bulkProcessor) { + this.bulkProcessor = bulkProcessor; + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java new file mode 100644 index 000000000..18286f917 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java @@ -0,0 +1,23 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +public class WPSearchBulkRequest extends FsCrawlerBulkRequest { +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java new file mode 100644 index 000000000..7a3638591 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java @@ -0,0 +1,31 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class WPSearchBulkResponse extends FsCrawlerBulkResponse { + private static final Logger logger = LogManager.getLogger(WPSearchBulkResponse.class); + + public WPSearchBulkResponse(String response) { + logger.debug(response); + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 823403436..7cbff426d 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -19,6 +19,7 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.glassfish.jersey.client.ClientConfig; @@ -41,7 +42,6 @@ * Workplace Search Java client * We make it as dumb as possible as it should be replaced in the future by * an official implementation. - * TODO add a bulk mechanism */ public class WPSearchClient implements Closeable { @@ -57,12 +57,12 @@ public class WPSearchClient implements Closeable { private String endpoint = DEFAULT_ENDPOINT; private String host = DEFAULT_HOST; private final String accessToken; - private final String key; + final String urlForBulkCreate; + final String urlForBulkDestroy; + String urlForApi; + final String urlForSearch; - private String urlForBulkCreate; - private String urlForBulkDestroy; - private String urlForApi; - private String urlForSearch; + private FsCrawlerBulkProcessor bulkProcessor; /** * Create a client @@ -71,7 +71,10 @@ public class WPSearchClient implements Closeable { */ public WPSearchClient(String accessToken, String key) { this.accessToken = accessToken; - this.key = key; + this.urlForBulkCreate = "sources/" + key + "/documents/bulk_create"; + this.urlForBulkDestroy = "sources/" + key + "/documents/bulk_destroy"; + this.urlForSearch = "search"; + this.urlForApi = host + endpoint; } /** @@ -91,6 +94,7 @@ public WPSearchClient withUserAgent(String userAgent) { */ public WPSearchClient withEndpoint(String endpoint) { this.endpoint = endpoint; + this.urlForApi = host + endpoint; return this; } @@ -101,6 +105,7 @@ public WPSearchClient withEndpoint(String endpoint) { */ public WPSearchClient withHost(String host) { this.host = host; + this.urlForApi = host + endpoint; return this; } @@ -113,20 +118,15 @@ public void start() { // We need to suppress this so we can do DELETE with body config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); client = ClientBuilder.newClient(config); - urlForBulkCreate = "sources/" + key + "/documents/bulk_create"; - urlForBulkDestroy = "sources/" + key + "/documents/bulk_destroy"; - urlForSearch = "search"; - urlForApi = host + endpoint; - } - /** - * Index multiple documents - * @param documents Documents to index - */ - public void indexDocuments(List> documents) { - logger.debug("Adding documents {}", documents); - String response = post(urlForBulkCreate, documents, String.class); - logger.debug("Adding documents response: {}", response); + // Create the BulkProcessor instance + bulkProcessor = new FsCrawlerBulkProcessor.Builder<>( + new WPSearchEngine(this), + new FsCrawlerRetryBulkProcessorListener<>(), + WPSearchBulkRequest::new) + .setBulkActions(100) + .setFlushInterval(TimeValue.timeValueSeconds(5)) + .build(); } /** @@ -134,7 +134,8 @@ public void indexDocuments(List> documents) { * @param document Document to index */ public void indexDocument(Map document) { - indexDocuments(Collections.singletonList(document)); + logger.debug("Adding document {}", document); + bulkProcessor.add(new WPSearchOperation(document)); } /** @@ -148,7 +149,7 @@ public void destroyDocuments(List ids) { logger.debug("Removing documents response: {}", response); // TODO parse the response to check for errors } catch (NotFoundException e) { - logger.warn("We did not find the ressources: {}", ids); + logger.warn("We did not find the resources: {}", ids); } } @@ -180,7 +181,7 @@ public void close() { } } - private T post(String path, Object data, Class clazz) { + T post(String path, Object data, Class clazz) { return prepareHttpCall(path).post(Entity.entity(data, MediaType.APPLICATION_JSON), clazz); } @@ -207,4 +208,17 @@ private Invocation.Builder prepareHttpCall(String path) { return builder; } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("WPSearchClient{"); + sb.append("endpoint='").append(endpoint).append('\''); + sb.append(", host='").append(host).append('\''); + sb.append(", urlForBulkCreate='").append(urlForBulkCreate).append('\''); + sb.append(", urlForBulkDestroy='").append(urlForBulkDestroy).append('\''); + sb.append(", urlForApi='").append(urlForApi).append('\''); + sb.append(", urlForSearch='").append(urlForSearch).append('\''); + sb.append('}'); + return sb.toString(); + } } diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java new file mode 100644 index 000000000..1ab2bff55 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java @@ -0,0 +1,52 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class WPSearchEngine implements Engine { + private static final Logger logger = LogManager.getLogger(WPSearchEngine.class); + private final WPSearchClient wpSearchClient; + + public WPSearchEngine(WPSearchClient wpSearchClient) { + this.wpSearchClient = wpSearchClient; + } + + @Override + public WPSearchBulkResponse bulk(WPSearchBulkRequest request) { + List> documents = new ArrayList<>(); + for (WPSearchOperation operation : request.getOperations()) { + documents.add(operation.getDocument()); + } + + try { + String response = wpSearchClient.post(wpSearchClient.urlForBulkCreate, documents, String.class); + return new WPSearchBulkResponse(response); + } catch (Exception e) { + logger.error(e); + return new WPSearchBulkResponse(e.getMessage()); + } + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java new file mode 100644 index 000000000..6f924feb1 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java @@ -0,0 +1,42 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import java.util.Map; + +public class WPSearchOperation implements FsCrawlerOperation { + private final Map document; + + public WPSearchOperation(Map document) { + this.document = document; + } + + public Map getDocument() { + return document; + } + + @Override + public int compareTo(WPSearchOperation request) { + // We check on the id field + String id1 = (String) document.get("id"); + String id2 = (String) request.document.get("id"); + return id1.compareTo(id2); + } +} diff --git a/docs/source/dev/build.rst b/docs/source/dev/build.rst index 13fdb9dc2..20c3cfe4d 100644 --- a/docs/source/dev/build.rst +++ b/docs/source/dev/build.rst @@ -160,6 +160,9 @@ To run Workplace Search tests against another instance (ie. running on you can also use ``tests.workplace.url`` to set where Enterprise Search is running:: mvn verify -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 \ + -Dtests.cluster.user=elastic \ + -Dtests.cluster.pass=changeme \ + -Dtests.cluster.cloud_id=CLOUD_ID -Dtests.workplace.url=https://XYZ.ent-search.ZONE.CLOUD_PROVIDER.elastic-cloud.com \ -Dtests.workplace.access_token=ACCESS_TOKEN \ -Dtests.workplace.key=KEY diff --git a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java index bf55058c6..f1bde14eb 100644 --- a/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java +++ b/elasticsearch-client/elasticsearch-client-v6/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v6/ElasticsearchClientV6.java @@ -140,7 +140,7 @@ public void start() throws IOException { checkVersion(); logger.info("Elasticsearch Client for version {}.x connected to a node running version {}", compatibleVersion(), getVersion()); } catch (Exception e) { - logger.warn("failed to create elasticsearch client, disabling crawler..."); + logger.warn("failed to create elasticsearch client on {}, disabling crawler...", settings.getElasticsearch().toString()); throw e; } diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java index c68d58772..f3d706df5 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/ElasticsearchClientV7.java @@ -144,7 +144,7 @@ public void start() throws IOException { checkVersion(); logger.info("Elasticsearch Client for version {}.x connected to a node running version {}", compatibleVersion(), getVersion()); } catch (Exception e) { - logger.warn("failed to create elasticsearch client, disabling crawler..."); + logger.warn("failed to create elasticsearch client on {}, disabling crawler...", settings.getElasticsearch().toString()); throw e; } diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 73d6a4d79..2fb42d9f2 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -164,8 +164,8 @@ public void index(String index, String id, Doc doc, String pipeline) { document.put("created_at", toRFC3339(doc.getFile().getCreated())); // Index main path attributes - // document.put("url", "file://" + doc.getPath().getVirtual()); - document.put("url", "file://" + doc.getPath().getReal()); + // TODO make the URL prefix configurable. + document.put("url", "http://fscrawler-repository" + doc.getPath().getVirtual()); document.put("path", doc.getPath().getReal()); wpSearchClient.indexDocument(document); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index aea13fcde..5830448d4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -101,9 +101,9 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private final static String DEFAULT_PASSWORD = "changeme"; private final static Integer DEFAULT_TEST_REST_PORT = 8080; - private static String testClusterUrl; - private final static String testClusterUser = System.getProperty("tests.cluster.user", DEFAULT_USERNAME); - private final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); + protected static String testClusterUrl; + protected final static String testClusterUser = System.getProperty("tests.cluster.user", DEFAULT_USERNAME); + protected final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token"); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index cba45c43e..bcf805968 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -48,9 +48,8 @@ import static fr.pilato.elasticsearch.crawler.fs.FsCrawlerImpl.LOOP_INFINITE; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasEntry; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.startsWith; import static org.junit.Assume.assumeTrue; /** @@ -126,8 +125,10 @@ public static void stopCrawling() throws Exception { crawler.close(); crawler = null; } - documentService.close(); - documentService = oldDocumentService; + if (oldDocumentService != documentService) { + documentService.close(); + documentService = oldDocumentService; + } } /** @@ -156,7 +157,7 @@ public void testExtractFromDocx() throws IOException { assertThat(source, hasEntry(is("name$string"), notNullValue())); assertThat(source, hasEntry(is("mime_type$string"), notNullValue())); assertThat(source, hasEntry(is("url$string"), notNullValue())); - assertThat(source, hasEntry(is("size$float"), notNullValue())); + assertThat(source, hasKey(startsWith("size"))); assertThat(source, hasEntry(is("last_modified$string"), notNullValue())); assertThat(source, hasEntry(is("path$string"), notNullValue())); assertThat(source, hasEntry(is("created_at$string"), notNullValue())); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index b585b1c41..6a8701282 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -60,8 +60,10 @@ public void overrideDocumentService() throws IOException { fsSettings = FsSettings.builder(getCrawlerName()) .setFs(fs) .setElasticsearch(Elasticsearch.builder() - .addNode(NODE_DEFAULT) - .setUsername("elastic").setPassword("changeme").build()) + .addNode(new ServerUrl(testClusterUrl)) + .setUsername(testClusterUser) + .setPassword(testClusterPass) + .build()) .setWorkplaceSearch(WorkplaceSearch.builder() .setServer(new ServerUrl(testWorkplaceUrl)) .setAccessToken(testWorkplaceAccessToken) @@ -82,8 +84,10 @@ public void overrideDocumentService() throws IOException { @After public void resetDocumentService() throws IOException { - documentService.close(); - documentService = oldDocumentService; + if (oldDocumentService != documentService) { + documentService.close(); + documentService = oldDocumentService; + } } @Test @@ -94,13 +98,13 @@ public void testWorkplaceSearch() throws Exception { Map source = searchResponse.getHits().get(0).getSourceAsMap(); assertThat(source, hasEntry(is("path$string"), notNullValue())); assertThat(source, hasEntry("extension$string", "txt")); - assertThat(source, hasEntry("size$float", 12230.0)); - assertThat(source, hasEntry(is("text_size$float"), nullValue())); + assertThat(source, hasKey(startsWith("size"))); + assertThat(source, hasKey(startsWith("text_size"))); assertThat(source, hasEntry(is("mime_type$string"), notNullValue())); assertThat(source, hasEntry("name$string", "roottxtfile.txt")); assertThat(source, hasEntry(is("created_at$string"), notNullValue())); assertThat(source, hasEntry(is("body$string"), notNullValue())); assertThat(source, hasEntry(is("last_modified$string"), notNullValue())); - assertThat(source, hasEntry("url$string", "file:///roottxtfile.txt")); + assertThat(source, hasEntry("url$string", "http://fscrawler-repository/roottxtfile.txt")); } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index 5016b9c16..04346986a 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -20,19 +20,22 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; import com.carrotsearch.randomizedtesting.RandomizedTest; -import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractITCase; +import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Test Workplace Search HTTP client */ -public class WPSearchClientIT extends AbstractITCase { +public class WPSearchClientIT extends AbstractFsCrawlerITCase { private static WPSearchClient client; @@ -52,27 +55,28 @@ public static void stopClient() { } } - @Test - public void testSendADocument() { - Map document = new HashMap<>(); - document.put("id", "testSendADocument"); - document.put("body", "Foo Bar Baz"); - client.indexDocument(document); + @Before + public void cleanExistingIndex() throws IOException { + logger.info(" -> Removing existing index [.ent-search-engine-*]"); + documentService.getClient().deleteIndex(".ent-search-engine-*"); } @Test - public void testSearch() { + public void testSearch() throws Exception { Map document = new HashMap<>(); String uniqueId = RandomizedTest.randomAsciiLettersOfLength(10); document.put("id", "testSearch"); document.put("title", "To be searched " + uniqueId); document.put("body", "Foo Bar Baz " + uniqueId); client.indexDocument(document); + + // We need to wait until it's done + countTestHelper(new ESSearchRequest().withIndex(".ent-search-engine-*"), 1L, null); client.search(uniqueId); } @Test - public void testSendAndRemoveADocument() throws InterruptedException { + public void testSendAndRemoveADocument() { Map document = new HashMap<>(); document.put("id", "testSendAndRemoveADocument"); document.put("title", "To be deleted " + RandomizedTest.randomAsciiLettersOfLength(10)); diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/ServerUrl.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/ServerUrl.java index d55ba3b49..27243f249 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/ServerUrl.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/ServerUrl.java @@ -58,7 +58,7 @@ public ServerUrl(String urlOrCloudId) { * The cloudId can be found from the cloud console. * * @param cloudId The cloud ID to decode. - * @return A Node running on https://address:443 + * @return A Node running on https://address */ public static String decodeCloudId(String cloudId) { // 1. Ignore anything before `:`. @@ -71,7 +71,7 @@ public static String decodeCloudId(String cloudId) { String[] words = decoded.split("\\$"); // 4. form the URLs - return "https://" + words[1] + "." + words[0] + ":443"; + return "https://" + words[1] + "." + words[0]; } /** From a086418332d43ddedbabf1d264757485c3b0a2dd Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 6 Aug 2020 15:35:31 +0200 Subject: [PATCH 37/67] Move the BulkProcessor feature to the framework --- .../crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java | 2 ++ .../crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java | 1 + .../crawler/fs/thirdparty/wpsearch/WPSearchClient.java | 2 ++ .../crawler/fs/thirdparty/wpsearch/WPSearchEngine.java | 1 + .../crawler/fs/thirdparty/wpsearch/WPSearchOperation.java | 2 ++ .../elasticsearch/crawler/fs/framework/bulk}/Engine.java | 2 +- .../bulk}/FsCrawlerAdvancedBulkProcessorListener.java | 2 +- .../crawler/fs/framework/bulk}/FsCrawlerBulkProcessor.java | 2 +- .../crawler/fs/framework/bulk}/FsCrawlerBulkRequest.java | 2 +- .../crawler/fs/framework/bulk}/FsCrawlerBulkResponse.java | 2 +- .../crawler/fs/framework/bulk}/FsCrawlerOperation.java | 4 ++-- .../framework/bulk}/FsCrawlerRetryBulkProcessorListener.java | 2 +- .../framework/bulk}/FsCrawlerSimpleBulkProcessorListener.java | 2 +- 13 files changed, 17 insertions(+), 9 deletions(-) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/Engine.java (94%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerAdvancedBulkProcessorListener.java (97%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerBulkProcessor.java (99%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerBulkRequest.java (94%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerBulkResponse.java (98%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerOperation.java (84%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerRetryBulkProcessorListener.java (97%) rename {3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch => framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk}/FsCrawlerSimpleBulkProcessorListener.java (97%) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java index 18286f917..c1a628fff 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkRequest.java @@ -19,5 +19,7 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerBulkRequest; + public class WPSearchBulkRequest extends FsCrawlerBulkRequest { } diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java index 7a3638591..044d2f4e5 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchBulkResponse.java @@ -19,6 +19,7 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerBulkResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 7cbff426d..73a1a1225 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -20,6 +20,8 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerBulkProcessor; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerRetryBulkProcessorListener; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.glassfish.jersey.client.ClientConfig; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java index 1ab2bff55..551317d61 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchEngine.java @@ -19,6 +19,7 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.Engine; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java index 6f924feb1..4bef30ea0 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchOperation.java @@ -19,6 +19,8 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerOperation; + import java.util.Map; public class WPSearchOperation implements FsCrawlerOperation { diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java similarity index 94% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java index 406108d39..78b7c015f 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/Engine.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; /** * Defines an Engine which is responsible to execute a bulk operation diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java similarity index 97% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java index b399b4680..c9497b996 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerAdvancedBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkProcessor.java similarity index 99% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkProcessor.java index 852e11e82..1f155fa33 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkProcessor.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkProcessor.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import org.apache.logging.log4j.LogManager; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java similarity index 94% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java index 6a04d5ec4..5fb2570af 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkRequest.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import java.util.ArrayList; import java.util.List; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java similarity index 98% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java index b94a40bdd..26e3ea4f7 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerBulkResponse.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerOperation.java similarity index 84% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerOperation.java index 38c4cd808..d5c43b222 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerOperation.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerOperation.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; -interface FsCrawlerOperation> extends Comparable { +public interface FsCrawlerOperation> extends Comparable { } diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java similarity index 97% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java index 1ad040fc1..5d205c072 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerRetryBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java similarity index 97% rename from 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java rename to framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java index 584838eb7..82c25bb38 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/FsCrawlerSimpleBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java @@ -17,7 +17,7 @@ * under the License. */ -package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; +package fr.pilato.elasticsearch.crawler.fs.framework.bulk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; From df498357009d6a55bd00edd618d9107794d6ca70 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 6 Aug 2020 15:39:42 +0200 Subject: [PATCH 38/67] Fix failing test --- .../elasticsearch/crawler/fs/settings/FsSettingsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java index 6dacd50e8..d203887a9 100644 --- a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java +++ b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java @@ -31,10 +31,10 @@ public class FsSettingsTest extends AbstractFSCrawlerTestCase { @Test public void testCloudId() { - String cloudId = "fscrawler:ZXVyb3BlLXdlc3QxLmdjcC5jbG91ZC5lcy5pbyQxZDFlYTk5Njg4Nzc0NWE2YTJiN2NiNzkzMTUzNDhhMyQyOTk1MDI3MzZmZGQ0OTI5OTE5M2UzNjdlOTk3ZmU3Nw=="; + String cloudId = "wpsearch:ZXUtd2VzdC0zLmF3cy5lbGFzdGljLWNsb3VkLmNvbTo5MjQzJDg4NTYwNTJmNDBkNjQ4YjE5Mzk1ZDQ5YTViZjgwNTA4JDJhYjJmYTU5N2RiNDQwNjJhMGZmMjY2ZTBkZTEwY2Fm"; String httpHost = decodeCloudId(cloudId); - assertThat(httpHost, is("https://1d1ea996887745a6a2b7cb79315348a3.europe-west1.gcp.cloud.es.io:443")); + assertThat(httpHost, is("https://8856052f40d648b19395d49a5bf80508.eu-west-3.aws.elastic-cloud.com:9243")); } } From 72da79ef3a4b513eddaf7174499ab690e177e284 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 6 Aug 2020 15:58:36 +0200 Subject: [PATCH 39/67] Fix failing test and add more setting tests --- .../fs/client/v7/WorkplaceSearchClientV7.java | 3 +- .../FsCrawlerTestWorkplaceSearchIT.java | 2 +- .../crawler/fs/settings/WorkplaceSearch.java | 33 +++++++++++++++---- .../fs/settings/FsSettingsParserTest.java | 33 +++++++++++++++++-- .../crawler/fs/settings/FsSettingsTest.java | 1 + 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 2fb42d9f2..a635dc10c 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -164,8 +164,7 @@ public void index(String index, String id, Doc doc, String pipeline) { document.put("created_at", toRFC3339(doc.getFile().getCreated())); // Index main path attributes - // TODO make the URL prefix configurable. - document.put("url", "http://fscrawler-repository" + doc.getPath().getVirtual()); + document.put("url", settings.getWorkplaceSearch().getUrlPrefix() + doc.getPath().getVirtual()); document.put("path", doc.getPath().getReal()); wpSearchClient.indexDocument(document); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 6a8701282..a3c75307c 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -105,6 +105,6 @@ public void testWorkplaceSearch() throws Exception { assertThat(source, hasEntry(is("created_at$string"), notNullValue())); assertThat(source, hasEntry(is("body$string"), notNullValue())); assertThat(source, hasEntry(is("last_modified$string"), notNullValue())); - assertThat(source, hasEntry("url$string", "http://fscrawler-repository/roottxtfile.txt")); + assertThat(source, hasEntry("url$string", "http://127.0.0.1/roottxtfile.txt")); } } diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java index b6b2364e9..d368af97f 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/WorkplaceSearch.java @@ -27,20 +27,23 @@ public class WorkplaceSearch { protected static final Logger logger = LogManager.getLogger(WorkplaceSearch.class); - public static final ServerUrl SERVER_DEFAULT = new ServerUrl("http://127.0.0.1:3002"); + public static final ServerUrl DEFAULT_SERVER = new ServerUrl("http://127.0.0.1:3002"); + public static final String DEFAULT_URL_PREFIX = "http://127.0.0.1"; - private ServerUrl server = SERVER_DEFAULT; + private ServerUrl server = DEFAULT_SERVER; private String key; private String accessToken; + private String urlPrefix = DEFAULT_URL_PREFIX; public WorkplaceSearch() { } - public WorkplaceSearch(ServerUrl server, String key, String accessToken) { + public WorkplaceSearch(ServerUrl server, String key, String accessToken, String urlPrefix) { this.server = server; this.key = key; this.accessToken = accessToken; + this.urlPrefix = urlPrefix; } public static Builder builder() { @@ -71,10 +74,19 @@ public void setAccessToken(String accessToken) { this.accessToken = accessToken; } + public String getUrlPrefix() { + return urlPrefix; + } + + public void setUrlPrefix(String urlPrefix) { + this.urlPrefix = urlPrefix; + } + public static class Builder { - private ServerUrl server = SERVER_DEFAULT; + private ServerUrl server = DEFAULT_SERVER; private String key; private String accessToken; + private String urlPrefix = DEFAULT_URL_PREFIX; public Builder setServer(ServerUrl server) { this.server = server; @@ -91,8 +103,13 @@ public Builder setAccessToken(String accessToken) { return this; } + public Builder setUrlPrefix(String urlPrefix) { + this.urlPrefix = urlPrefix; + return this; + } + public WorkplaceSearch build() { - return new WorkplaceSearch(server, key, accessToken); + return new WorkplaceSearch(server, key, accessToken, urlPrefix); } } @@ -103,12 +120,13 @@ public boolean equals(Object o) { WorkplaceSearch that = (WorkplaceSearch) o; return Objects.equals(server, that.server) && Objects.equals(key, that.key) && - Objects.equals(accessToken, that.accessToken); + Objects.equals(accessToken, that.accessToken) && + Objects.equals(urlPrefix, that.urlPrefix); } @Override public int hashCode() { - return Objects.hash(server, key, accessToken); + return Objects.hash(server, key, accessToken, urlPrefix); } @Override @@ -116,6 +134,7 @@ public String toString() { return "WorkplaceSearch{" + "server=" + server + ", key='" + key + '\'' + ", accessToken='" + accessToken + '\'' + + ", urlPrefix='" + urlPrefix + '\'' + '}'; } } diff --git a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsParserTest.java b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsParserTest.java index fae2d6a7e..be0b900ed 100644 --- a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsParserTest.java +++ b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsParserTest.java @@ -29,6 +29,7 @@ import java.io.IOException; +import static fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl.decodeCloudId; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; @@ -68,6 +69,13 @@ public class FsSettingsParserTest extends AbstractFSCrawlerTestCase { .setIndex("docs") .setPipeline("pipeline-id-if-any") .build(); + private static final WorkplaceSearch WORKPLACE_SEARCH_EMPTY = WorkplaceSearch.builder().build(); + private static final WorkplaceSearch WORKPLACE_SEARCH_FULL = WorkplaceSearch.builder() + .setServer(new ServerUrl("https://127.0.0.1:3002")) + .setKey("KEY") + .setAccessToken("ACCESS_TOKEN") + .setUrlPrefix("https://127.0.0.1") + .build(); private static final Server SERVER_EMPTY = Server.builder().build(); private static final Server SERVER_FULL = Server.builder() .setHostname("127.0.0.1") @@ -233,7 +241,7 @@ public void testParseSettingsElasticsearchWithPathPrefix() throws IOException { @Test public void testParseSettingsElasticsearchCloudId() throws IOException { - String cloudId = "fscrawler:ZXVyb3BlLXdlc3QxLmdjcC5jbG91ZC5lcy5pbyQxZDFlYTk5Njg4Nzc0NWE2YTJiN2NiNzkzMTUzNDhhMyQyOTk1MDI3MzZmZGQ0OTI5OTE5M2UzNjdlOTk3ZmU3Nw=="; + String cloudId = "wpsearch:ZXUtd2VzdC0zLmF3cy5lbGFzdGljLWNsb3VkLmNvbTo5MjQzJDg4NTYwNTJmNDBkNjQ4YjE5Mzk1ZDQ5YTViZjgwNTA4JDJhYjJmYTU5N2RiNDQwNjJhMGZmMjY2ZTBkZTEwY2Fm"; FsSettings fsSettings = FsSettings.builder(getCurrentTestName()) .setElasticsearch(Elasticsearch.builder() .addNode(new ServerUrl(cloudId)) @@ -241,9 +249,9 @@ public void testParseSettingsElasticsearchCloudId() throws IOException { .build(); settingsTester(fsSettings); - assertThat(fsSettings.getElasticsearch().getNodes().get(0).getCloudId(), is("fscrawler:ZXVyb3BlLXdlc3QxLmdjcC5jbG91ZC5lcy5pbyQxZDFlYTk5Njg4Nzc0NWE2YTJiN2NiNzkzMTUzNDhhMyQyOTk1MDI3MzZmZGQ0OTI5OTE5M2UzNjdlOTk3ZmU3Nw==")); + assertThat(fsSettings.getElasticsearch().getNodes().get(0).getCloudId(), is("wpsearch:ZXUtd2VzdC0zLmF3cy5lbGFzdGljLWNsb3VkLmNvbTo5MjQzJDg4NTYwNTJmNDBkNjQ4YjE5Mzk1ZDQ5YTViZjgwNTA4JDJhYjJmYTU5N2RiNDQwNjJhMGZmMjY2ZTBkZTEwY2Fm")); assertThat(fsSettings.getElasticsearch().getNodes().get(0).getUrl(), is(nullValue())); - assertThat(fsSettings.getElasticsearch().getNodes().get(0).decodedUrl(), is("https://1d1ea996887745a6a2b7cb79315348a3.europe-west1.gcp.cloud.es.io:443")); + assertThat(fsSettings.getElasticsearch().getNodes().get(0).decodedUrl(), is("https://8856052f40d648b19395d49a5bf80508.eu-west-3.aws.elastic-cloud.com:9243")); } @@ -256,6 +264,24 @@ public void testParseSettingsElasticsearchIndexSettings() throws IOException { ); } + @Test + public void testParseSettingsEmptyWorkplaceSearch() throws IOException { + settingsTester( + FsSettings.builder(getCurrentTestName()) + .setWorkplaceSearch(WORKPLACE_SEARCH_EMPTY) + .build() + ); + } + + @Test + public void testParseSettingsWorkplaceSearch() throws IOException { + settingsTester( + FsSettings.builder(getCurrentTestName()) + .setWorkplaceSearch(WORKPLACE_SEARCH_FULL) + .build() + ); + } + @Test public void testParseSettingsEmptyServer() throws IOException { settingsTester( @@ -279,6 +305,7 @@ public void testParseCompleteSettings() throws IOException { settingsTester( FsSettings.builder(getCurrentTestName()) .setElasticsearch(ELASTICSEARCH_FULL) + .setWorkplaceSearch(WORKPLACE_SEARCH_FULL) .setServer(SERVER_FULL) .setFs(FS_FULL) .setRest(REST_FULL) diff --git a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java index d203887a9..dafe3ce62 100644 --- a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java +++ b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java @@ -38,3 +38,4 @@ public void testCloudId() { } } + From dcbb34f2e7f8c12cb0cacdd539617c8a926e7061 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 6 Aug 2020 16:09:19 +0200 Subject: [PATCH 40/67] Add documentation about the new prefix option --- docs/source/admin/fs/wpsearch.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/source/admin/fs/wpsearch.rst b/docs/source/admin/fs/wpsearch.rst index beb1d2ab4..694c2716b 100644 --- a/docs/source/admin/fs/wpsearch.rst +++ b/docs/source/admin/fs/wpsearch.rst @@ -46,6 +46,8 @@ Here is a list of Workplace Search settings (under ``workplace_search.`` prefix) +----------------------------------+---------------------------+---------------------------------+ | ``workplace_search.server`` | ``http://127.0.0.1:3002`` | `Server`_ | +----------------------------------+---------------------------+---------------------------------+ +| ``workplace_search.url_prefix`` | ``http://127.0.0.1`` | `Documents Repository URL`_ | ++----------------------------------+---------------------------+---------------------------------+ Keys @@ -105,3 +107,30 @@ Then you can define the following: And get the ``ACCESS_TOKEN`` and ``KEY`` from your Enterprise Search deployment once you have created the Custom API source as seen previously. +Documents Repository URL +^^^^^^^^^^^^^^^^^^^^^^^^ + +The URL that will be used to give access to your users to the source document is +prefixed by default with ``http://127.0.0.1``. That means that if you are able to run +a Web Server locally which can serve the directory you defined in ``fs.url`` setting +(see :ref:`root-directory`), your users will be able to click in the Workplace Search interface +to have access to the documents. + +Of course, in production, you would probably change this and connect to +another url. This can be done by changing the ``workplace_search.url_prefix`` setting: + +.. code:: yaml + + name: "test" + workplace_search: + access_token: "ACCESS_TOKEN" + key: "KEY" + url_prefix: "https://repository.mycompany.com/docs" + +.. note:: + + If ``fs.url`` is set to ``/tmp/es`` and you have indexed a document named + ``/tmp/es/path/to/foobar.txt``, the default url will be ``http://127.0.0.1/path/to/foobar.txt``. + + If you change ``workplace_search.url_prefix`` to ``https://repository.mycompany.com/docs``, the + same document will be served as ``https://repository.mycompany.com/docs/path/to/foobar.txt``. From 065d381c72cc67dd0da288317c96505fc4bec721 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 7 Aug 2020 16:34:41 +0200 Subject: [PATCH 41/67] Add support for bulk_size and flush_interval in bulk --- .../thirdparty/wpsearch/WPSearchClient.java | 31 ++++++++++++- docs/source/admin/fs/wpsearch.rst | 43 +++++++++++++------ .../fs/client/v7/WorkplaceSearchClientV7.java | 4 +- ...wlerTestWorkplaceSearchAllDocumentsIT.java | 2 + .../FsCrawlerTestWorkplaceSearchIT.java | 2 + .../workplacesearch/WPSearchClientIT.java | 3 +- .../crawler/fs/settings/WorkplaceSearch.java | 38 +++++++++++++++- .../fs/settings/FsSettingsParserTest.java | 11 ++--- 8 files changed, 108 insertions(+), 26 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 73a1a1225..e472cfd91 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -61,6 +61,8 @@ public class WPSearchClient implements Closeable { private final String accessToken; final String urlForBulkCreate; final String urlForBulkDestroy; + private int bulkSize; + private TimeValue flushInterval; String urlForApi; final String urlForSearch; @@ -111,6 +113,31 @@ public WPSearchClient withHost(String host) { return this; } + /** + * Defines the bulk size, which is the number of expected operations added to the bulk + * processor before actually sending the bulk request over the network. + * @param bulkSize Number of documents + * @return the current instance + * @see #withFlushInterval(TimeValue) for setting the flush interval + */ + public WPSearchClient withBulkSize(int bulkSize) { + this.bulkSize = bulkSize; + return this; + } + + /** + * Interval to use to flush the existing operations within the bulk processor whatever + * the number of documents. Which means that event you did not reach {@link #withBulkSize(int)} + * number of elements, the content will be flushed after the flushInterval period. + * @param flushInterval A duration. + * @return the current instance + * @see #withBulkSize(int) to set the maximum number of items in a bulk + */ + public WPSearchClient withFlushInterval(TimeValue flushInterval) { + this.flushInterval = flushInterval; + return this; + } + /** * Start the client */ @@ -126,8 +153,8 @@ public void start() { new WPSearchEngine(this), new FsCrawlerRetryBulkProcessorListener<>(), WPSearchBulkRequest::new) - .setBulkActions(100) - .setFlushInterval(TimeValue.timeValueSeconds(5)) + .setBulkActions(bulkSize) + .setFlushInterval(flushInterval) .build(); } diff --git a/docs/source/admin/fs/wpsearch.rst b/docs/source/admin/fs/wpsearch.rst index 694c2716b..05a21ed57 100644 --- a/docs/source/admin/fs/wpsearch.rst +++ b/docs/source/admin/fs/wpsearch.rst @@ -37,17 +37,21 @@ FSCrawler can now send documents to `Workplace Search Date: Fri, 7 Aug 2020 16:54:10 +0200 Subject: [PATCH 42/67] We can use exact macthing to run our tests --- .../FsCrawlerTestWorkplaceSearchAllDocumentsIT.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index a281ddad2..11a1343fd 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -25,6 +25,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ESSearchHit; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; +import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerIllegalConfigurationException; import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.service.FsCrawlerDocumentService; @@ -283,18 +284,14 @@ private ESSearchResponse runSearch(String filename) throws IOException { private ESSearchResponse runSearch(String filename, String content) throws IOException { logger.info(" -> Testing if file [{}] has been indexed correctly{}.", filename, content == null ? "" : " and contains [" + content + "]"); - ESBoolQuery query = new ESBoolQuery().addMust(new ESMatchQuery("name$string", filename)); + ESBoolQuery query = new ESBoolQuery().addMust(new ESTermQuery("name$string.enum", filename)); if (content != null) { query.addMust(new ESMatchQuery("body$string", content)); } ESSearchResponse response = documentService.getClient().search(new ESSearchRequest() .withIndex(".ent-search-engine-*") .withESQuery(query)); - // assertThat(response.getTotalHits(), is(1L)); - if (response.getTotalHits() != 1) { - logger.warn("With workplace search we can't search for exact filenames so we have {} hits instead " + - "of 1 when looking for [{}].", response.getTotalHits(), filename); - } + assertThat(response.getTotalHits(), is(1L)); return response; } } From 4833c16c48bae33cf7738ced768006642749fb30 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 7 Sep 2020 16:12:01 +0200 Subject: [PATCH 43/67] WIP: Update demo to 7.9.1 --- contrib/docker-compose-workplacesearch/.env | 2 +- .../docker-compose.yml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contrib/docker-compose-workplacesearch/.env b/contrib/docker-compose-workplacesearch/.env index d9098918e..3547b8998 100644 --- a/contrib/docker-compose-workplacesearch/.env +++ b/contrib/docker-compose-workplacesearch/.env @@ -1,2 +1,2 @@ -ELASTIC_VERSION=7.8.0 +ELASTIC_VERSION=7.9.1 ELASTIC_PASSWORD=changeme diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml index a1013afc2..63d730ab7 100644 --- a/contrib/docker-compose-workplacesearch/docker-compose.yml +++ b/contrib/docker-compose-workplacesearch/docker-compose.yml @@ -13,22 +13,22 @@ services: - xpack.security.enabled=true - xpack.security.authc.api_key.enabled=true - xpack.ml.enabled=false - - xpack.license.self_generated.type=trial ulimits: memlock: soft: -1 hard: -1 ports: ['9200:9200'] - networks: ['stack'] + networks: ['wpsearch'] kibana: image: docker.elastic.co/kibana/kibana:$ELASTIC_VERSION environment: - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD + - ENTERPRISESEARCH_HOST=http://enterprisesearch:3002 ports: ['5601:5601'] - networks: ['stack'] - links: ['elasticsearch'] + networks: ['wpsearch'] + links: ['elasticsearch', 'enterprisesearch'] restart: always depends_on: ['elasticsearch'] @@ -43,9 +43,9 @@ services: - "secret_management.encryption_keys=[XYZ]" - "ENT_SEARCH_DEFAULT_PASSWORD=$ELASTIC_PASSWORD" ports: ['3002:3002'] - networks: ['stack'] + networks: ['wpsearch'] links: ['elasticsearch'] depends_on: ['elasticsearch'] networks: - stack: {} + wpsearch: {} From 6556b3149ab3e10388d7a2ff94d6c16af20b447b Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 7 Sep 2020 18:47:27 +0200 Subject: [PATCH 44/67] FSCrawler is not closing properly We called twice the run of the Thread. Which causes duplicates and avoid closing the crawler. --- .../crawler/fs/thirdparty/wpsearch/WPSearchClient.java | 8 ++++++++ .../pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java | 1 - .../FsCrawlerDocumentServiceElasticsearchImpl.java | 2 +- .../FsCrawlerManagementServiceElasticsearchImpl.java | 4 ++-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index e472cfd91..d7595c063 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -35,6 +35,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import java.io.Closeable; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -205,6 +206,13 @@ public String search(String query) { @Override public void close() { logger.debug("Closing the WPSearchClient"); + if (bulkProcessor != null) { + try { + bulkProcessor.close(); + } catch (IOException e) { + logger.warn("Error caught while trying to close the Bulk Processor for Workplace Search", e); + } + } if (client != null) { client.close(); } diff --git a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java index 7599f51d8..7a6bfc84c 100644 --- a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java +++ b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java @@ -274,7 +274,6 @@ public static void main(String[] args) throws Exception { } String elasticsearchVersion = fsCrawler.getManagementService().getClient().getVersion(); checkForDeprecatedResources(configDir, elasticsearchVersion); - fsCrawler.start(); // Start the REST Server if needed if (commands.rest) { diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java index 61ab21019..9cf489ae4 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentServiceElasticsearchImpl.java @@ -54,7 +54,7 @@ public ElasticsearchClient getClient() { @Override public void close() throws IOException { client.close(); - logger.debug("Elasticsearch Service stopped"); + logger.debug("Elasticsearch Document Service stopped"); } @Override diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java index 1cc7bfe57..4a9104075 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java @@ -58,7 +58,7 @@ public FsCrawlerManagementServiceElasticsearchImpl(Path config, FsSettings setti @Override public void start() throws IOException { client.start(); - logger.debug("Management Service started"); + logger.debug("Elasticsearch Management Service started"); } @Override @@ -69,7 +69,7 @@ public ElasticsearchClient getClient() { @Override public void close() throws IOException { client.close(); - logger.debug("Management Service stopped"); + logger.debug("Elasticsearch Management Service stopped"); } @Override From 167666dc8ec69ae4f8522c7fe97ef34121333fff Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 14 Sep 2020 15:42:17 +0200 Subject: [PATCH 45/67] Use filename as title when no title is available For Workplace Search, we use the name of the file if no title has been found in the document metadata. --- .../crawler/fs/client/v7/WorkplaceSearchClientV7.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 11dc405a7..90d549644 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -27,6 +27,7 @@ import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClient; import fr.pilato.elasticsearch.crawler.fs.client.ElasticsearchClientUtil; import fr.pilato.elasticsearch.crawler.fs.client.WorkplaceSearchClient; +import fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil; import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; import org.apache.logging.log4j.LogManager; @@ -150,7 +151,8 @@ public void index(String index, String id, Doc doc, String pipeline) { document.put("body", doc.getContent()); // Index main metadata - document.put("title", doc.getMeta().getTitle()); + // We use the name of the file if no title has been found in the document metadata + document.put("title", FsCrawlerUtil.isNullOrEmpty(doc.getMeta().getTitle()) ? doc.getFile().getFilename() : doc.getMeta().getTitle()); document.put("author", doc.getMeta().getAuthor()); document.put("keywords", doc.getMeta().getKeywords()); document.put("language", doc.getMeta().getLanguage()); From 356fa5f3c16433eeae2d6f46f378125e46f87086 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 14 Sep 2020 15:44:17 +0200 Subject: [PATCH 46/67] Update the WPSearchClient to 7.9.1 --- .../crawler/fs/thirdparty/wpsearch/WPSearchClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index d7595c063..116a24b62 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -51,7 +51,7 @@ public class WPSearchClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchClient.class); private final static String CLIENT_NAME = "elastic-workplace-search-java"; - private final static String CLIENT_VERSION = "7.8.1"; + private final static String CLIENT_VERSION = "7.9.1"; private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; private final static String DEFAULT_HOST = "http://127.0.0.1:3002"; From b67d2ad0f8fa73607d6aadef07d147141813af1f Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 24 Sep 2020 13:31:42 +0200 Subject: [PATCH 47/67] Switch to Docker-Compose instead of Docker for tests We are switching from `docker-maven-plugin` to `docker-compose-maven-plugin` to have a better way to test our full platform. That way we can also provide to the community a docker-compose contrib example which we are using within our own tests. Note that this is using a not released yet version for the maven plugin waitfor: https://github.com/simplaex/waitfor-maven-plugin/ --- contrib/docker-compose-it/.env | 15 +++ .../README.md | 19 ++- .../docker-compose-elasticsearch.yml | 24 ++++ .../docker-compose-enterprise-search.yml | 22 ++++ .../docker-compose-kibana.yml | 18 +++ contrib/docker-compose-workplacesearch/.env | 2 - .../docker-compose.yml | 51 -------- docs/source/dev/build.rst | 23 ++-- docs/source/fscrawler.ini | 2 +- integration-tests/it-v6/pom.xml | 82 ++++++------- integration-tests/it-v7/pom.xml | 87 +++++++------- pom.xml | 111 ++++++++++++------ 12 files changed, 259 insertions(+), 197 deletions(-) create mode 100644 contrib/docker-compose-it/.env rename contrib/{docker-compose-workplacesearch => docker-compose-it}/README.md (79%) create mode 100644 contrib/docker-compose-it/docker-compose-elasticsearch.yml create mode 100644 contrib/docker-compose-it/docker-compose-enterprise-search.yml create mode 100644 contrib/docker-compose-it/docker-compose-kibana.yml delete mode 100644 contrib/docker-compose-workplacesearch/.env delete mode 100644 contrib/docker-compose-workplacesearch/docker-compose.yml diff --git a/contrib/docker-compose-it/.env b/contrib/docker-compose-it/.env new file mode 100644 index 000000000..17595600e --- /dev/null +++ b/contrib/docker-compose-it/.env @@ -0,0 +1,15 @@ +# Elastic Stack settings +ELASTIC_VERSION=7.9.1 +ELASTIC_PASSWORD=changeme + +# Elasticsearch settings +IMG_ELASTICSEARCH=docker.elastic.co/elasticsearch/elasticsearch +ELASTICSEARCH_PORT=9200 + +# Kibana settings +IMG_KIBANA=docker.elastic.co/kibana/kibana +KIBANA_PORT=5601 + +# Enterprise Search settings +IMG_ENTERPRISE_SEARCH=docker.elastic.co/enterprise-search/enterprise-search +ENTERPRISE_SEARCH_PORT=3002 diff --git a/contrib/docker-compose-workplacesearch/README.md b/contrib/docker-compose-it/README.md similarity index 79% rename from contrib/docker-compose-workplacesearch/README.md rename to contrib/docker-compose-it/README.md index 5a16ed9ab..3f00bede4 100644 --- a/contrib/docker-compose-workplacesearch/README.md +++ b/contrib/docker-compose-it/README.md @@ -2,12 +2,25 @@ This documentation shows how to manually test the Workplace Search integration until we can make all that automatic. -## Launch Workplace Search +## Launch Elastic Stack -Go to the `contrib/docker-compose-workplacesearch` dir and type: +Go to the `contrib/docker-compose-it` dir and type: ```sh -docker-compose up +docker-compose \ + -f docker-compose-elasticsearch.yml \ + -f docker-compose-enterprise-search.yml \ + up +``` + +If you want to also start the stack with Kibana, run instead: + +```sh +docker-compose \ + -f docker-compose-elasticsearch.yml \ + -f docker-compose-kibana.yml \ + -f docker-compose-enterprise-search.yml \ + up ``` Wait for everything to start. It could take several minutes: diff --git a/contrib/docker-compose-it/docker-compose-elasticsearch.yml b/contrib/docker-compose-it/docker-compose-elasticsearch.yml new file mode 100644 index 000000000..70cefe533 --- /dev/null +++ b/contrib/docker-compose-it/docker-compose-elasticsearch.yml @@ -0,0 +1,24 @@ +--- +version: '3' +services: + + elasticsearch: + image: $IMG_ELASTICSEARCH:$ELASTIC_VERSION + environment: + - bootstrap.memory_lock=true + - discovery.type=single-node + - "ES_JAVA_OPTS=-Xms3g -Xmx3g" + - cluster.routing.allocation.disk.threshold_enabled=false + - ELASTIC_PASSWORD=$ELASTIC_PASSWORD + - xpack.security.enabled=true + - xpack.security.authc.api_key.enabled=true + - xpack.ml.enabled=false + ulimits: + memlock: + soft: -1 + hard: -1 + ports: ["$ELASTICSEARCH_PORT:$ELASTICSEARCH_PORT"] + networks: ['fscrawler_it'] + +networks: + fscrawler_it: {} diff --git a/contrib/docker-compose-it/docker-compose-enterprise-search.yml b/contrib/docker-compose-it/docker-compose-enterprise-search.yml new file mode 100644 index 000000000..dc7cf0925 --- /dev/null +++ b/contrib/docker-compose-it/docker-compose-enterprise-search.yml @@ -0,0 +1,22 @@ +--- +version: '3' +services: + + enterprisesearch: + image: $IMG_ENTERPRISE_SEARCH:$ELASTIC_VERSION + environment: + - "ent_search.auth.source=standard" + - "elasticsearch.username=elastic" + - "elasticsearch.password=$ELASTIC_PASSWORD" + - "elasticsearch.host=http://elasticsearch:9200" + - "allow_es_settings_modification=true" + - "secret_management.encryption_keys=[XYZ]" + - "ENT_SEARCH_DEFAULT_PASSWORD=$ELASTIC_PASSWORD" + ports: ["$ENTERPRISE_SEARCH_PORT:$ENTERPRISE_SEARCH_PORT"] + networks: ['fscrawler_it'] + links: ['elasticsearch'] + depends_on: ['elasticsearch'] + restart: always + +networks: + fscrawler_it: {} diff --git a/contrib/docker-compose-it/docker-compose-kibana.yml b/contrib/docker-compose-it/docker-compose-kibana.yml new file mode 100644 index 000000000..34dc9755e --- /dev/null +++ b/contrib/docker-compose-it/docker-compose-kibana.yml @@ -0,0 +1,18 @@ +--- +version: '3' +services: + + kibana: + image: $IMG_KIBANA:$ELASTIC_VERSION + environment: + - ELASTICSEARCH_USERNAME=elastic + - ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD + - ENTERPRISESEARCH_HOST=http://enterprisesearch:3002 + ports: ['5601:5601'] + networks: ['fscrawler_it'] + links: ['elasticsearch', 'enterprisesearch'] + restart: always + depends_on: ['elasticsearch'] + +networks: + fscrawler_it: {} diff --git a/contrib/docker-compose-workplacesearch/.env b/contrib/docker-compose-workplacesearch/.env deleted file mode 100644 index 3547b8998..000000000 --- a/contrib/docker-compose-workplacesearch/.env +++ /dev/null @@ -1,2 +0,0 @@ -ELASTIC_VERSION=7.9.1 -ELASTIC_PASSWORD=changeme diff --git a/contrib/docker-compose-workplacesearch/docker-compose.yml b/contrib/docker-compose-workplacesearch/docker-compose.yml deleted file mode 100644 index 63d730ab7..000000000 --- a/contrib/docker-compose-workplacesearch/docker-compose.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -version: '3' -services: - - elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:$ELASTIC_VERSION - environment: - - bootstrap.memory_lock=true - - discovery.type=single-node - - "ES_JAVA_OPTS=-Xms3g -Xmx3g" - - cluster.routing.allocation.disk.threshold_enabled=false - - ELASTIC_PASSWORD=$ELASTIC_PASSWORD - - xpack.security.enabled=true - - xpack.security.authc.api_key.enabled=true - - xpack.ml.enabled=false - ulimits: - memlock: - soft: -1 - hard: -1 - ports: ['9200:9200'] - networks: ['wpsearch'] - - kibana: - image: docker.elastic.co/kibana/kibana:$ELASTIC_VERSION - environment: - - ELASTICSEARCH_USERNAME=elastic - - ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD - - ENTERPRISESEARCH_HOST=http://enterprisesearch:3002 - ports: ['5601:5601'] - networks: ['wpsearch'] - links: ['elasticsearch', 'enterprisesearch'] - restart: always - depends_on: ['elasticsearch'] - - enterprisesearch: - image: docker.elastic.co/enterprise-search/enterprise-search:$ELASTIC_VERSION - environment: - - "ent_search.auth.source=standard" - - "elasticsearch.username=elastic" - - "elasticsearch.password=$ELASTIC_PASSWORD" - - "elasticsearch.host=http://elasticsearch:9200" - - "allow_es_settings_modification=true" - - "secret_management.encryption_keys=[XYZ]" - - "ENT_SEARCH_DEFAULT_PASSWORD=$ELASTIC_PASSWORD" - ports: ['3002:3002'] - networks: ['wpsearch'] - links: ['elasticsearch'] - depends_on: ['elasticsearch'] - -networks: - wpsearch: {} diff --git a/docs/source/dev/build.rst b/docs/source/dev/build.rst index 20c3cfe4d..baf73e72d 100644 --- a/docs/source/dev/build.rst +++ b/docs/source/dev/build.rst @@ -72,7 +72,7 @@ To run the test suite against an elasticsearch instance running locally, just ru mvn verify -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 \ -Dtests.cluster.user=elastic \ -Dtests.cluster.pass=changeme \ - -Dtests.cluster.url=https://127.0.0.1:9200 \ + -Dtests.cluster.url=http://127.0.0.1:9200 \ .. hint:: @@ -95,19 +95,14 @@ To run the test suite against an elasticsearch instance running locally, just ru Using security feature """""""""""""""""""""" -Integration tests are run by default against a standard Elasticsearch cluster, which means -with no security feature activated. +Integration tests are run by default against a secured Elasticsearch cluster. .. versionadded:: 2.7 -You can run all the integration tests against a secured cluster by using the ``security`` profile:: - - mvn verify -Psecurity - -Note that secured tests are using by default ``changeme`` as the password. +Secured tests are using by default ``changeme`` as the password. You can change this by using ``tests.cluster.pass`` option:: - mvn verify -Psecurity -Dtests.cluster.pass=mystrongpassword + mvn verify -Dtests.cluster.pass=mystrongpassword Testing Workplace Search connector @@ -124,10 +119,9 @@ Enterprise Search and create manually the custom source as there is no API yet t * Run the following steps:: - cd contrib/docker-compose-workplacesearch - docker-compose up + mvn docker-compose:up waitfor:waitfor -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 -* Wait for it to start and open http://localhost:3002/ws. +* Wait for it to end and open http://localhost:3002/ws. * Enter ``enterprise_search`` as the login and ``changeme`` as the password. * Click on "Add sources" button and choose `Custom API `_. * Name it ``fscrawler`` and click on "Create Custom API Source" button. @@ -139,11 +133,16 @@ Enterprise Search and create manually the custom source as there is no API yet t * You can now run in another terminal:: mvn verify -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 \ + -Dtests.cluster.url=http://127.0.0.1:9200 \ -Dtests.workplace.access_token=ACCESS_TOKEN \ -Dtests.workplace.key=KEY * Then you should be able to see the documents in http://localhost:3002/ws/search +* Once you're done and want to switch off the stack, run:: + + mvn docker-compose:down -pl fr.pilato.elasticsearch.crawler:fscrawler-it-v7 + .. hint:: If you want to modify the look, go to the source and choose "Display Settings". diff --git a/docs/source/fscrawler.ini b/docs/source/fscrawler.ini index 6dc5b8511..ecd0d1065 100644 --- a/docs/source/fscrawler.ini +++ b/docs/source/fscrawler.ini @@ -4,7 +4,7 @@ Version=2.7-SNAPSHOT [3rdParty] TikaVersion=1.24.1 ElasticsearchVersion6=6.8.12 -ElasticsearchVersion7=7.9.0 +ElasticsearchVersion7=7.9.1 LevigoVersion=2.0 TiffVersion=1.4.0 JpegVersion=1.3.0 diff --git a/integration-tests/it-v6/pom.xml b/integration-tests/it-v6/pom.xml index e1a4029e8..6c95bde53 100644 --- a/integration-tests/it-v6/pom.xml +++ b/integration-tests/it-v6/pom.xml @@ -14,6 +14,7 @@ ${elasticsearch6.version} + ${project.basedir}/../../contrib @@ -103,10 +104,27 @@ - + - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin + + + elasticsearch + + + + + com.simplaex + waitfor-maven-plugin + + + + http://localhost:9200/ + 401 + + + @@ -125,7 +143,7 @@ - skip-fabric8 + skip-docker-compose tests.cluster.url @@ -134,8 +152,15 @@ - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin + + true + + + + com.simplaex + waitfor-maven-plugin true @@ -144,7 +169,7 @@ - run-fabric8 + run-docker-compose !tests.cluster.url @@ -153,50 +178,17 @@ - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin ${skipIntegTests} - - - - - security - - - io.fabric8 - docker-maven-plugin + com.simplaex + waitfor-maven-plugin - - - fscrawler - dadoonet/fscrawler:${project.version} - - ${integ.elasticsearch.image}:${integ.elasticsearch.version} - - single-node - trial - true - ${tests.cluster.pass} - - - - - integ.elasticsearch.port:9200 - - - - http://localhost:${integ.elasticsearch.port}/ - 200..499 - - - - - - + ${skipIntegTests} diff --git a/integration-tests/it-v7/pom.xml b/integration-tests/it-v7/pom.xml index a089c8ffd..837469694 100644 --- a/integration-tests/it-v7/pom.xml +++ b/integration-tests/it-v7/pom.xml @@ -14,6 +14,7 @@ ${elasticsearch7.version} + ${project.basedir}/../../contrib @@ -103,10 +104,32 @@ - + - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin + + + elasticsearch + enterprisesearch + + + + + com.simplaex + waitfor-maven-plugin + + + + http://localhost:9200/ + 401 + + + http://localhost:3002/ + 200 + + + @@ -125,7 +148,7 @@ - skip-fabric8 + skip-docker-compose tests.cluster.url @@ -134,8 +157,15 @@ - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin + + true + + + + com.simplaex + waitfor-maven-plugin true @@ -144,7 +174,7 @@ - run-fabric8 + run-docker-compose !tests.cluster.url @@ -153,50 +183,17 @@ - io.fabric8 - docker-maven-plugin + com.dkanejs.maven.plugins + docker-compose-maven-plugin ${skipIntegTests} - - - - - security - - - io.fabric8 - docker-maven-plugin + com.simplaex + waitfor-maven-plugin - - - fscrawler - dadoonet/fscrawler:${project.version} - - ${integ.elasticsearch.image}:${integ.elasticsearch.version} - - single-node - trial - true - ${tests.cluster.pass} - - - - - integ.elasticsearch.port:9200 - - - - http://localhost:${integ.elasticsearch.port}/ - 200..499 - - - - - - + ${skipIntegTests} diff --git a/pom.xml b/pom.xml index 7fc811b64..aa680b9ac 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ - 7.9.0 + 7.9.1 6.8.12 ${elasticsearch7.version} @@ -67,7 +67,8 @@ ${skipTests} ${skipTests} - + + ${project.basedir}/contrib docker.elastic.co/elasticsearch/elasticsearch ${elasticsearch.version} 9200 @@ -75,6 +76,8 @@ elastic changeme + docker.elastic.co/enterprise-search/enterprise-search + 3002 http://127.0.0.1:3002 @@ -261,52 +264,84 @@ - + - io.fabric8 - docker-maven-plugin - 0.34.0 + com.dkanejs.maven.plugins + docker-compose-maven-plugin + 4.0.0 - - - fscrawler - dadoonet/fscrawler:${project.version} - - ${integ.elasticsearch.image}:${integ.elasticsearch.version} - - single-node - - - - - integ.elasticsearch.port:9200 - - - - http://localhost:${integ.elasticsearch.port}/ - 200..499 - - - - - - + ${contrib.dir}/docker-compose-it/.env + + ${integ.elasticsearch.version} + ${tests.cluster.pass} + ${integ.elasticsearch.image} + ${integ.elasticsearch.port} + ${integ.workplace.image} + ${integ.workplace.port} + + + ${contrib.dir}/docker-compose-it/docker-compose-elasticsearch.yml + ${contrib.dir}/docker-compose-it/docker-compose-enterprise-search.yml + + + elasticsearch + enterprisesearch + + true + true + true + + + + true - start-elasticsearch + up pre-integration-test - build - stop - start + down + up - stop-elasticsearch + down post-integration-test - stop + down + + + + + + com.simplaex + waitfor-maven-plugin + 1.2 + + true + false + 120 + 1000 + + + + + + wait-for-environment-to-be-up + pre-integration-test + + waitfor @@ -936,7 +971,7 @@ - skip-fabric8 + skip-docker-compose tests.cluster.url @@ -944,7 +979,7 @@ - run-fabric8 + run-docker-compose !tests.cluster.url From 10b16b1730ab62bcf6846257f93744c365a0f8bc Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 25 Sep 2020 10:09:50 +0200 Subject: [PATCH 48/67] Update to Elasticsearch 7.9.2 --- contrib/docker-compose-it/.env | 2 +- docs/source/fscrawler.ini | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/docker-compose-it/.env b/contrib/docker-compose-it/.env index 17595600e..06630f337 100644 --- a/contrib/docker-compose-it/.env +++ b/contrib/docker-compose-it/.env @@ -1,5 +1,5 @@ # Elastic Stack settings -ELASTIC_VERSION=7.9.1 +ELASTIC_VERSION=7.9.2 ELASTIC_PASSWORD=changeme # Elasticsearch settings diff --git a/docs/source/fscrawler.ini b/docs/source/fscrawler.ini index ecd0d1065..b92627f99 100644 --- a/docs/source/fscrawler.ini +++ b/docs/source/fscrawler.ini @@ -4,7 +4,7 @@ Version=2.7-SNAPSHOT [3rdParty] TikaVersion=1.24.1 ElasticsearchVersion6=6.8.12 -ElasticsearchVersion7=7.9.1 +ElasticsearchVersion7=7.9.2 LevigoVersion=2.0 TiffVersion=1.4.0 JpegVersion=1.3.0 diff --git a/pom.xml b/pom.xml index aa680b9ac..63e738fb1 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ - 7.9.1 + 7.9.2 6.8.12 ${elasticsearch7.version} From f89103cc13b7f99c388df3686f7092d5a8155805 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 28 Sep 2020 16:18:18 +0200 Subject: [PATCH 49/67] Update to waitfor plugin 1.3 --- .../crawler/fs/framework/Waiter.java | 73 +++++++++++++++++++ integration-tests/it-v6/pom.xml | 6 +- integration-tests/it-v7/pom.xml | 6 +- pom.xml | 20 ++++- 4 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/Waiter.java diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/Waiter.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/Waiter.java new file mode 100644 index 000000000..38c5f4181 --- /dev/null +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/Waiter.java @@ -0,0 +1,73 @@ +/* + * Licensed to David Pilato under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.framework; + +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +/** + * Helper to wait for a given resource to be available + * @param Type of object that the supplier must provide (the resource) + */ +public class Waiter { + // After 1s, we stop growing the sleep interval exponentially and just sleep 1s until maxWaitTime + private static final long AWAIT_BUSY_THRESHOLD = 1000L; + + private final long maxTimeInMillis; + + /** + * Wait by default for 10s + */ + public Waiter() { + maxTimeInMillis = 10000L; + } + + /** + * Build a waiter for a given timeout + * @param maxWaitTime Max time + * @param unit Unit for maxWaitTime + */ + public Waiter(long maxWaitTime, TimeUnit unit) { + maxTimeInMillis = TimeUnit.MILLISECONDS.convert(maxWaitTime, unit); + } + + /** + * Wait for a given amount of time for a resource to be available + * @param breakSupplier the resource supplier. While the resource is null, the waiter will continue to wait. + * @return the resource found + * @throws InterruptedException in case the thread was interrupted while waiting + */ + public T awaitBusy(Supplier breakSupplier) throws InterruptedException { + long timeInMillis = 1; + long sum = 0; + while (sum + timeInMillis < maxTimeInMillis) { + T resource = breakSupplier.get(); + if (resource != null) { + return resource; + } + Thread.sleep(timeInMillis); + sum += timeInMillis; + timeInMillis = Math.min(AWAIT_BUSY_THRESHOLD, timeInMillis * 2); + } + timeInMillis = maxTimeInMillis - sum; + Thread.sleep(Math.max(timeInMillis, 0)); + return null; + } +} diff --git a/integration-tests/it-v6/pom.xml b/integration-tests/it-v6/pom.xml index 6c95bde53..19d868475 100644 --- a/integration-tests/it-v6/pom.xml +++ b/integration-tests/it-v6/pom.xml @@ -115,7 +115,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin @@ -159,7 +159,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin true @@ -185,7 +185,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin ${skipIntegTests} diff --git a/integration-tests/it-v7/pom.xml b/integration-tests/it-v7/pom.xml index 837469694..96b3acf52 100644 --- a/integration-tests/it-v7/pom.xml +++ b/integration-tests/it-v7/pom.xml @@ -116,7 +116,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin @@ -164,7 +164,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin true @@ -190,7 +190,7 @@ - com.simplaex + de.scravy waitfor-maven-plugin ${skipIntegTests} diff --git a/pom.xml b/pom.xml index 63e738fb1..795a5a68f 100644 --- a/pom.xml +++ b/pom.xml @@ -314,9 +314,9 @@ - com.simplaex + de.scravy waitfor-maven-plugin - 1.2 + 1.3 true false @@ -918,7 +918,21 @@ randomizedtesting-runner 2.7.8 - + + + net.sourceforge.htmlunit + htmlunit + 2.43.0 + + + + org.apache.commons + commons-lang3 + 3.11 + org.bouncycastle From 470191f0f6447a4f6ae71685bb660318a593f4be Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 12 Oct 2020 18:19:49 +0200 Subject: [PATCH 50/67] Add WPSearchAdminClient For that we are simulating a end user clicking on the web interface to create custom sources... It's a temporary solution waiting for a clean API from Workplace Search project. --- 3rdparty/workplacesearch-client/pom.xml | 6 + .../wpsearch/WPSearchAdminClient.java | 193 ++++++++++++++++++ .../thirdparty/wpsearch/WPSearchClient.java | 2 +- .../src/test/resources/log4j2.xml | 16 -- cli/src/main/resources/log4j2.xml | 3 + .../fs/test/integration/AbstractITCase.java | 14 -- .../AbstractWorkplaceSearchITCase.java | 75 +++++++ ...wlerTestWorkplaceSearchAllDocumentsIT.java | 5 +- .../FsCrawlerTestWorkplaceSearchIT.java | 6 +- .../workplacesearch/WPSearchClientIT.java | 18 +- .../it-common/src/main/resources/log4j2.xml | 9 + pom.xml | 2 +- 12 files changed, 297 insertions(+), 52 deletions(-) create mode 100644 3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java delete mode 100644 3rdparty/workplacesearch-client/src/test/resources/log4j2.xml create mode 100644 integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java diff --git a/3rdparty/workplacesearch-client/pom.xml b/3rdparty/workplacesearch-client/pom.xml index 953baf39e..634e5f405 100644 --- a/3rdparty/workplacesearch-client/pom.xml +++ b/3rdparty/workplacesearch-client/pom.xml @@ -28,6 +28,12 @@ org.glassfish.jersey.media jersey-media-json-jackson + + + net.sourceforge.htmlunit + htmlunit + + diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java new file mode 100644 index 000000000..e09355710 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java @@ -0,0 +1,193 @@ +/* + * Licensed to David Pilato under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch 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 fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; + +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.gargoylesoftware.htmlunit.HttpMethod; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.WebRequest; +import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.html.HtmlButton; +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; +import com.gargoylesoftware.htmlunit.html.HtmlTextInput; +import com.gargoylesoftware.htmlunit.util.Cookie; +import fr.pilato.elasticsearch.crawler.fs.framework.Waiter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.Closeable; +import java.io.IOException; +import java.net.URL; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient.DEFAULT_HOST; + +public class WPSearchAdminClient implements Closeable { + + private static final Logger logger = LogManager.getLogger(WPSearchAdminClient.class); + private final static String DEFAULT_USERNAME = "enterprise_search"; + private final static String DEFAULT_PASSWORD = "changeme"; + + private String host = DEFAULT_HOST; + private String username = DEFAULT_USERNAME; + private String password = DEFAULT_PASSWORD; + WebClient webClient = null; + String csrfToken = null; + Cookie session = null; + + /** + * Define a specific host. Defaults to "http://localhost:3002" + * @param host If we need to change the default host + * @return the current instance + */ + public WPSearchAdminClient withHost(String host) { + this.host = host; + return this; + } + + /** + * Define the username. Defaults to "enterprise_search" + * @param username If we need to change the default username + * @return the current instance + */ + public WPSearchAdminClient withUsername(String username) { + this.username = username; + return this; + } + + /** + * Define the password. Defaults to "changeme" + * @param password If we need to change the default password + * @return the current instance + */ + public WPSearchAdminClient withPassword(String password) { + this.password = password; + return this; + } + + public void start() throws Exception { + webClient = new WebClient(); + login(username, password); + } + + @Override + public void close() { + if (webClient != null) { + webClient.close(); + } + } + + private void checkStarted() { + if (webClient == null) { + throw new RuntimeException("start() must be called before calling any API."); + } + } + + public Map createCustomSource(String sourceName) throws Exception { + checkStarted(); + + String response = callApi(HttpMethod.POST, "/ws/org/sources/form_create", + "{service_type: \"custom\", name: \"" + sourceName + "\"}"); + JsonMapper mapper = JsonMapper.builder().build(); + Map map = mapper.readValue(response, Map.class); + + logger.debug("Source [{}] created. id={}, acces_token={}, key={}", + sourceName, map.get("id"), map.get("accessToken"), map.get("key")); + + return map; + } + + public void removeCustomSource(String id) throws Exception { + checkStarted(); + + // Delete the source + callApi(HttpMethod.DELETE, "/ws/org/sources/" + id, null); + } + + public void login(String username, String password) throws Exception { + HtmlPage page = openPage("/login"); + + HtmlForm form = page.getForms().get(0); + HtmlTextInput inputEmail = form.getOneHtmlElementByAttribute("input", "type", "text"); + inputEmail.setText(username); + HtmlPasswordInput inputPassword = form.getOneHtmlElementByAttribute("input", "type", "password"); + inputPassword.setText(password); + HtmlButton submit = form.getOneHtmlElementByAttribute("button", "type", "submit"); + + // Log in + submit.click(); + + HtmlPage entSelect = new Waiter(10, TimeUnit.SECONDS).awaitBusy(() -> { + try { + // Wait to be logged in and enter the product selection page + HtmlPage tryPage = openPage("/ent/select"); + if (tryPage == null || !tryPage.getUrl().getPath().equals("/ent/select")) { + logger.debug("We did not found yet the page we are waiting for: /ent/select. We got {}", + tryPage == null ? "null" : tryPage.getUrl().getPath()); + return null; + } + + logger.debug("We found the page we are looking for: {}", tryPage.getUrl().getPath()); + return tryPage; + } catch (Exception e) { + logger.error("We got an error while waiting for Enterprise Search to start", e); + } + return null; + }); + + if (entSelect == null) { + // We have not been able to connect to the service. Let's fail the process. + throw new RuntimeException("Can't open a session on " + host); + } + + csrfToken = entSelect.getElementByName("csrf-token").getAttribute("content"); + session = webClient.getCookieManager().getCookie("_st_togo_session"); + } + + private String callApi(HttpMethod method, String url, String data) + throws IOException { + logger.debug("Calling {}", url); + WebRequest webRequest = new WebRequest(new URL(host + url)); + webRequest.setHttpMethod(method); + if (data != null) { + webRequest.setRequestBody(data); + webRequest.setAdditionalHeader("Content-Type", "application/json;charset=UTF-8"); + } + webRequest.setAdditionalHeader("Cookie", session.getName() + "=" + session.getValue()); + webRequest.setAdditionalHeader("x-csrf-token", csrfToken); + webRequest.setAdditionalHeader("Accept", "application/json, text/plain, */*"); + WebResponse webResponse = webClient.loadWebResponse(webRequest); + String response = webResponse.getContentAsString(); + logger.debug("Response: {}", response); + return response; + } + + private HtmlPage openPage(String url) throws IOException { + HtmlPage page = webClient.getPage(host + url); + if (page == null || page.getBody() == null) { + return null; + } + logger.debug("Page {}: {}", page.getBaseURL(), page.getBody().asText()); + return page; + } +} diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 116a24b62..41dd0ae9b 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -53,7 +53,7 @@ public class WPSearchClient implements Closeable { private final static String CLIENT_NAME = "elastic-workplace-search-java"; private final static String CLIENT_VERSION = "7.9.1"; private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; - private final static String DEFAULT_HOST = "http://127.0.0.1:3002"; + public final static String DEFAULT_HOST = "http://127.0.0.1:3002"; private Client client; private String userAgent; diff --git a/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml b/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml deleted file mode 100644 index c673129fc..000000000 --- a/3rdparty/workplacesearch-client/src/test/resources/log4j2.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/cli/src/main/resources/log4j2.xml b/cli/src/main/resources/log4j2.xml index 934aff085..2ea1da4fd 100644 --- a/cli/src/main/resources/log4j2.xml +++ b/cli/src/main/resources/log4j2.xml @@ -18,6 +18,9 @@ + + + diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 5830448d4..3d839b773 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -96,7 +96,6 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { private static final Path DEFAULT_RESOURCES = Paths.get(getUrl("samples", "common")); private final static String DEFAULT_TEST_CLUSTER_URL = "http://127.0.0.1:9200"; - private final static String DEFAULT_TEST_WPSEARCH_URL = "http://127.0.0.1:3002"; private final static String DEFAULT_USERNAME = "elastic"; private final static String DEFAULT_PASSWORD = "changeme"; private final static Integer DEFAULT_TEST_REST_PORT = 8080; @@ -106,10 +105,6 @@ public abstract class AbstractITCase extends AbstractFSCrawlerTestCase { protected final static String testClusterPass = System.getProperty("tests.cluster.pass", DEFAULT_PASSWORD); protected final static int testRestPort = Integer.parseInt(System.getProperty("tests.rest.port", DEFAULT_TEST_REST_PORT.toString())); - protected final static String testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token"); - protected final static String testWorkplaceKey = System.getProperty("tests.workplace.key"); - protected final static String testWorkplaceUrl = System.getProperty("tests.workplace.url", DEFAULT_TEST_WPSEARCH_URL); - protected static Elasticsearch elasticsearchWithSecurity; protected static FsCrawlerManagementService managementService; protected static FsCrawlerDocumentService documentService; @@ -449,13 +444,4 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx }); } - /** - * This method will ignore tests if Workplace Settings are not set. - */ - protected static void checkWorkplaceSettings() { - boolean isWorkplaceAccessTokenSet = testWorkplaceAccessToken != null && !testWorkplaceAccessToken.isEmpty(); - boolean isWorkplaceKeySet = testWorkplaceKey != null && !testWorkplaceKey.isEmpty(); - assumeTrue("Workplace Search credentials not defined. Launch with -Dtests.workplace.access_token=XYZ -Dtests.workplace.key=XYZ", - isWorkplaceAccessTokenSet && isWorkplaceKeySet); - } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java new file mode 100644 index 000000000..f8c58bf1a --- /dev/null +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java @@ -0,0 +1,75 @@ +/* + * Licensed to David Pilato (the "Author") under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Author 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 fr.pilato.elasticsearch.crawler.fs.test.integration.workplacesearch; + +import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; +import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchAdminClient; +import org.junit.AfterClass; +import org.junit.BeforeClass; + +import java.util.Map; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assume.assumeNoException; + +public class AbstractWorkplaceSearchITCase extends AbstractFsCrawlerITCase { + + private final static String DEFAULT_TEST_WPSEARCH_URL = "http://127.0.0.1:3002"; + protected final static String testWorkplaceUrl = System.getProperty("tests.workplace.url", DEFAULT_TEST_WPSEARCH_URL); + + protected static WPSearchAdminClient adminClient; + private static String customSourceId; + protected static String testWorkplaceAccessToken; + protected static String testWorkplaceKey; + + @BeforeClass + public static void createCustomSource() throws Exception { + adminClient = new WPSearchAdminClient() + .withHost(testWorkplaceUrl) + .withPassword(testClusterPass); + try { + adminClient.start(); + Map customSource = adminClient.createCustomSource("fscrawler_integration_tests"); + customSourceId = (String) customSource.get("id"); + testWorkplaceAccessToken = (String) customSource.get("accessToken"); + testWorkplaceKey = (String) customSource.get("key"); + + assertThat(customSourceId, notNullValue()); + assertThat(testWorkplaceAccessToken, notNullValue()); + assertThat(testWorkplaceKey, notNullValue()); + } catch (Exception e) { + assumeNoException("We are skipping the test as we were not able to create a Workplace Search client", e); + } + } + + @AfterClass + public static void removeCustomSource() { + try { + adminClient.removeCustomSource(customSourceId); + } catch (Exception e) { + staticLogger.warn("We have not been able to remove {}: {}", customSourceId, e.getMessage()); + } + if (adminClient != null) { + adminClient.close(); + adminClient = null; + } + } +} diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java index 11a1343fd..083105804 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchAllDocumentsIT.java @@ -34,7 +34,6 @@ import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; -import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.apache.tika.parser.external.ExternalParser; import org.junit.AfterClass; import org.junit.Assume; @@ -56,15 +55,13 @@ /** * Test all type of documents we have with workplace search */ -public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractFsCrawlerITCase { +public class FsCrawlerTestWorkplaceSearchAllDocumentsIT extends AbstractWorkplaceSearchITCase { private static FsCrawlerImpl crawler = null; private static FsCrawlerDocumentService oldDocumentService; @BeforeClass public static void startCrawling() throws Exception { - checkWorkplaceSettings(); - Path testResourceTarget = rootTmpDir.resolve("resources").resolve("documents"); if (Files.notExists(testResourceTarget)) { copyResourcesToTestDir(); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java index 7c8a88d55..4f81ebd1c 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/FsCrawlerTestWorkplaceSearchIT.java @@ -30,7 +30,6 @@ import fr.pilato.elasticsearch.crawler.fs.settings.FsSettings; import fr.pilato.elasticsearch.crawler.fs.settings.ServerUrl; import fr.pilato.elasticsearch.crawler.fs.settings.WorkplaceSearch; -import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import org.junit.After; import org.junit.Assume; import org.junit.Before; @@ -39,22 +38,19 @@ import java.io.IOException; import java.util.Map; -import static fr.pilato.elasticsearch.crawler.fs.settings.Elasticsearch.NODE_DEFAULT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; /** * Test workplace search */ -public class FsCrawlerTestWorkplaceSearchIT extends AbstractFsCrawlerITCase { +public class FsCrawlerTestWorkplaceSearchIT extends AbstractWorkplaceSearchITCase { private FsCrawlerDocumentService oldDocumentService; private FsSettings fsSettings; @Before public void overrideDocumentService() throws IOException { - checkWorkplaceSettings(); - oldDocumentService = documentService; Fs fs = startCrawlerDefinition().build(); fsSettings = FsSettings.builder(getCrawlerName()) diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java index 7be4fe26c..e698b42a4 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/WPSearchClientIT.java @@ -21,11 +21,9 @@ import com.carrotsearch.randomizedtesting.RandomizedTest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; -import fr.pilato.elasticsearch.crawler.fs.test.integration.AbstractFsCrawlerITCase; import fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient; -import org.junit.AfterClass; +import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; @@ -35,22 +33,20 @@ /** * Test Workplace Search HTTP client */ -public class WPSearchClientIT extends AbstractFsCrawlerITCase { +public class WPSearchClientIT extends AbstractWorkplaceSearchITCase { - private static WPSearchClient client; - - @BeforeClass - public static void startClient() { - checkWorkplaceSettings(); + private WPSearchClient client; + @Before + public void startClient() { client = new WPSearchClient(testWorkplaceAccessToken, testWorkplaceKey) .withHost(testWorkplaceUrl) .withBulkSize(1); client.start(); } - @AfterClass - public static void stopClient() { + @After + public void stopClient() { if (client != null) { client.close(); } diff --git a/integration-tests/it-common/src/main/resources/log4j2.xml b/integration-tests/it-common/src/main/resources/log4j2.xml index 91b2d95ef..c39f3ba76 100644 --- a/integration-tests/it-common/src/main/resources/log4j2.xml +++ b/integration-tests/it-common/src/main/resources/log4j2.xml @@ -48,6 +48,15 @@ + + + + + + + + + diff --git a/pom.xml b/pom.xml index a8dd72b16..a49b88c6d 100644 --- a/pom.xml +++ b/pom.xml @@ -320,7 +320,7 @@ true false - 120 + 600 1000 - 7.10.2 + 7.10.0 6.8.13 ${elasticsearch7.version} From 8385b0e488c64576569e39ded74740c2c8c08476 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 13 Nov 2020 11:54:08 +0100 Subject: [PATCH 53/67] Fix CVE until htmlunit is upgraded --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 203aed2b8..80d26ce9a 100644 --- a/pom.xml +++ b/pom.xml @@ -939,6 +939,12 @@ bcprov-jdk15on 1.67 + + + org.eclipse.jetty.websocket + websocket-client + 9.4.34.v20201102 + From 6eff7e5c640b96d4adbaff69c22ead3be4fcd452 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Mon, 16 Nov 2020 15:53:54 +0100 Subject: [PATCH 54/67] Fix NPE in tests --- .../java/fr/pilato/elasticsearch/crawler/fs/settings/Fs.java | 2 +- .../crawler/fs/settings/FsCrawlerValidatorTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/Fs.java b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/Fs.java index 3aef0eb33..5f4da1199 100644 --- a/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/Fs.java +++ b/settings/src/main/java/fr/pilato/elasticsearch/crawler/fs/settings/Fs.java @@ -68,7 +68,7 @@ public static Builder builder() { public static final Fs DEFAULT = Fs.builder().setUrl(DEFAULT_DIR).setExcludes(DEFAULT_EXCLUDED).build(); public static class Builder { - private String url; + private String url = DEFAULT_DIR; private TimeValue updateRate = TimeValue.timeValueMinutes(15); private List includes = null; private List excludes = null; diff --git a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsCrawlerValidatorTest.java b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsCrawlerValidatorTest.java index 2b8217c6b..a1eefb3ca 100644 --- a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsCrawlerValidatorTest.java +++ b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsCrawlerValidatorTest.java @@ -35,7 +35,7 @@ public class FsCrawlerValidatorTest extends AbstractFSCrawlerTestCase { public void testSettingsValidation() { // Checking default values FsSettings settings = buildSettings(Fs.builder().build(), null, null, null); - assertThat(settings.getFs().getUrl(), nullValue()); + assertThat(settings.getFs().getUrl(), is(Fs.DEFAULT_DIR)); assertThat(FsCrawlerValidator.validateSettings(logger, settings, false), is(false)); assertThat(settings.getFs().getUrl(), is(Fs.DEFAULT_DIR)); assertThat(settings.getElasticsearch().getNodes(), hasItem(Elasticsearch.NODE_DEFAULT)); From 344098de15d9aecc823ead74f8207529bce53760 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 17 Nov 2020 16:20:13 +0100 Subject: [PATCH 55/67] Use `ent_search.auth.native1.source=elasticsearch-native` With that, we will be ready for 7.11 which supports from Docker Compose settings having Workplace Search available from Kibana. --- .../crawler/fs/thirdparty/wpsearch/WPSearchClient.java | 2 +- .../docker-compose-it/docker-compose-enterprise-search.yml | 3 ++- contrib/docker-compose-it/docker-compose-kibana.yml | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index 41dd0ae9b..ef4dbfc9b 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -51,7 +51,7 @@ public class WPSearchClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchClient.class); private final static String CLIENT_NAME = "elastic-workplace-search-java"; - private final static String CLIENT_VERSION = "7.9.1"; + private final static String CLIENT_VERSION = "7.10.0"; private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; public final static String DEFAULT_HOST = "http://127.0.0.1:3002"; diff --git a/contrib/docker-compose-it/docker-compose-enterprise-search.yml b/contrib/docker-compose-it/docker-compose-enterprise-search.yml index dc7cf0925..ac12f9fc5 100644 --- a/contrib/docker-compose-it/docker-compose-enterprise-search.yml +++ b/contrib/docker-compose-it/docker-compose-enterprise-search.yml @@ -5,13 +5,14 @@ services: enterprisesearch: image: $IMG_ENTERPRISE_SEARCH:$ELASTIC_VERSION environment: - - "ent_search.auth.source=standard" - "elasticsearch.username=elastic" - "elasticsearch.password=$ELASTIC_PASSWORD" - "elasticsearch.host=http://elasticsearch:9200" - "allow_es_settings_modification=true" + - "ent_search.auth.native1.source=elasticsearch-native" - "secret_management.encryption_keys=[XYZ]" - "ENT_SEARCH_DEFAULT_PASSWORD=$ELASTIC_PASSWORD" + - "JAVA_OPTS=-Xms2g -Xmx2g" ports: ["$ENTERPRISE_SEARCH_PORT:$ENTERPRISE_SEARCH_PORT"] networks: ['fscrawler_it'] links: ['elasticsearch'] diff --git a/contrib/docker-compose-it/docker-compose-kibana.yml b/contrib/docker-compose-it/docker-compose-kibana.yml index 34dc9755e..8c6282220 100644 --- a/contrib/docker-compose-it/docker-compose-kibana.yml +++ b/contrib/docker-compose-it/docker-compose-kibana.yml @@ -5,9 +5,9 @@ services: kibana: image: $IMG_KIBANA:$ELASTIC_VERSION environment: - - ELASTICSEARCH_USERNAME=elastic - - ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD - - ENTERPRISESEARCH_HOST=http://enterprisesearch:3002 + - "ELASTICSEARCH_USERNAME=elastic" + - "ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD" + - "ENTERPRISESEARCH_HOST=http://enterprisesearch:3002" ports: ['5601:5601'] networks: ['fscrawler_it'] links: ['elasticsearch', 'enterprisesearch'] From ea491348a6e705eb7faaa27ce13476fe84a62721 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 19 Nov 2020 15:56:03 +0100 Subject: [PATCH 56/67] Documentation issue --- docs/source/admin/fs/wpsearch.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/admin/fs/wpsearch.rst b/docs/source/admin/fs/wpsearch.rst index 05a21ed57..b0623a4ed 100644 --- a/docs/source/admin/fs/wpsearch.rst +++ b/docs/source/admin/fs/wpsearch.rst @@ -148,7 +148,7 @@ another url. This can be done by changing the ``workplace_search.url_prefix`` se .. note:: - If ``workplace_search.fs.url`` is set to ``/tmp/es`` and you have indexed a document named + If ``fs.url`` is set to ``/tmp/es`` and you have indexed a document named ``/tmp/es/path/to/foobar.txt``, the default url will be ``http://127.0.0.1/path/to/foobar.txt``. If you change ``workplace_search.url_prefix`` to ``https://repository.mycompany.com/docs``, the From a4ab8d0f75eadf7ff67e969cf2ac1304d1c1dfea Mon Sep 17 00:00:00 2001 From: David Pilato Date: Wed, 2 Dec 2020 15:14:14 +0100 Subject: [PATCH 57/67] Fix httpmime dep It differs between htmlunit and tika parsers --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 7af2bebc7..251d32931 100644 --- a/pom.xml +++ b/pom.xml @@ -892,6 +892,12 @@ httpcore-nio ${httpcore.version} + + + org.apache.httpcomponents + httpmime + ${httpclient.version} + commons-codec commons-codec From 6c106d87f1f6b2f519e757b4336db8e0400e3f13 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Fri, 4 Dec 2020 12:22:45 +0100 Subject: [PATCH 58/67] Bump jersey.version from 2.32 to 3.0.0 Bumps `jersey.version` from 2.32 to 3.0.0. Updates `jersey-container-grizzly2-http` from 2.32 to 3.0.0 Updates `jersey-media-json-jackson` from 2.32 to 3.0.0 Updates `jersey-media-multipart` from 2.32 to 3.0.0 Updates `jersey-hk2` from 2.32 to 3.0.0 Signed-off-by: dependabot-preview[bot] --- .../fs/thirdparty/wpsearch/WPSearchClient.java | 14 +++++++------- .../fs/test/integration/AbstractRestITCase.java | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index ef4dbfc9b..ae1341e21 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -22,18 +22,18 @@ import fr.pilato.elasticsearch.crawler.fs.framework.TimeValue; import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerBulkProcessor; import fr.pilato.elasticsearch.crawler.fs.framework.bulk.FsCrawlerRetryBulkProcessorListener; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import java.io.Closeable; import java.io.IOException; import java.util.Collections; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java index 4da696909..b166eac5b 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractRestITCase.java @@ -20,17 +20,17 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration; import fr.pilato.elasticsearch.crawler.fs.rest.RestJsonProvider; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.junit.AfterClass; import org.junit.BeforeClass; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import java.util.Map; public abstract class AbstractRestITCase extends AbstractITCase { From 0ac4a96e7daa1c9fdcb3a68054d53b52afbecc55 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Thu, 17 Dec 2020 17:04:17 +0100 Subject: [PATCH 59/67] Fix after merging with master --- .../fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java index 212f83c2d..a95ff0642 100644 --- a/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java +++ b/cli/src/main/java/fr/pilato/elasticsearch/crawler/fs/cli/FsCrawlerCli.java @@ -304,7 +304,8 @@ public static void main(String[] args) throws Exception { private static boolean startEsClient(FsCrawlerImpl fsCrawler) { try { - fsCrawler.getEsClient().start(); + fsCrawler.getManagementService().start(); + fsCrawler.getDocumentService().start(); return true; } catch (Exception t) { logger.fatal("We can not start Elasticsearch Client. Exiting.", t); From d4f4bea42b40afe52bab6dfcac3a3c69db3315e1 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 11:33:48 +0100 Subject: [PATCH 60/67] Disable automatic integration tests with Workplace Search We don't have an Admin API and all the tests to fake this API are pretty much unstable. As I want to release a version soonish, we will be running the IT with Workplace Search only manually using the CLI options `-Dtests.workplace.access_token=XXX -Dtests.workplace.key=YYY`. We might test all that using a cloud always running instance... --- 3rdparty/workplacesearch-client/pom.xml | 6 - .../wpsearch/WPSearchAdminClient.java | 108 +++++------------- .../AbstractWorkplaceSearchITCase.java | 13 ++- integration-tests/it-v7/pom.xml | 6 +- pom.xml | 15 --- 5 files changed, 40 insertions(+), 108 deletions(-) diff --git a/3rdparty/workplacesearch-client/pom.xml b/3rdparty/workplacesearch-client/pom.xml index 634e5f405..953baf39e 100644 --- a/3rdparty/workplacesearch-client/pom.xml +++ b/3rdparty/workplacesearch-client/pom.xml @@ -28,12 +28,6 @@ org.glassfish.jersey.media jersey-media-json-jackson - - - net.sourceforge.htmlunit - htmlunit - - diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java index e09355710..6b92e94af 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java @@ -20,28 +20,20 @@ package fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch; import com.fasterxml.jackson.databind.json.JsonMapper; -import com.gargoylesoftware.htmlunit.HttpMethod; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebResponse; -import com.gargoylesoftware.htmlunit.html.HtmlButton; -import com.gargoylesoftware.htmlunit.html.HtmlForm; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; -import com.gargoylesoftware.htmlunit.util.Cookie; -import fr.pilato.elasticsearch.crawler.fs.framework.Waiter; +import jakarta.ws.rs.HttpMethod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.Closeable; import java.io.IOException; -import java.net.URL; import java.util.Map; -import java.util.concurrent.TimeUnit; import static fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient.DEFAULT_HOST; +/** + * This class is useless at the moment as we don't have an Admin API yet + * TODO: implement when we have an Admin API for Workplace Search + */ public class WPSearchAdminClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchAdminClient.class); @@ -51,9 +43,6 @@ public class WPSearchAdminClient implements Closeable { private String host = DEFAULT_HOST; private String username = DEFAULT_USERNAME; private String password = DEFAULT_PASSWORD; - WebClient webClient = null; - String csrfToken = null; - Cookie session = null; /** * Define a specific host. Defaults to "http://localhost:3002" @@ -86,21 +75,16 @@ public WPSearchAdminClient withPassword(String password) { } public void start() throws Exception { - webClient = new WebClient(); + // Create the client login(username, password); } @Override public void close() { - if (webClient != null) { - webClient.close(); - } + // Close the client } private void checkStarted() { - if (webClient == null) { - throw new RuntimeException("start() must be called before calling any API."); - } } public Map createCustomSource(String sourceName) throws Exception { @@ -108,6 +92,12 @@ public Map createCustomSource(String sourceName) throws Exceptio String response = callApi(HttpMethod.POST, "/ws/org/sources/form_create", "{service_type: \"custom\", name: \"" + sourceName + "\"}"); + // TODO: remove when we have an Admin API for Workplace Search + response = "{" + + "\"id\":\"FAKE_ID\"," + + "\"acces_token\":\"FAKE_TOKEN\"," + + "\"key\":\"FAKE_KEY\"" + + "}"; JsonMapper mapper = JsonMapper.builder().build(); Map map = mapper.readValue(response, Map.class); @@ -125,69 +115,23 @@ public void removeCustomSource(String id) throws Exception { } public void login(String username, String password) throws Exception { - HtmlPage page = openPage("/login"); - - HtmlForm form = page.getForms().get(0); - HtmlTextInput inputEmail = form.getOneHtmlElementByAttribute("input", "type", "text"); - inputEmail.setText(username); - HtmlPasswordInput inputPassword = form.getOneHtmlElementByAttribute("input", "type", "password"); - inputPassword.setText(password); - HtmlButton submit = form.getOneHtmlElementByAttribute("button", "type", "submit"); - - // Log in - submit.click(); - - HtmlPage entSelect = new Waiter(10, TimeUnit.SECONDS).awaitBusy(() -> { - try { - // Wait to be logged in and enter the product selection page - HtmlPage tryPage = openPage("/ent/select"); - if (tryPage == null || !tryPage.getUrl().getPath().equals("/ent/select")) { - logger.debug("We did not found yet the page we are waiting for: /ent/select. We got {}", - tryPage == null ? "null" : tryPage.getUrl().getPath()); - return null; - } - - logger.debug("We found the page we are looking for: {}", tryPage.getUrl().getPath()); - return tryPage; - } catch (Exception e) { - logger.error("We got an error while waiting for Enterprise Search to start", e); - } - return null; - }); - - if (entSelect == null) { - // We have not been able to connect to the service. Let's fail the process. - throw new RuntimeException("Can't open a session on " + host); - } - - csrfToken = entSelect.getElementByName("csrf-token").getAttribute("content"); - session = webClient.getCookieManager().getCookie("_st_togo_session"); + } - private String callApi(HttpMethod method, String url, String data) + private String callApi(String method, String url, String data) throws IOException { logger.debug("Calling {}", url); - WebRequest webRequest = new WebRequest(new URL(host + url)); - webRequest.setHttpMethod(method); - if (data != null) { - webRequest.setRequestBody(data); - webRequest.setAdditionalHeader("Content-Type", "application/json;charset=UTF-8"); - } - webRequest.setAdditionalHeader("Cookie", session.getName() + "=" + session.getValue()); - webRequest.setAdditionalHeader("x-csrf-token", csrfToken); - webRequest.setAdditionalHeader("Accept", "application/json, text/plain, */*"); - WebResponse webResponse = webClient.loadWebResponse(webRequest); - String response = webResponse.getContentAsString(); - logger.debug("Response: {}", response); - return response; - } - private HtmlPage openPage(String url) throws IOException { - HtmlPage page = webClient.getPage(host + url); - if (page == null || page.getBody() == null) { - return null; - } - logger.debug("Page {}: {}", page.getBaseURL(), page.getBody().asText()); - return page; + // Create a web request with +// WebRequest webRequest = new WebRequest(new URL(host + url)); +// webRequest.setHttpMethod(method); +// if (data != null) { +// webRequest.setRequestBody(data); +// webRequest.setAdditionalHeader("Content-Type", "application/json;charset=UTF-8"); +// } +// webRequest.setAdditionalHeader("Cookie", session.getName() + "=" + session.getValue()); +// webRequest.setAdditionalHeader("x-csrf-token", csrfToken); +// webRequest.setAdditionalHeader("Accept", "application/json, text/plain, */*"); + return null; } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java index f8c58bf1a..c8951e89b 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java @@ -27,7 +27,7 @@ import java.util.Map; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.*; import static org.junit.Assume.assumeNoException; public class AbstractWorkplaceSearchITCase extends AbstractFsCrawlerITCase { @@ -52,10 +52,15 @@ public static void createCustomSource() throws Exception { testWorkplaceAccessToken = (String) customSource.get("accessToken"); testWorkplaceKey = (String) customSource.get("key"); + // Because we don't have an admin client yet for Workplace Search, we will be getting manually + // the custom source information from the command line as options. + testWorkplaceAccessToken = System.getProperty("tests.workplace.access_token"); + testWorkplaceKey = System.getProperty("tests.workplace.key"); + assertThat(customSourceId, notNullValue()); - assertThat(testWorkplaceAccessToken, notNullValue()); - assertThat(testWorkplaceKey, notNullValue()); - } catch (Exception e) { + assertThat(testWorkplaceAccessToken, not(isEmptyOrNullString())); + assertThat(testWorkplaceKey, not(isEmptyOrNullString())); + } catch (AssertionError e) { assumeNoException("We are skipping the test as we were not able to create a Workplace Search client", e); } } diff --git a/integration-tests/it-v7/pom.xml b/integration-tests/it-v7/pom.xml index 96b3acf52..ad26bc364 100644 --- a/integration-tests/it-v7/pom.xml +++ b/integration-tests/it-v7/pom.xml @@ -111,7 +111,8 @@ elasticsearch - enterprisesearch + + @@ -124,10 +125,13 @@ http://localhost:9200/ 401 + + diff --git a/pom.xml b/pom.xml index 8faffa438..39aa04e54 100644 --- a/pom.xml +++ b/pom.xml @@ -920,21 +920,6 @@ randomizedtesting-runner 2.7.8 - - - net.sourceforge.htmlunit - htmlunit - 2.43.0 - - - - org.apache.commons - commons-lang3 - 3.11 - org.bouncycastle From 22f0125cf62d4d45247c2547ead9ecf7d725cbde Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 11:42:32 +0100 Subject: [PATCH 61/67] Update JpegVersion --- docs/source/fscrawler.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/fscrawler.ini b/docs/source/fscrawler.ini index bf8b568f5..de46b7589 100644 --- a/docs/source/fscrawler.ini +++ b/docs/source/fscrawler.ini @@ -7,4 +7,4 @@ ElasticsearchVersion6=6.8.13 ElasticsearchVersion7=7.10.1 LevigoVersion=2.0 TiffVersion=1.4.0 -JpegVersion=1.3.0 +JpegVersion=1.4.0 From 0451cf6d90a158aa00021944feb5e06a3b1d7332 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 12:09:58 +0100 Subject: [PATCH 62/67] Extract wpsearch client version from Elastic version --- 3rdparty/workplacesearch-client/pom.xml | 9 +++++++++ .../fs/thirdparty/wpsearch/WPSearchClient.java | 13 ++++++++++++- .../src/main/resources/workplacesearch.properties | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 3rdparty/workplacesearch-client/src/main/resources/workplacesearch.properties diff --git a/3rdparty/workplacesearch-client/pom.xml b/3rdparty/workplacesearch-client/pom.xml index 953baf39e..14a7d56b9 100644 --- a/3rdparty/workplacesearch-client/pom.xml +++ b/3rdparty/workplacesearch-client/pom.xml @@ -12,6 +12,15 @@ fscrawler-workplacesearch-client FSCrawler Workplace Search Client + + + + src/main/resources + true + + + + diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java index ae1341e21..41d7f4a96 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchClient.java @@ -40,6 +40,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; + +import static fr.pilato.elasticsearch.crawler.fs.framework.FsCrawlerUtil.readPropertiesFromClassLoader; /** * Workplace Search Java client @@ -50,8 +53,16 @@ public class WPSearchClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchClient.class); + private final static String WORKPLACESEARCH_PROPERTIES = "workplacesearch.properties"; + private static final Properties properties; + private final static String CLIENT_VERSION; + + static { + properties = readPropertiesFromClassLoader(WORKPLACESEARCH_PROPERTIES); + CLIENT_VERSION = properties.getProperty("workplacesearch.version"); + } + private final static String CLIENT_NAME = "elastic-workplace-search-java"; - private final static String CLIENT_VERSION = "7.10.0"; private final static String DEFAULT_ENDPOINT = "/api/ws/v1/"; public final static String DEFAULT_HOST = "http://127.0.0.1:3002"; diff --git a/3rdparty/workplacesearch-client/src/main/resources/workplacesearch.properties b/3rdparty/workplacesearch-client/src/main/resources/workplacesearch.properties new file mode 100644 index 000000000..750b7bce1 --- /dev/null +++ b/3rdparty/workplacesearch-client/src/main/resources/workplacesearch.properties @@ -0,0 +1 @@ +workplacesearch.version=${elasticsearch.version} From 86e7a52a55a13d33dd03f61756ec309a60fe2a33 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 12:10:17 +0100 Subject: [PATCH 63/67] Update to 7.10.1 --- contrib/docker-compose-it/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/docker-compose-it/.env b/contrib/docker-compose-it/.env index a4f0c25e6..a10102699 100644 --- a/contrib/docker-compose-it/.env +++ b/contrib/docker-compose-it/.env @@ -1,5 +1,5 @@ # Elastic Stack settings -ELASTIC_VERSION=7.10.0 +ELASTIC_VERSION=7.10.1 ELASTIC_PASSWORD=changeme # Elasticsearch settings From b350d2e356ba84f0ac321611ab3906b5300ce206 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 12:10:48 +0100 Subject: [PATCH 64/67] Clean non needed loggers (as we removed htmlunit) --- .../it-common/src/main/resources/log4j2.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/integration-tests/it-common/src/main/resources/log4j2.xml b/integration-tests/it-common/src/main/resources/log4j2.xml index c39f3ba76..91b2d95ef 100644 --- a/integration-tests/it-common/src/main/resources/log4j2.xml +++ b/integration-tests/it-common/src/main/resources/log4j2.xml @@ -48,15 +48,6 @@ - - - - - - - - - From c4a2b79840c6c79ddded73968e469f19c73c3561 Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 12:39:33 +0100 Subject: [PATCH 65/67] Fix some Sonar issues --- .../fs/client/v7/WorkplaceSearchClientV7.java | 12 ++++++++---- .../AbstractWorkplaceSearchITCase.java | 10 +++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java index 90d549644..26610e5ab 100644 --- a/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java +++ b/elasticsearch-client/elasticsearch-client-v7/src/main/java/fr/pilato/elasticsearch/crawler/fs/client/v7/WorkplaceSearchClientV7.java @@ -49,7 +49,7 @@ public class WorkplaceSearchClientV7 implements WorkplaceSearchClient { private static final Logger logger = LogManager.getLogger(WorkplaceSearchClientV7.class); private final Path config; private final FsSettings settings; - private static final SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZZZZZ"); + private final SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZZZZZ"); private ElasticsearchClient esClient = null; private WPSearchClient wpSearchClient = null; @@ -66,6 +66,7 @@ public String compatibleVersion() { @Override public void start() throws IOException { + logger.debug("Starting Workplace Search V7 client"); wpSearchClient = new WPSearchClient( settings.getWorkplaceSearch().getAccessToken(), settings.getWorkplaceSearch().getKey()) @@ -75,6 +76,7 @@ public void start() throws IOException { wpSearchClient.start(); esClient = ElasticsearchClientUtil.getInstance(config, settings); esClient.start(); + logger.debug("Workplace Search V7 client started"); } @Override @@ -191,12 +193,14 @@ public void delete(String index, String id) { @Override public void close() throws IOException { + logger.debug("Closing Workplace Search V7 client"); if (esClient != null) { esClient.close(); } if (wpSearchClient != null) { wpSearchClient.close(); } + logger.debug("Workplace Search V7 client closed"); } public void createIndices() throws Exception { @@ -227,17 +231,17 @@ public void performLowLevelRequest(String method, String endpoint, String jsonEn } @Override - public ESSearchHit get(String index, String id) throws IOException { + public ESSearchHit get(String index, String id) { throw new RuntimeException("Not implemented yet"); } @Override - public boolean exists(String index, String id) throws IOException { + public boolean exists(String index, String id) { throw new RuntimeException("Not implemented yet"); // return esClient.exists(index, id); } - static String toRFC3339(Date d) + private String toRFC3339(Date d) { return rfc3339.format(d).replaceAll("(\\d\\d)(\\d\\d)$", "$1:$2"); } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java index c8951e89b..d60bd5aa3 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java @@ -67,12 +67,12 @@ public static void createCustomSource() throws Exception { @AfterClass public static void removeCustomSource() { - try { - adminClient.removeCustomSource(customSourceId); - } catch (Exception e) { - staticLogger.warn("We have not been able to remove {}: {}", customSourceId, e.getMessage()); - } if (adminClient != null) { + try { + adminClient.removeCustomSource(customSourceId); + } catch (Exception e) { + staticLogger.warn("We have not been able to remove {}: {}", customSourceId, e.getMessage()); + } adminClient.close(); adminClient = null; } From d9c44501f80de3978f08860b4e97ad3acf5bac1b Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 15:47:03 +0100 Subject: [PATCH 66/67] Fix some Sonar issues --- .../wpsearch/WPSearchAdminClient.java | 28 ++++++++++--------- .../crawler/fs/beans/DocParser.java | 2 -- .../crawler/fs/beans/PathParser.java | 2 -- .../fs/service/FsCrawlerDocumentService.java | 2 -- ...lerManagementServiceElasticsearchImpl.java | 6 ++-- .../crawler/fs/framework/bulk/Engine.java | 6 ++-- ...sCrawlerAdvancedBulkProcessorListener.java | 8 +++--- .../framework/bulk/FsCrawlerBulkRequest.java | 2 +- .../framework/bulk/FsCrawlerBulkResponse.java | 9 ++---- .../FsCrawlerRetryBulkProcessorListener.java | 10 +++---- .../FsCrawlerSimpleBulkProcessorListener.java | 16 +++++------ .../fs/test/integration/AbstractITCase.java | 1 - .../elasticsearch/ElasticsearchClientIT.java | 1 - .../FsCrawlerTestDefaultsIT.java | 1 - .../FsCrawlerTestIgnoreFoldersIT.java | 1 - .../AbstractWorkplaceSearchITCase.java | 6 ++-- 16 files changed, 46 insertions(+), 55 deletions(-) diff --git a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java index 6b92e94af..2d81c5e69 100644 --- a/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java +++ b/3rdparty/workplacesearch-client/src/main/java/fr/pilato/elasticsearch/crawler/fs/thirdparty/wpsearch/WPSearchAdminClient.java @@ -26,6 +26,7 @@ import java.io.Closeable; import java.io.IOException; +import java.net.URL; import java.util.Map; import static fr.pilato.elasticsearch.crawler.fs.thirdparty.wpsearch.WPSearchClient.DEFAULT_HOST; @@ -37,8 +38,8 @@ public class WPSearchAdminClient implements Closeable { private static final Logger logger = LogManager.getLogger(WPSearchAdminClient.class); - private final static String DEFAULT_USERNAME = "enterprise_search"; - private final static String DEFAULT_PASSWORD = "changeme"; + private static final String DEFAULT_USERNAME = "enterprise_search"; + private static final String DEFAULT_PASSWORD = "changeme"; private String host = DEFAULT_HOST; private String username = DEFAULT_USERNAME; @@ -85,6 +86,7 @@ public void close() { } private void checkStarted() { + // This method is empty as we are waiting for an Admin API for Workplace Search } public Map createCustomSource(String sourceName) throws Exception { @@ -114,24 +116,24 @@ public void removeCustomSource(String id) throws Exception { callApi(HttpMethod.DELETE, "/ws/org/sources/" + id, null); } - public void login(String username, String password) throws Exception { - + public void login(String username, String password) { + logger.debug("login to Workplace Search as user {}", username); } private String callApi(String method, String url, String data) throws IOException { logger.debug("Calling {}", url); + logger.debug("Faking a {} call to {}", method, new URL(host + url)); + // Create a web request with -// WebRequest webRequest = new WebRequest(new URL(host + url)); -// webRequest.setHttpMethod(method); -// if (data != null) { -// webRequest.setRequestBody(data); -// webRequest.setAdditionalHeader("Content-Type", "application/json;charset=UTF-8"); -// } -// webRequest.setAdditionalHeader("Cookie", session.getName() + "=" + session.getValue()); -// webRequest.setAdditionalHeader("x-csrf-token", csrfToken); -// webRequest.setAdditionalHeader("Accept", "application/json, text/plain, */*"); +// url: host + url +// httpMethod: method; +// requestBody: data +// additionalHeader: Content-Type: application/json;charset=UTF-8 +// additionalHeader: Cookie: session.getName()=session.getValue() +// additionalHeader: x-csrf-token: csrfToken +// additionalHeader: Accept: application/json, text/plain, */* return null; } } diff --git a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java index d4c3809e8..9ebe05b4e 100644 --- a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java +++ b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/DocParser.java @@ -19,8 +19,6 @@ package fr.pilato.elasticsearch.crawler.fs.beans; -import com.fasterxml.jackson.core.JsonProcessingException; - import java.io.IOException; import java.util.Map; diff --git a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java index 44901b4da..e280158b8 100644 --- a/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java +++ b/beans/src/main/java/fr/pilato/elasticsearch/crawler/fs/beans/PathParser.java @@ -19,8 +19,6 @@ package fr.pilato.elasticsearch.crawler.fs.beans; -import com.fasterxml.jackson.core.JsonProcessingException; - import java.io.IOException; import static fr.pilato.elasticsearch.crawler.fs.framework.MetaParser.prettyMapper; diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java index 39a3d737c..79324d5fa 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerDocumentService.java @@ -21,8 +21,6 @@ import fr.pilato.elasticsearch.crawler.fs.beans.Doc; -import java.io.IOException; - public interface FsCrawlerDocumentService extends FsCrawlerService { /** * Create a schema for the dataset. This is called when the service starts diff --git a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java index 4a9104075..2fb0ecdaa 100644 --- a/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java +++ b/core/src/main/java/fr/pilato/elasticsearch/crawler/fs/service/FsCrawlerManagementServiceElasticsearchImpl.java @@ -76,7 +76,10 @@ public void close() throws IOException { public Collection getFileDirectory(String path) throws Exception { - logger.trace("Querying elasticsearch for files in dir [{}:{}]", PATH_ROOT, SignTool.sign(path)); + if (logger.isTraceEnabled()) { + logger.trace("Querying elasticsearch for files in dir [{}:{}]", PATH_ROOT, SignTool.sign(path)); + } + Collection files = new ArrayList<>(); ESSearchResponse response = client.search( new ESSearchRequest() @@ -85,7 +88,6 @@ public Collection getFileDirectory(String path) .addField(FILE_FILENAME) .withESQuery(new ESTermQuery(PATH_ROOT, SignTool.sign(path)))); - logger.trace("Response [{}]", response.toString()); if (response.getHits() != null) { for (ESSearchHit hit : response.getHits()) { String name; diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java index 78b7c015f..eb4d3959c 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/Engine.java @@ -23,12 +23,12 @@ * Defines an Engine which is responsible to execute a bulk operation */ public interface Engine, - Req extends FsCrawlerBulkRequest, - Res extends FsCrawlerBulkResponse> { + REQ extends FsCrawlerBulkRequest, + RES extends FsCrawlerBulkResponse> { /** * Actually execute the Bulk Request behind the scene * @param request The request to execute * @return The outcome */ - Res bulk(Req request); + RES bulk(REQ request); } diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java index c9497b996..eddf889df 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerAdvancedBulkProcessorListener.java @@ -32,9 +32,9 @@ */ public class FsCrawlerAdvancedBulkProcessorListener< O extends FsCrawlerOperation, - Req extends FsCrawlerBulkRequest, - Res extends FsCrawlerBulkResponse - > extends FsCrawlerSimpleBulkProcessorListener { + REQ extends FsCrawlerBulkRequest, + RES extends FsCrawlerBulkResponse + > extends FsCrawlerSimpleBulkProcessorListener { private static final Logger logger = LogManager.getLogger(FsCrawlerAdvancedBulkProcessorListener.class); private final AtomicInteger successiveErrors = new AtomicInteger(0); @@ -44,7 +44,7 @@ public int getErrors() { } @Override - public void afterBulk(long executionId, Req request, Res response) { + public void afterBulk(long executionId, REQ request, RES response) { super.afterBulk(executionId, request, response); if (response.hasFailures()) { int previousErrors = successiveErrors.getAndIncrement(); diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java index 5fb2570af..17247e547 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkRequest.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; -abstract public class FsCrawlerBulkRequest> { +public abstract class FsCrawlerBulkRequest> { private final List operations = new ArrayList<>(); diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java index 26e3ea4f7..d3a030ac3 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerBulkResponse.java @@ -25,7 +25,7 @@ import java.util.Arrays; @SuppressWarnings("CanBeFinal") -abstract public class FsCrawlerBulkResponse> { +public abstract class FsCrawlerBulkResponse> { private static final Logger logger = LogManager.getLogger(FsCrawlerBulkResponse.class); @@ -124,19 +124,16 @@ public void setError(Object error) { @Override public String toString() { - String sb = "BulkItemResponse{" + "failed=" + failed + + return "BulkItemResponse{" + "failed=" + failed + ", operation='" + operation + '\'' + ", opType=" + opType + ", failureMessage='" + failureMessage + '\'' + '}'; - return sb; } } @Override public String toString() { - String sb = "BulkResponse{" + "items=" + (items == null ? "null" : Arrays.asList(items).toString()) + - '}'; - return sb; + return "BulkResponse{" + "items=" + (items == null ? "null" : Arrays.asList(items).toString()) + '}'; } } diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java index 5d205c072..980fa3258 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerRetryBulkProcessorListener.java @@ -28,17 +28,17 @@ */ public class FsCrawlerRetryBulkProcessorListener< O extends FsCrawlerOperation, - Req extends FsCrawlerBulkRequest, - Res extends FsCrawlerBulkResponse - > extends FsCrawlerAdvancedBulkProcessorListener { + REQ extends FsCrawlerBulkRequest, + RES extends FsCrawlerBulkResponse + > extends FsCrawlerAdvancedBulkProcessorListener { private static final Logger logger = LogManager.getLogger(FsCrawlerRetryBulkProcessorListener.class); @Override - public void afterBulk(long executionId, Req request, Res response) { + public void afterBulk(long executionId, REQ request, RES response) { super.afterBulk(executionId, request, response); if (response.hasFailures()) { - for (Res.BulkItemResponse item : response.getItems()) { + for (RES.BulkItemResponse item : response.getItems()) { if (item.isFailed() && item.getFailureMessage().contains("es_rejected_execution_exception")) { logger.debug("We are going to retry document [{}] because of [{}]", item.getOperation(), item.getFailureMessage()); diff --git a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java index 82c25bb38..284628863 100644 --- a/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java +++ b/framework/src/main/java/fr/pilato/elasticsearch/crawler/fs/framework/bulk/FsCrawlerSimpleBulkProcessorListener.java @@ -24,20 +24,20 @@ public class FsCrawlerSimpleBulkProcessorListener< O extends FsCrawlerOperation, - Req extends FsCrawlerBulkRequest, - Res extends FsCrawlerBulkResponse - > implements FsCrawlerBulkProcessor.Listener { + REQ extends FsCrawlerBulkRequest, + RES extends FsCrawlerBulkResponse + > implements FsCrawlerBulkProcessor.Listener { private static final Logger logger = LogManager.getLogger(FsCrawlerSimpleBulkProcessorListener.class); - protected FsCrawlerBulkProcessor bulkProcessor; + protected FsCrawlerBulkProcessor bulkProcessor; @Override - public void beforeBulk(long executionId, Req request) { + public void beforeBulk(long executionId, REQ request) { logger.debug("Going to execute new bulk composed of {} actions", request.numberOfActions()); } @Override - public void afterBulk(long executionId, Req request, Res response) { + public void afterBulk(long executionId, REQ request, RES response) { logger.debug("Executed bulk composed of {} actions", request.numberOfActions()); if (response.hasFailures()) { logger.warn("There was failures while executing bulk", response.buildFailureMessage()); @@ -53,12 +53,12 @@ public void afterBulk(long executionId, Req request, Res response) { } @Override - public void afterBulk(long executionId, Req request, Throwable failure) { + public void afterBulk(long executionId, REQ request, Throwable failure) { logger.warn("Error executing bulk", failure); } @Override - public void setBulkProcessor(FsCrawlerBulkProcessor bulkProcessor) { + public void setBulkProcessor(FsCrawlerBulkProcessor bulkProcessor) { this.bulkProcessor = bulkProcessor; } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java index 0321a4f24..33f911d93 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/AbstractITCase.java @@ -346,7 +346,6 @@ public static ESSearchResponse countTestHelper(final ESSearchRequest request, fi staticLogger.warn("error caught", e); return -1; } - staticLogger.trace("result {}", response[0].toString()); totalHits = response[0].getTotalHits(); staticLogger.debug("got so far [{}] hits on expected [{}]", totalHits, expected); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java index 46608504d..6626343f0 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/ElasticsearchClientIT.java @@ -19,7 +19,6 @@ package fr.pilato.elasticsearch.crawler.fs.test.integration.elasticsearch; -import fr.pilato.elasticsearch.crawler.fs.beans.Doc; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchRequest; import fr.pilato.elasticsearch.crawler.fs.client.ESSearchResponse; import fr.pilato.elasticsearch.crawler.fs.client.ESTermQuery; diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java index f65dda795..65a7164da 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestDefaultsIT.java @@ -103,7 +103,6 @@ public void test_highlight_documents() throws Exception { .withIndex(getCrawlerName()) .withESQuery(new ESMatchQuery("content", "exemplo")) .addHighlighter("content")); - staticLogger.trace("result {}", response.toString()); assertThat(response.getTotalHits(), is(1L)); ESSearchHit hit = response.getHits().get(0); diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java index f00add962..7a697be47 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/elasticsearch/FsCrawlerTestIgnoreFoldersIT.java @@ -49,7 +49,6 @@ public void test_ignore_folders() throws Exception { // We expect having no folders ESSearchResponse response = documentService.getClient().search(new ESSearchRequest().withIndex(getCrawlerName() + INDEX_SUFFIX_FOLDER)); - staticLogger.trace("result {}", response.toString()); assertThat(response.getTotalHits(), is(0L)); } } diff --git a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java index d60bd5aa3..de6524547 100644 --- a/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java +++ b/integration-tests/it-common/src/main/java/fr/pilato/elasticsearch/crawler/fs/test/integration/workplacesearch/AbstractWorkplaceSearchITCase.java @@ -33,12 +33,12 @@ public class AbstractWorkplaceSearchITCase extends AbstractFsCrawlerITCase { private final static String DEFAULT_TEST_WPSEARCH_URL = "http://127.0.0.1:3002"; - protected final static String testWorkplaceUrl = System.getProperty("tests.workplace.url", DEFAULT_TEST_WPSEARCH_URL); + protected static String testWorkplaceUrl = System.getProperty("tests.workplace.url", DEFAULT_TEST_WPSEARCH_URL); + protected static String testWorkplaceAccessToken; + protected static String testWorkplaceKey; protected static WPSearchAdminClient adminClient; private static String customSourceId; - protected static String testWorkplaceAccessToken; - protected static String testWorkplaceKey; @BeforeClass public static void createCustomSource() throws Exception { From ec4f579164926ebb290a232b6302308efc19615d Mon Sep 17 00:00:00 2001 From: David Pilato Date: Tue, 22 Dec 2020 15:52:57 +0100 Subject: [PATCH 67/67] Use a generic URL --- .../elasticsearch/crawler/fs/settings/FsSettingsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java index dafe3ce62..7b30c5ddf 100644 --- a/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java +++ b/settings/src/test/java/fr/pilato/elasticsearch/crawler/fs/settings/FsSettingsTest.java @@ -31,10 +31,10 @@ public class FsSettingsTest extends AbstractFSCrawlerTestCase { @Test public void testCloudId() { - String cloudId = "wpsearch:ZXUtd2VzdC0zLmF3cy5lbGFzdGljLWNsb3VkLmNvbTo5MjQzJDg4NTYwNTJmNDBkNjQ4YjE5Mzk1ZDQ5YTViZjgwNTA4JDJhYjJmYTU5N2RiNDQwNjJhMGZmMjY2ZTBkZTEwY2Fm"; + String cloudId = "foobar:dXMtZWFzdC0xLmF3cy5mb3VuZC5pbyRmb29iYXJlbGFzdGljc2VhcmNoJGZvb2JhcmtpYmFuYQ=="; String httpHost = decodeCloudId(cloudId); - assertThat(httpHost, is("https://8856052f40d648b19395d49a5bf80508.eu-west-3.aws.elastic-cloud.com:9243")); + assertThat(httpHost, is("https://foobarelasticsearch.us-east-1.aws.found.io")); } }