From 071bff50bd8bbd0f3675bff2166a647b18d442c8 Mon Sep 17 00:00:00 2001 From: allanmckenzie Date: Tue, 28 Jul 2026 09:33:59 +0100 Subject: [PATCH] Elasticsearch client migration 7.17 -> 9.2.2; track released framework chain - unifiedsearch-client + unifiedsearch-test-utils migrated from RestHighLevelClient to co.elastic.clients ElasticsearchClient (ES 8/9 Java API Client): new BulkRequest / SearchResponse(JsonData) / indices() APIs, javax->jakarta. - Consume ES 9.2.2 dependency management via cpp.common-bom 25.104.0-M3. - Advance all framework references to released milestones (platform tracks the framework chain): parent-pom M1->M2, file-service M6->M7, framework-libraries M10->M11, framework M3->M4, event-store M4->M5. - Bump cross-context RAML interfaces to latest released (enforce-moj-latest-interfaces): hearing 17.104.176->17.104.180, referencedata 17.103.133->17.104.137, assignment 8.0.5->8.0.7, usersgroups 17.104.48->17.104.50, progression 17.0.262->17.0.279, sjp 17.103.169->17.104.181. Full reactor build green (mvn clean install -Drun.it=false). --- CHANGELOG.md | 7 + .../unifiedsearch-healthchecks/pom.xml | 4 +- .../ElasticSearchHealthQuerier.java | 15 +- .../ElasticSearchHealthcheck.java | 25 ++- .../ElasticSearchHealthcheckTest.java | 39 ++--- pom.xml | 24 +-- .../unifiedsearch-client/pom.xml | 19 ++- .../client/factory/GetRequestFactory.java | 6 +- .../client/factory/IndexRequestFactory.java | 26 ++- .../client/factory/UpdateRequestFactory.java | 19 ++- .../client/index/CpsCaseDocumentService.java | 12 +- .../index/CrimeCaseDocumentService.java | 12 +- .../client/index/DocumentIndexer.java | 3 +- .../client/index/DocumentService.java | 39 +++-- .../index/HighLevelRestClientFactory.java | 31 +++- .../HighLevelRestClientProvider.java | 4 +- ...fiedSearchHighLevelRestClientProducer.java | 12 +- .../retry/IngestionResponseVerifier.java | 18 +- .../search/DefaultUnifiedSearchService.java | 56 +++--- .../client/search/SearchRequestFactory.java | 38 ++--- .../client/search/SearchResultConverter.java | 71 +++++--- .../client/search/UnifiedSearchService.java | 12 +- .../transformer/CaseDetailsTransformer.java | 4 +- .../cps/CpsCaseDetailsTransformer.java | 4 +- .../client/factory/GetRequestFactoryTest.java | 2 +- .../factory/IndexRequestFactoryTest.java | 9 +- .../factory/UpdateRequestFactoryTest.java | 16 +- .../client/index/DocumentServiceTest.java | 36 ++-- .../index/HighLevelRestClientFactoryTest.java | 9 +- .../UnifiedSearchIndexerProducerTest.java | 1 - .../HighLevelRestClientProviderTest.java | 9 +- ...SearchHighLevelRestClientProducerTest.java | 22 +-- .../retry/IngestionResponseVerifierTest.java | 18 +- .../DefaultUnifiedSearchServiceTest.java | 161 ++++++++++-------- .../search/SearchRequestFactoryTest.java | 89 +++++----- .../search/SearchResultConverterTest.java | 51 +++--- .../CaseDetailsTransformerTest.java | 8 +- .../cps/CpsCaseDetailsTransformerTest.java | 9 +- .../unifiedsearch-test-utils/pom.xml | 8 +- .../test/util/ingest/ElasticSearchClient.java | 36 +++- .../ingest/ElasticSearchIndexCreatorUtil.java | 26 +-- .../ingest/ElasticSearchIndexFinderUtil.java | 57 ++++--- .../ElasticSearchIndexIngestorUtil.java | 79 +++++---- .../ingest/ElasticSearchIndexRemoverUtil.java | 26 +-- .../util/ingest/document/CaseDocument.java | 19 +++ .../util/ingest/document/OffenceDocument.java | 23 +++ .../util/ingest/document/PartyDocument.java | 27 +++ .../ingest/document/cps/CaseDocument.java | 24 +++ .../ingest/document/cps/OffenceDocument.java | 13 ++ .../ingest/document/cps/PartyDocument.java | 17 ++ .../util/ingest/ElasticSearchClientTest.java | 12 +- .../ElasticSearchIndexCreatorUtilTest.java | 11 +- .../ElasticSearchIndexFinderUtilTest.java | 47 ++--- .../ElasticSearchIndexIngestorUtilTest.java | 43 ++--- .../ElasticSearchIndexRemoverUtilTest.java | 23 ++- 55 files changed, 853 insertions(+), 578 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 025e19e2..fd4ca155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to ## [Unreleased] +## [25.104.0-M9] - 2026-07-28 +### Changed +- **Elasticsearch client migration `7.17` → `9.2.2`** (cherry-picked from Java-17 DD-41592): `RestHighLevelClient` → `co.elastic.clients.elasticsearch.ElasticsearchClient` across the `unifiedsearch-client` library (DocumentService, DefaultUnifiedSearchService, SearchRequestFactory/SearchResultConverter, client producers/factories) and `unifiedsearch-test-utils`; new `BulkRequest` / `SearchResponse(JsonData)` / `indices()` APIs. `javax`→`jakarta` conflicts resolved during the port. +- Bumped `cpp.common-bom.version` `25.104.0-M2` → `25.104.0-M3` — picks up ES 9.2.2 dependency management + jackson `2.21.5` (**CVE-2026-54515**). +- Advanced all framework references to the released milestones (platform tracks the framework chain): parent `parent-pom` `M1` → `M2`, `file-service.version` `M6` → `M7`, `framework-libraries.version` `M10` → `M11`, `framework.version` (cp-microservice-framework) `M3` → `M4`, `event-store.version` `M4` → `M5`. Carries jackson `2.21.5` (**CVE-2026-54515**), the `org.junit:junit-bom` import, maven-shade `3.6.0` / jacoco `0.8.14`, and the event-store `EntityManagerFlushInterceptorPresenceVerifier` deploy-guard. +- Bumped cross-context RAML interfaces to their latest released versions (required by `enforce-moj-latest-interfaces`): `hearing.version` `17.104.176` → `17.104.180`, `referencedata.version` `17.103.133` → `17.104.137`, `assignment.version` `8.0.5` → `8.0.7`, `usersgroups.version` `17.104.48` → `17.104.50`, `progression.version` `17.0.262` → `17.0.279`, `sjp.version` `17.103.169` → `17.104.181`. + ## [25.104.0-M7] - 2026-07-07 ### Changed - Updated `framework.version` (`cp-microservice-framework`) to `25.104.0-M3` diff --git a/healthchecks-parent/unifiedsearch-healthchecks/pom.xml b/healthchecks-parent/unifiedsearch-healthchecks/pom.xml index 3e1cc0ee..ca1b4fdd 100644 --- a/healthchecks-parent/unifiedsearch-healthchecks/pom.xml +++ b/healthchecks-parent/unifiedsearch-healthchecks/pom.xml @@ -30,8 +30,8 @@ ${project.version} - org.elasticsearch.client - elasticsearch-rest-high-level-client + co.elastic.clients + elasticsearch-java diff --git a/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthQuerier.java b/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthQuerier.java index e58c500f..47293a6e 100644 --- a/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthQuerier.java +++ b/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthQuerier.java @@ -2,22 +2,17 @@ import java.io.IOException; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.cluster.HealthResponse; /** * Wrapper class for the unmockable parts of getting a health response from elastic search */ public class ElasticSearchHealthQuerier { - public ClusterHealthResponse getClusterHealth( - final RestHighLevelClient restHighLevelClient, - final RequestOptions requestOptions) throws IOException { + public HealthResponse getClusterHealth( + final ElasticsearchClient client) throws IOException { - return restHighLevelClient - .cluster() - .health(new ClusterHealthRequest(), requestOptions); + return client.cluster().health(); } } diff --git a/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheck.java b/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheck.java index a5918f35..70ef82cd 100644 --- a/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheck.java +++ b/healthchecks-parent/unifiedsearch-healthchecks/src/main/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheck.java @@ -1,8 +1,7 @@ package uk.gov.justice.services.unifiedsearch.healthchecks; +import static co.elastic.clients.elasticsearch._types.HealthStatus.Green; import static java.lang.String.format; -import static org.elasticsearch.client.RequestOptions.DEFAULT; -import static org.elasticsearch.cluster.health.ClusterHealthStatus.GREEN; import static uk.gov.justice.services.healthcheck.api.HealthcheckResult.failure; import static uk.gov.justice.services.healthcheck.api.HealthcheckResult.success; import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.MONITOR_USER; @@ -15,15 +14,16 @@ import jakarta.inject.Inject; import jakarta.inject.Named; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.cluster.health.ClusterHealthStatus; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.HealthStatus; +import co.elastic.clients.elasticsearch.cluster.HealthResponse; + public class ElasticSearchHealthcheck implements Healthcheck { @Inject @Named(MONITOR_USER) - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient restHighLevelClient; @Inject private ElasticSearchHealthQuerier elasticSearchHealthQuerier; @@ -35,24 +35,23 @@ public String getHealthcheckName() { @Override public String healthcheckDescription() { - return "Verifies Elastic Search Health Status is '" + GREEN + "'"; + return "Verifies Elastic Search Health Status is '" + Green + "'"; } @Override public HealthcheckResult runHealthcheck() { try { - final ClusterHealthResponse clusterHealthResponse = elasticSearchHealthQuerier.getClusterHealth( - restHighLevelClient, - DEFAULT); + final HealthResponse clusterHealthResponse = elasticSearchHealthQuerier.getClusterHealth( + restHighLevelClient); - final ClusterHealthStatus healthStatus = clusterHealthResponse.getStatus(); + final HealthStatus healthStatus = clusterHealthResponse.status(); - if (healthStatus == GREEN) { + if (healthStatus == Green) { return success(); } - return failure(format("Elastic Search healthcheck failed. CLuster Health Status should be '%s' but was '%s'", GREEN, healthStatus)); + return failure(format("Elastic Search healthcheck failed. CLuster Health Status should be '%s' but was '%s'", Green, healthStatus)); } catch (final IOException e) { throw new ElasticSearchHealtcheckQueryException(format("IOException thrown when calling Elastic Search. Exception message: '%s'", e.getMessage()), e); diff --git a/healthchecks-parent/unifiedsearch-healthchecks/src/test/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheckTest.java b/healthchecks-parent/unifiedsearch-healthchecks/src/test/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheckTest.java index e54163e1..9bb233e3 100644 --- a/healthchecks-parent/unifiedsearch-healthchecks/src/test/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheckTest.java +++ b/healthchecks-parent/unifiedsearch-healthchecks/src/test/java/uk/gov/justice/services/unifiedsearch/healthchecks/ElasticSearchHealthcheckTest.java @@ -1,26 +1,23 @@ package uk.gov.justice.services.unifiedsearch.healthchecks; +import static co.elastic.clients.elasticsearch._types.HealthStatus.Green; import static java.util.Optional.empty; import static java.util.Optional.of; -import static org.elasticsearch.client.RequestOptions.DEFAULT; -import static org.elasticsearch.cluster.health.ClusterHealthStatus.GREEN; -import static org.elasticsearch.cluster.health.ClusterHealthStatus.RED; -import static org.elasticsearch.cluster.health.ClusterHealthStatus.YELLOW; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.HealthStatus; +import co.elastic.clients.elasticsearch.cluster.HealthResponse; import org.junit.jupiter.api.extension.ExtendWith; import uk.gov.justice.services.healthcheck.api.HealthcheckResult; import java.io.IOException; -import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; -import org.elasticsearch.client.RestHighLevelClient; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -29,7 +26,7 @@ public class ElasticSearchHealthcheckTest { @Mock - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient restHighLevelClient; @Mock private ElasticSearchHealthQuerier elasticSearchHealthQuerier; @@ -46,16 +43,16 @@ public void shouldReturnCorrectHealthcheckName() throws Exception { @Test public void shouldReturnCorrectHealthcheckDescription() throws Exception { - assertThat(elasticSearchHealthcheck.healthcheckDescription(), is("Verifies Elastic Search Health Status is 'GREEN'")); + assertThat(elasticSearchHealthcheck.healthcheckDescription(), is("Verifies Elastic Search Health Status is 'Green'")); } @Test public void shouldReturnSuccessIfElasticSearchHealthStatusIsGreen() throws Exception { - final ClusterHealthResponse clusterHealthResponse = mock(ClusterHealthResponse.class); + final HealthResponse clusterHealthResponse = mock(HealthResponse.class); - when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient, DEFAULT)).thenReturn(clusterHealthResponse); - when(clusterHealthResponse.getStatus()).thenReturn(GREEN); + when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient)).thenReturn(clusterHealthResponse); + when(clusterHealthResponse.status()).thenReturn(Green); final HealthcheckResult healthcheckResult = elasticSearchHealthcheck.runHealthcheck(); assertThat(healthcheckResult.isPassed(), is(true)); @@ -65,27 +62,27 @@ public void shouldReturnSuccessIfElasticSearchHealthStatusIsGreen() throws Excep @Test public void shouldFailHealthcheckIfElasticSearchHealthStatusIsRed() throws Exception { - final ClusterHealthResponse clusterHealthResponse = mock(ClusterHealthResponse.class); + final HealthResponse clusterHealthResponse = mock(HealthResponse.class); - when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient, DEFAULT)).thenReturn(clusterHealthResponse); - when(clusterHealthResponse.getStatus()).thenReturn(RED); + when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient)).thenReturn(clusterHealthResponse); + when(clusterHealthResponse.status()).thenReturn(HealthStatus.Red); final HealthcheckResult healthcheckResult = elasticSearchHealthcheck.runHealthcheck(); assertThat(healthcheckResult.isPassed(), is(false)); - assertThat(healthcheckResult.getErrorMessage(), is(of("Elastic Search healthcheck failed. CLuster Health Status should be 'GREEN' but was 'RED'"))); + assertThat(healthcheckResult.getErrorMessage(), is(of("Elastic Search healthcheck failed. CLuster Health Status should be 'Green' but was 'Red'"))); } @Test public void shouldFailHealthcheckIfElasticSearchHealthStatusIsYellow() throws Exception { - final ClusterHealthResponse clusterHealthResponse = mock(ClusterHealthResponse.class); + final HealthResponse clusterHealthResponse = mock(HealthResponse.class); - when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient, DEFAULT)).thenReturn(clusterHealthResponse); - when(clusterHealthResponse.getStatus()).thenReturn(YELLOW); + when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient)).thenReturn(clusterHealthResponse); + when(clusterHealthResponse.status()).thenReturn(HealthStatus.Yellow); final HealthcheckResult healthcheckResult = elasticSearchHealthcheck.runHealthcheck(); assertThat(healthcheckResult.isPassed(), is(false)); - assertThat(healthcheckResult.getErrorMessage(), is(of("Elastic Search healthcheck failed. CLuster Health Status should be 'GREEN' but was 'YELLOW'"))); + assertThat(healthcheckResult.getErrorMessage(), is(of("Elastic Search healthcheck failed. CLuster Health Status should be 'Green' but was 'Yellow'"))); } @Test @@ -93,7 +90,7 @@ public void shouldFailIfQueryingElasticSearchThrowsIOException() throws Exceptio final IOException ioException = new IOException("It all went wrong"); - when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient, DEFAULT)).thenThrow(ioException); + when(elasticSearchHealthQuerier.getClusterHealth(restHighLevelClient)).thenThrow(ioException); final ElasticSearchHealtcheckQueryException elasticSearchHealtcheckQueryException = assertThrows( ElasticSearchHealtcheckQueryException.class, diff --git a/pom.xml b/pom.xml index 0988a564..5ee018e1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.common parent-pom - 25.104.0-M1 + 25.104.0-M2 uk.gov.moj.platform.libraries @@ -42,22 +42,22 @@ 2.3.2 - 25.104.0-M2 - 25.104.0-M6 + 25.104.0-M3 + 25.104.0-M7 - 25.104.0-M10 - 25.104.0-M3 - 25.104.0-M4 + 25.104.0-M11 + 25.104.0-M4 + 25.104.0-M5 ${framework.version} - 8.0.5 - 17.104.48 - 17.0.262 - 17.104.176 - 17.103.169 - 17.103.133 + 8.0.7 + 17.104.50 + 17.0.279 + 17.104.180 + 17.104.181 + 17.104.137 2.15.0 diff --git a/unifiedsearch-library-parent/unifiedsearch-client/pom.xml b/unifiedsearch-library-parent/unifiedsearch-client/pom.xml index dc9100dd..c0775866 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/pom.xml +++ b/unifiedsearch-library-parent/unifiedsearch-client/pom.xml @@ -28,12 +28,25 @@ org.elasticsearch.client - elasticsearch-rest-high-level-client + elasticsearch-rest-client - org.elasticsearch - elasticsearch + co.elastic.clients + elasticsearch-java + + + + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + + + + org.apache.httpcomponents.core5 + httpcore5 + 5.2.1 diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactory.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactory.java index 08f50e49..6e8c9bc6 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactory.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactory.java @@ -4,12 +4,14 @@ import jakarta.enterprise.context.ApplicationScoped; -import org.elasticsearch.action.get.GetRequest; +import co.elastic.clients.elasticsearch.core.GetRequest; @ApplicationScoped public class GetRequestFactory { public GetRequest getRequest(final String indexName, final UUID documentId) { - return new GetRequest(indexName).id(documentId.toString()); + return GetRequest.of(r -> r + .index(indexName) + .id(documentId.toString())); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactory.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactory.java index eb37a1f8..c205e76e 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactory.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactory.java @@ -1,15 +1,11 @@ package uk.gov.justice.services.unifiedsearch.client.factory; -import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.NONE; -import static org.elasticsearch.xcontent.XContentType.JSON; - import uk.gov.justice.services.unifiedsearch.client.index.UnifiedSearchIndexerHelper; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import jakarta.json.JsonObject; -import org.elasticsearch.action.index.IndexRequest; +import co.elastic.clients.elasticsearch.core.IndexRequest; @ApplicationScoped public class IndexRequestFactory { @@ -18,14 +14,16 @@ public class IndexRequestFactory { private UnifiedSearchIndexerHelper unifiedSearchIndexerHelper; public IndexRequest indexRequest(final String indexName, - final JsonObject document, - final long sequenceNumber, - final long primaryTerm) { - return new IndexRequest(indexName) - .source(document.toString(), JSON) - .id(unifiedSearchIndexerHelper.getCaseId(document).toString()) - .setRefreshPolicy(NONE) - .setIfSeqNo(sequenceNumber) - .setIfPrimaryTerm(primaryTerm); + final Object document, + final String caseId, + final Long sequenceNumber, + final Long primaryTerm) { + return IndexRequest.of(i -> i + .index(indexName) + .id(caseId) + .document(document) + .ifSeqNo(sequenceNumber) + .ifPrimaryTerm(primaryTerm) + ); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactory.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactory.java index df3ced56..975461bd 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactory.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactory.java @@ -1,24 +1,25 @@ package uk.gov.justice.services.unifiedsearch.client.factory; -import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.NONE; -import static org.elasticsearch.xcontent.XContentType.JSON; import jakarta.enterprise.context.ApplicationScoped; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; +import co.elastic.clients.elasticsearch.core.IndexRequest; +import co.elastic.clients.elasticsearch.core.UpdateRequest; @ApplicationScoped public class UpdateRequestFactory { + public UpdateRequest updateRequest(final String indexName, final String documentId, - final String caseDetailsString, + final Object document, final IndexRequest indexRequest) { - return new UpdateRequest(indexName, documentId) - .doc(caseDetailsString, JSON) - .setRefreshPolicy(NONE) - .upsert(indexRequest); + return UpdateRequest.of(u -> u + .index(indexName) + .id(documentId) + .doc(document) + .upsert(indexRequest) + ); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CpsCaseDocumentService.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CpsCaseDocumentService.java index f6ca759c..6b290a4a 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CpsCaseDocumentService.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CpsCaseDocumentService.java @@ -12,8 +12,8 @@ import jakarta.inject.Named; import jakarta.json.JsonObject; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.ElasticsearchClient; @ApplicationScoped @IndexType(IndexConstants.CPS_CASE_INDEX_NAME) @@ -21,20 +21,20 @@ public class CpsCaseDocumentService extends DocumentService { @Inject @Named(CPS_WRITE_USER) - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient elasticsearchClient; @Inject private CpsCaseDetailsTransformer caseDetailsTransformer; @Override - protected RestHighLevelClient restHighLevelClient() { - return restHighLevelClient; + protected ElasticsearchClient elasticsearchClient() { + return elasticsearchClient; } @Override protected Object getTransformedCaseDetails(JsonObject document, GetResponse getResponse) throws IOException { - return getResponse.isExists() ? + return getResponse.found() ? caseDetailsTransformer.transform(document, getResponse) : objectMapper.readValue(document.toString(), CaseDetails.class); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CrimeCaseDocumentService.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CrimeCaseDocumentService.java index 9fc560df..8b8af4e2 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CrimeCaseDocumentService.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/CrimeCaseDocumentService.java @@ -12,8 +12,8 @@ import jakarta.inject.Named; import jakarta.json.JsonObject; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.ElasticsearchClient; @ApplicationScoped @IndexType(IndexConstants.CRIME_CASE_INDEX_NAME) @@ -21,20 +21,20 @@ public class CrimeCaseDocumentService extends DocumentService { @Inject @Named(WRITE_USER) - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient elasticsearchClient; @Inject private CaseDetailsTransformer caseDetailsTransformer; @Override - protected RestHighLevelClient restHighLevelClient() { - return restHighLevelClient; + protected ElasticsearchClient elasticsearchClient() { + return elasticsearchClient; } @Override protected Object getTransformedCaseDetails(JsonObject document, GetResponse getResponse) throws IOException { - return getResponse.isExists() ? + return getResponse.found() ? caseDetailsTransformer.transform(document, getResponse) : objectMapper.readValue(document.toString(), CaseDetails.class); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentIndexer.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentIndexer.java index e321861a..e2d36af4 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentIndexer.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentIndexer.java @@ -9,7 +9,8 @@ import jakarta.inject.Inject; import jakarta.json.JsonObject; -import org.elasticsearch.ElasticsearchException; +import co.elastic.clients.elasticsearch._types.ElasticsearchException; + @ApplicationScoped public class DocumentIndexer { diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentService.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentService.java index e662ee5a..c7b2d2ef 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentService.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentService.java @@ -1,6 +1,5 @@ package uk.gov.justice.services.unifiedsearch.client.index; -import static org.elasticsearch.client.RequestOptions.DEFAULT; import uk.gov.justice.services.unifiedsearch.client.factory.GetRequestFactory; import uk.gov.justice.services.unifiedsearch.client.factory.IndexRequestFactory; @@ -13,14 +12,15 @@ import jakarta.inject.Inject; import jakarta.json.JsonObject; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.JsonData; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.core.GetRequest; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.core.IndexRequest; +import co.elastic.clients.elasticsearch.core.IndexResponse; +import co.elastic.clients.elasticsearch.core.UpdateRequest; +import co.elastic.clients.elasticsearch.core.UpdateResponse; public abstract class DocumentService { @@ -39,14 +39,14 @@ public abstract class DocumentService { @Inject private IngestionResponseVerifier ingestionResponseVerifier; - protected abstract RestHighLevelClient restHighLevelClient(); + protected abstract ElasticsearchClient elasticsearchClient(); protected abstract Object getTransformedCaseDetails(final JsonObject document, final GetResponse getResponse) throws IOException; public GetResponse getDocument(final UUID caseId, final String indexName) throws IOException { final GetRequest getRequest = getRequestFactory.getRequest(indexName, caseId); - return restHighLevelClient().get(getRequest, DEFAULT); + return elasticsearchClient().get(getRequest, JsonData.class); } public void createDocument( @@ -59,32 +59,35 @@ public void createDocument( final IndexRequest indexRequest = indexRequestFactory.indexRequest( indexName, document, + caseId.toString(), sequenceNumber, primaryTerm); - final IndexResponse indexResponse = restHighLevelClient().index(indexRequest, DEFAULT); + final IndexResponse indexResponse = elasticsearchClient().index(indexRequest); ingestionResponseVerifier.checkCreateSucceeded(caseId, indexResponse); } public void upsertDocument(final UUID caseId, final JsonObject document, final String indexName) throws IOException { final GetResponse getResponse = getDocument(caseId, indexName); - - final String caseDetailsString = objectMapper.writeValueAsString(getTransformedCaseDetails(document, getResponse)); + final Object caseDetails = getTransformedCaseDetails(document, getResponse); final IndexRequest indexRequest = indexRequestFactory.indexRequest( indexName, - document, - getResponse.getSeqNo(), - getResponse.getPrimaryTerm()); + caseDetails, + caseId.toString(), + getResponse.seqNo(), + getResponse.primaryTerm()); final UpdateRequest updateRequest = updateRequestFactory.updateRequest( indexName, caseId.toString(), - caseDetailsString, + caseDetails, indexRequest); - final UpdateResponse updateResponse = restHighLevelClient().update(updateRequest, DEFAULT); + + + final UpdateResponse updateResponse = elasticsearchClient().update(updateRequest, Void.class); ingestionResponseVerifier.checkUpsertSucceeded(caseId, updateResponse); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactory.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactory.java index c80e0668..1c9dc010 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactory.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactory.java @@ -4,16 +4,35 @@ import static org.apache.http.impl.nio.reactor.IOReactorConfig.custom; import static org.elasticsearch.client.RestClient.builder; +import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.transport.rest_client.RestClientTransport; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.http.client.CredentialsProvider; import org.elasticsearch.client.RestClientBuilder; -import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.RestClient; + @ApplicationScoped public class HighLevelRestClientFactory { - public RestHighLevelClient createNew( + private ObjectMapper objectMapper; + + @PostConstruct + public void setUp(){ + objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + public ElasticsearchClient createNew( final String elasticsearchBaseUri, final CredentialsProvider credentialsProvider, final int elasticsearchTimeout, @@ -32,6 +51,12 @@ public RestHighLevelClient createNew( .setSocketTimeout(elasticsearchTimeout) .setConnectionRequestTimeout(elasticsearchTimeout)); - return new RestHighLevelClient(restClientBuilder); + RestClient restClient = restClientBuilder.build(); + + JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(objectMapper); + + RestClientTransport transport = new RestClientTransport(restClient, jsonpMapper); + + return new ElasticsearchClient(transport); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProvider.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProvider.java index a0ec1659..71158093 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProvider.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProvider.java @@ -6,7 +6,7 @@ import jakarta.inject.Inject; import org.apache.http.client.CredentialsProvider; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; @ApplicationScoped public class HighLevelRestClientProvider { @@ -20,7 +20,7 @@ public class HighLevelRestClientProvider { @Inject private HighLevelRestClientFactory highLevelRestClientFactory; - public RestHighLevelClient newHighLevelClientFor(final String userType) { + public ElasticsearchClient newHighLevelClientFor(final String userType) { final String elasticsearchBaseUri = restClientConfiguration.getElasticsearchBaseUri(); final int elasticsearchTimeout = restClientConfiguration.getElasticsearchTimeout(); diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducer.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducer.java index 5ec41a90..d5e71442 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducer.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducer.java @@ -11,7 +11,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; @ApplicationScoped public class UnifiedSearchHighLevelRestClientProducer { @@ -21,31 +21,31 @@ public class UnifiedSearchHighLevelRestClientProducer { @Produces @Named(WRITE_USER) - public RestHighLevelClient getWriteHighLevelClient() { + public ElasticsearchClient getWriteHighLevelClient() { return highLevelRestClientProvider.newHighLevelClientFor(WRITE_USER); } @Produces @Named(READ_USER) - public RestHighLevelClient getReadHighLevelClient() { + public ElasticsearchClient getReadHighLevelClient() { return highLevelRestClientProvider.newHighLevelClientFor(READ_USER); } @Produces @Named(MONITOR_USER) - public RestHighLevelClient getMonitorHighLevelClient() { + public ElasticsearchClient getMonitorHighLevelClient() { return highLevelRestClientProvider.newHighLevelClientFor(MONITOR_USER); } @Produces @Named(CPS_WRITE_USER) - public RestHighLevelClient getCpsWriteHighLevelClient() { + public ElasticsearchClient getCpsWriteHighLevelClient() { return highLevelRestClientProvider.newHighLevelClientFor(CPS_WRITE_USER); } @Produces @Named(CPS_READ_USER) - public RestHighLevelClient getCpsReadHighLevelClient() { + public ElasticsearchClient getCpsReadHighLevelClient() { return highLevelRestClientProvider.newHighLevelClientFor(CPS_READ_USER); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifier.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifier.java index ff1b0f63..6440aa30 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifier.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifier.java @@ -1,8 +1,6 @@ package uk.gov.justice.services.unifiedsearch.client.retry; import static java.lang.String.format; -import static org.elasticsearch.rest.RestStatus.CREATED; -import static org.elasticsearch.rest.RestStatus.OK; import uk.gov.justice.services.unifiedsearch.client.index.UnifiedSearchIngestionException; @@ -10,23 +8,23 @@ import jakarta.enterprise.context.ApplicationScoped; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.rest.RestStatus; +import co.elastic.clients.elasticsearch.core.IndexResponse; +import co.elastic.clients.elasticsearch.core.UpdateResponse; +import co.elastic.clients.elasticsearch._types.Result; @ApplicationScoped public class IngestionResponseVerifier { public void checkUpsertSucceeded(final UUID caseId, final UpdateResponse updateResponse) { - final RestStatus status = updateResponse.status(); - if (status != OK && status != CREATED) { - throw new UnifiedSearchIngestionException(format("Ingestion failed for index update for document with id: %s with status %s", caseId, updateResponse.status())); + final Result status = updateResponse.result(); + if (status != Result.Updated && status != Result.Created && status != Result.NoOp) { + throw new UnifiedSearchIngestionException(format("Ingestion failed for index update for document with id: %s with status %s", caseId, status)); } } public void checkCreateSucceeded(final UUID caseId, final IndexResponse indexResponse) { - if (indexResponse.status() != OK && indexResponse.status() != CREATED) { - throw new UnifiedSearchIngestionException(format("Ingestion failed for index write for document with id: %s with status %s", caseId, indexResponse.status())); + if (indexResponse.result() != Result.Updated && indexResponse.result() != Result.Created) { + throw new UnifiedSearchIngestionException(format("Ingestion failed for index write for document with id: %s with status %s", caseId, indexResponse.result())); } } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchService.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchService.java index 92830cf5..4c036642 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchService.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchService.java @@ -1,12 +1,14 @@ package uk.gov.justice.services.unifiedsearch.client.search; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; +import co.elastic.clients.elasticsearch.core.GetRequest; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch._types.SortOptions; +import co.elastic.clients.json.JsonData; + import uk.gov.justice.services.common.converter.StringToJsonObjectConverter; import uk.gov.justice.services.unifiedsearch.client.restclient.UnifiedSearchHighLevelRestClientProducer; import uk.gov.justice.services.unifiedsearch.client.utils.IndexInfo; @@ -21,7 +23,7 @@ import java.io.IOException; import static java.lang.String.format; -import static org.elasticsearch.client.RequestOptions.DEFAULT; + import static uk.gov.justice.services.messaging.JsonObjects.getJsonBuilderFactory; import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.CPS_READ_USER; import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.READ_USER; @@ -33,11 +35,11 @@ public class DefaultUnifiedSearchService implements UnifiedSearchService { @Inject @Named(CPS_READ_USER) - private RestHighLevelClient cpsCaseHighLevelClient; + private ElasticsearchClient cpsCaseElasticsearchClient; @Inject @Named(READ_USER) - private RestHighLevelClient crimeCaseHighLevelClient; + private ElasticsearchClient crimeCaseElasticsearchClient; @Inject private StringToJsonObjectConverter stringToJsonObjectConverter; @@ -53,39 +55,39 @@ public class DefaultUnifiedSearchService implements UnifiedSearchService { public JsonObject search(final String documentId, final String indexName) { try { - final GetRequest getRequest = new GetRequest(indexName).id(documentId); - final RestHighLevelClient restHighLevelClient = restHighLevelClient(indexName); - final GetResponse getResponse = restHighLevelClient.get(getRequest, DEFAULT); + final GetRequest getRequest = GetRequest.of(r -> r.index(indexName).id(documentId)); + final ElasticsearchClient elasticsearchClient = restHighLevelClient(indexName); + final GetResponse getResponse = elasticsearchClient.get(getRequest); - return stringToJsonObjectConverter.convert(getResponse.getSourceAsString()); + return stringToJsonObjectConverter.convert(getResponse.source().toString()); } catch (final IOException ioe) { throw new UnifiedSearchClientException(format("Unable to perform search for documentId %s on index %s", documentId, indexName), ioe); } } @Override - public JsonObject search(final QueryBuilder queryBuilder, final String indexName, final Class resultHitType, + public JsonObject search(final Query.Builder queryBuilder, final String indexName, final Class resultHitType, final String resultHitNodeName, final int pageSize, final int startFrom, - final FieldSortBuilder fieldSortBuilder) { - return search(queryBuilder, indexName, resultHitType, resultHitNodeName, pageSize, startFrom, fieldSortBuilder, null, null); + final SortOptions sortOptions) { + return search(queryBuilder, indexName, resultHitType, resultHitNodeName, pageSize, startFrom, sortOptions, null, null); } @Override - public JsonObject search(final QueryBuilder queryBuilder, final String indexName, final Class resultHitType, + public JsonObject search(final Query.Builder queryBuilder, final String indexName, final Class resultHitType, final String resultHitNodeName, final int pageSize, final int startFrom, - final FieldSortBuilder fieldSortBuilder, final Class innerHitResultType, + final SortOptions sortOptions, final Class innerHitResultType, final String innerResultHightNodeName) { try { - final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(queryBuilder, indexName, pageSize, startFrom, fieldSortBuilder); - final RestHighLevelClient restHighLevelClient = restHighLevelClient(indexName); - final SearchResponse response = restHighLevelClient.search(searchRequest, DEFAULT); - final JsonArray hitsAsJsonArray = searchResultConverter.toJsonArray(response.getHits(), resultHitType); + final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(queryBuilder, indexName, pageSize, startFrom, sortOptions); + final ElasticsearchClient elasticsearchClient = restHighLevelClient(indexName); + final SearchResponse response = elasticsearchClient.search(searchRequest, JsonData.class); + final JsonArray hitsAsJsonArray = searchResultConverter.toJsonArray(response.hits().hits(), resultHitType); final JsonObjectBuilder jsonObjectBuilder = getJsonBuilderFactory().createObjectBuilder() - .add(TOTAL_RESULTS_NODE_NAME, response.getHits().getTotalHits().value) + .add(TOTAL_RESULTS_NODE_NAME, response.hits().total().value()) .add(resultHitNodeName, hitsAsJsonArray); if (null != innerResultHightNodeName) { - final JsonArray innerHitsAsJsonArray = searchResultConverter.convertInnerHitsToJsonArray(response.getHits(), + final JsonArray innerHitsAsJsonArray = searchResultConverter.convertInnerHitsToJsonArray(response.hits().hits(), innerHitResultType, innerResultHightNodeName); jsonObjectBuilder.add(innerResultHightNodeName, innerHitsAsJsonArray); } @@ -96,7 +98,7 @@ public JsonObject search(final QueryBuilder queryBuilder, final String indexName } } - private RestHighLevelClient restHighLevelClient(final String indexName) { - return indexName.equals(IndexInfo.CPS_CASE.getIndexName()) ? cpsCaseHighLevelClient : crimeCaseHighLevelClient; + private ElasticsearchClient restHighLevelClient(final String indexName) { + return indexName.equals(IndexInfo.CPS_CASE.getIndexName()) ? cpsCaseElasticsearchClient : crimeCaseElasticsearchClient; } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactory.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactory.java index f45dbb8d..0a424edd 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactory.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactory.java @@ -2,17 +2,15 @@ import static java.lang.Integer.valueOf; import static java.lang.String.format; -import static java.util.Objects.nonNull; import uk.gov.justice.services.common.configuration.GlobalValue; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch._types.SortOptions; @ApplicationScoped public class SearchRequestFactory { @@ -22,28 +20,24 @@ public class SearchRequestFactory { private String maxQueryResultSize; - public SearchRequest getSearchRequestBy(final QueryBuilder queryBuilder, final String indexName, final int pageSize, final int startFrom, - final FieldSortBuilder fieldSortBuilder) { + public SearchRequest getSearchRequestBy(final Query.Builder queryBuilder, final String indexName, final int pageSize, final int startFrom, + final SortOptions sortOptions) { checkValid(pageSize, startFrom); - final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(queryBuilder); - searchSourceBuilder.size(pageSize); - searchSourceBuilder.from(startFrom); - /* Forcing ES to accurately count like in ES 6.x - See https://www.elastic.co/guide/en/elasticsearch/reference/7.0/search-request-track-total-hits.html - */ - searchSourceBuilder.trackTotalHits(true); - - if (nonNull(fieldSortBuilder)) { - searchSourceBuilder.sort(fieldSortBuilder); - } + return SearchRequest.of(s -> { + s.index(indexName) + .query(queryBuilder.build()) + .size(pageSize) + .from(startFrom) + .trackTotalHits(t -> t.enabled(true)); - final SearchRequest searchRequest = new SearchRequest(indexName); - searchRequest.source(searchSourceBuilder); + if (sortOptions != null) { + s.sort(sortOptions); + } - return searchRequest; + return s; + }); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverter.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverter.java index 763bc1bb..40658fcb 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverter.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverter.java @@ -1,17 +1,24 @@ package uk.gov.justice.services.unifiedsearch.client.search; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.core.search.InnerHitsResult; +import co.elastic.clients.json.JsonData; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import uk.gov.justice.services.common.converter.ObjectToJsonObjectConverter; + import uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchClientException; +import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; -import java.io.IOException; +import jakarta.json.JsonReader; + +import java.io.StringReader; +import java.util.List; import java.util.Map; import static uk.gov.justice.services.messaging.JsonObjects.getJsonBuilderFactory; @@ -22,16 +29,23 @@ class SearchResultConverter { @Inject private ObjectMapper objectMapper; - @Inject - private ObjectToJsonObjectConverter objectToJsonObjectConverter; + private JacksonJsonpMapper jsonpMapper; + + @PostConstruct + public void setup(){ + final ObjectMapper updatedObjectMapper = objectMapper.copy().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + + jsonpMapper = new JacksonJsonpMapper(updatedObjectMapper); + } + - JsonArray toJsonArray(final SearchHits searchHits, final Class resultHitType) { + JsonArray toJsonArray(final List> searchHits, final Class resultHitType) { final JsonArrayBuilder results = getJsonBuilderFactory().createArrayBuilder(); searchHits.forEach(searchHit -> results.add(toJsonObject(searchHit, resultHitType))); return results.build(); } - JsonArray convertInnerHitsToJsonArray(final SearchHits searchHits, + JsonArray convertInnerHitsToJsonArray(final List> searchHits, final Class resultHitType, final String innerResultHightNodeName) { final JsonArrayBuilder results = getJsonBuilderFactory().createArrayBuilder(); @@ -39,29 +53,36 @@ JsonArray convertInnerHitsToJsonArray(final SearchHits searchHits, return results.build(); } - private void toJsonObject(Class resultHitType, String innerResultHightNodeName, JsonArrayBuilder results, SearchHit searchHit) { - try { - final Map innerHits = searchHit.getInnerHits(); - final SearchHits resultsHits = innerHits.get(innerResultHightNodeName); - for (final SearchHit result : resultsHits) { - final Object innerHitValue = objectMapper.readValue(result.getSourceAsString(), resultHitType); - results.add(objectToJsonObjectConverter.convert(innerHitValue)); - } - } catch (final IOException e) { - throw new UnifiedSearchClientException("Failed to deserialize search response", e); + private void toJsonObject(Class resultHitType, String innerResultHightNodeName, JsonArrayBuilder results, Hit searchHit) { + + final Map innerHits = searchHit.innerHits(); + final InnerHitsResult resultsHits = innerHits.get(innerResultHightNodeName); + for (final Hit result : resultsHits.hits().hits()) { + results.add(toJsonObject(result, resultHitType)); } + } - private JsonObject toJsonObject(final SearchHit searchHit, Class resultHitType) { + private JsonObject toJsonObject(final Hit searchHit, Class resultHitType) { try { - /*Using objectMapper so that we selectively map only properties/hierarchy - defined in resultHitType are populated*/ - final Object hitValue = objectMapper.readValue(searchHit.getSourceAsString(), resultHitType); + Object pojo = searchHit.source() + .to(resultHitType, jsonpMapper); + + String json = objectMapper.writeValueAsString(pojo); - return objectToJsonObjectConverter.convert(hitValue); + return getJsonObject(json); + + } catch (Exception e) { + throw new UnifiedSearchClientException( + "Failed to deserialize search response", e); + } + } - } catch (final IOException e) { - throw new UnifiedSearchClientException("Failed to deserialize search response", e); + private static JsonObject getJsonObject(final String json) { + try(final JsonReader reader = jakarta.json.Json.createReader( + new StringReader(json) + )){ + return reader.readObject(); } } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/UnifiedSearchService.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/UnifiedSearchService.java index 3ca73081..4d1de297 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/UnifiedSearchService.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/search/UnifiedSearchService.java @@ -2,19 +2,19 @@ import jakarta.json.JsonObject; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; +import co.elastic.clients.elasticsearch._types.SortOptions; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; public interface UnifiedSearchService { JsonObject search(final String documentId, final String indexName); - JsonObject search(final QueryBuilder queryBuilder, final String indexName, final Class resultHitType, + JsonObject search(final Query.Builder queryBuilder, final String indexName, final Class resultHitType, final String resultHitNodeName, final int pageSize, final int startFrom, - final FieldSortBuilder fieldSortBuilder); + final SortOptions sortOptions); - JsonObject search(final QueryBuilder queryBuilder, final String indexName, final Class resultHitType, + JsonObject search(final Query.Builder queryBuilder, final String indexName, final Class resultHitType, final String resultHitNodeName, final int pageSize, final int startFrom, - final FieldSortBuilder fieldSortBuilder, final Class innerHitResultType, + final SortOptions sortOptions, final Class innerHitResultType, final String innerResultHightNodeName); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformer.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformer.java index 1b757d70..f6bf3725 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformer.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformer.java @@ -9,7 +9,7 @@ import jakarta.json.JsonObject; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetResponse; +import co.elastic.clients.elasticsearch.core.GetResponse; @ApplicationScoped public class CaseDetailsTransformer { @@ -23,7 +23,7 @@ public class CaseDetailsTransformer { public CaseDetails transform(final JsonObject index, final GetResponse getResponse) { try { final CaseDetails incomingIndexData = mapper.readValue(index.toString(), CaseDetails.class); - final CaseDetails unifiedSearchIndexData = mapper.readValue(getResponse.getSourceAsString(), CaseDetails.class); + final CaseDetails unifiedSearchIndexData = mapper.readValue(getResponse.source().toString(), CaseDetails.class); if (incomingIndexData.getCaseReference() != null) { unifiedSearchIndexData.setCaseReference(incomingIndexData.getCaseReference()); diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformer.java b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformer.java index 37ca00d0..dcccd0a4 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformer.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/main/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformer.java @@ -12,7 +12,7 @@ import jakarta.json.JsonObject; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetResponse; +import co.elastic.clients.elasticsearch.core.GetResponse; @ApplicationScoped public class CpsCaseDetailsTransformer { @@ -26,7 +26,7 @@ public class CpsCaseDetailsTransformer { public CaseDetails transform(final JsonObject index, final GetResponse getResponse) { try { final CaseDetails incomingIndexData = mapper.readValue(index.toString(), CaseDetails.class); - final CaseDetails unifiedSearchIndexData = mapper.readValue(getResponse.getSourceAsString(), CaseDetails.class); + final CaseDetails unifiedSearchIndexData = mapper.readValue(getResponse.source().toString(), CaseDetails.class); if (incomingIndexData.getUrn() != null) { unifiedSearchIndexData.setUrn(incomingIndexData.getUrn()); diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactoryTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactoryTest.java index 3a37dd75..eb35145f 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactoryTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/GetRequestFactoryTest.java @@ -7,7 +7,7 @@ import java.util.UUID; -import org.elasticsearch.action.get.GetRequest; +import co.elastic.clients.elasticsearch.core.GetRequest; import org.junit.jupiter.api.Test; public class GetRequestFactoryTest { diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactoryTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactoryTest.java index 4dea2332..09d08f48 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactoryTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/IndexRequestFactoryTest.java @@ -1,9 +1,10 @@ package uk.gov.justice.services.unifiedsearch.client.factory; import static java.util.UUID.randomUUID; -import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.NONE; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static uk.gov.justice.services.messaging.JsonObjects.getJsonBuilderFactory; @@ -14,7 +15,7 @@ import jakarta.json.JsonObject; -import org.elasticsearch.action.index.IndexRequest; +import co.elastic.clients.elasticsearch.core.IndexRequest; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Spy; @@ -39,12 +40,12 @@ public void shouldCreateIndexRequest() { final JsonObject document = getJsonBuilderFactory().createObjectBuilder().add("document", "document") .add("caseId", caseId.toString()).build(); - final IndexRequest indexRequest = indexRequestFactory.indexRequest(index, document, 1l, 1l); + final IndexRequest indexRequest = indexRequestFactory.indexRequest(index, document,caseId.toString(), 1l, 1l); assertThat(indexRequest, instanceOf(IndexRequest.class)); assertThat(indexRequest.id(), is(caseId.toString())); assertThat(indexRequest.index(), is(index)); - assertThat(indexRequest.getRefreshPolicy().getValue(), is(NONE.getValue())); + assertThat(indexRequest.refresh(), is(nullValue())); assertThat(indexRequest.ifSeqNo(), is(1l)); assertThat(indexRequest.ifPrimaryTerm(), is(1l)); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactoryTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactoryTest.java index ac17989f..b0dde78c 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactoryTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/factory/UpdateRequestFactoryTest.java @@ -1,12 +1,16 @@ package uk.gov.justice.services.unifiedsearch.client.factory; -import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.NONE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsInstanceOf.instanceOf; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; + +import java.util.HashMap; +import java.util.Map; + +import co.elastic.clients.elasticsearch.core.IndexRequest; +import co.elastic.clients.elasticsearch.core.UpdateRequest; import org.junit.jupiter.api.Test; public class UpdateRequestFactoryTest { @@ -15,12 +19,12 @@ public class UpdateRequestFactoryTest { public void shouldCreateUpdateRequest() { final String index = "test"; final String documentId = "123"; - final String caseDetailsString = "12345"; + Map docMap = new HashMap(); final UpdateRequestFactory updateRequestFactory = new UpdateRequestFactory(); - final UpdateRequest updateRequest = updateRequestFactory.updateRequest(index, documentId, caseDetailsString, new IndexRequest()); + final UpdateRequest updateRequest = updateRequestFactory.updateRequest(index, documentId, docMap, IndexRequest.of( t-> t.index("").document(""))); assertThat(updateRequest, instanceOf(UpdateRequest.class)); - assertThat(updateRequest.getRefreshPolicy().getValue(), is(NONE.getValue())); + assertThat(updateRequest.refresh(), is(nullValue())); } } \ No newline at end of file diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentServiceTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentServiceTest.java index 3f1739f9..b8f49e59 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentServiceTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/DocumentServiceTest.java @@ -1,7 +1,6 @@ package uk.gov.justice.services.unifiedsearch.client.index; import static java.util.UUID.randomUUID; -import static org.elasticsearch.client.RequestOptions.DEFAULT; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -13,6 +12,9 @@ import static uk.gov.justice.services.unifiedsearch.client.utils.IndexInfo.CRIME_CASE; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch.core.UpdateRequest; +import co.elastic.clients.json.JsonData; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -29,12 +31,12 @@ import jakarta.json.JsonObject; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.core.GetRequest; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.core.IndexRequest; +import co.elastic.clients.elasticsearch.core.IndexResponse; +import co.elastic.clients.elasticsearch.core.UpdateResponse; +import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.junit.jupiter.api.BeforeEach; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -43,7 +45,7 @@ public class DocumentServiceTest { @Mock - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient elasticsearchClient; @Mock private ObjectMapper objectMapper; @@ -86,10 +88,10 @@ public void shouldGetDocument(final IndexInfo indexInfo) throws Exception { final UUID caseId = randomUUID(); - when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(restHighLevelClient); + when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(elasticsearchClient); final GetRequest getRequest = getRequestFactory.getRequest(indexInfo.getIndexName(), caseId); - final GetResponse getResponse = restHighLevelClient.get(getRequest, DEFAULT); + final GetResponse getResponse = elasticsearchClient.get(getRequest); assertThat(documentService.getDocument(caseId, indexInfo.getIndexName()), is(getResponse)); } @@ -109,10 +111,11 @@ public void shouldCreateDocumentAndCheckForSuccess(final IndexInfo indexInfo) th when(indexRequestFactory.indexRequest( indexInfo.getIndexName(), document, + caseId.toString(), sequenceNumber, primaryTerm)).thenReturn(indexRequest); - when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(restHighLevelClient); - when(restHighLevelClient.index(indexRequest, DEFAULT)).thenReturn(indexResponse); + when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(elasticsearchClient); + when(elasticsearchClient.index(indexRequest)).thenReturn(indexResponse); documentService.createDocument(document, caseId, sequenceNumber, primaryTerm, indexInfo.getIndexName()); @@ -127,10 +130,13 @@ public void shouldUpdateDocumentAndCheckForSuccess(final IndexInfo indexInfo) th final GetResponse getResponse = mock(GetResponse.class); final JsonObject document = mock(JsonObject.class); final UpdateResponse updateResponse = mock(UpdateResponse.class); + final UpdateRequest updateRequest = mock(UpdateRequest.class); - when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(restHighLevelClient); - when(restHighLevelClient.get(any(), eq(DEFAULT))).thenReturn(getResponse); - when(restHighLevelClient.update(any(), eq(DEFAULT))).thenReturn(updateResponse); + when(highLevelRestClientProvider.getWriteHighLevelClient()).thenReturn(elasticsearchClient); + when(elasticsearchClient.get(any(GetRequest.class), eq(JsonData.class))).thenReturn(getResponse); + when(elasticsearchClient.update(any(UpdateRequest.class), eq(Void.class))).thenReturn(updateResponse); + when( getRequestFactory.getRequest(indexInfo.getIndexName(), caseId)).thenReturn(GetRequest.of(t->t.id("").index(""))); + when(updateRequestFactory.updateRequest(any(), any(),any(),any())).thenReturn(updateRequest); documentService.upsertDocument( caseId, diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactoryTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactoryTest.java index 69f9a8ff..8988800b 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactoryTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/HighLevelRestClientFactoryTest.java @@ -6,9 +6,9 @@ import static org.mockito.Mockito.mock; import org.apache.http.client.CredentialsProvider; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -28,13 +28,14 @@ public void shouldCreateNewRestClient() throws Exception { final int threadCount = 100; final CredentialsProvider credentialsProvider = mock(CredentialsProvider.class); + highLevelRestClientFactory.setUp(); - final RestHighLevelClient restHighLevelClient = highLevelRestClientFactory.createNew( + final ElasticsearchClient elasticsearchClient = highLevelRestClientFactory.createNew( elasticsearchBaseUri, credentialsProvider, elasticsearchTimeout, threadCount); - assertThat(restHighLevelClient, is(notNullValue())); + assertThat(elasticsearchClient, is(notNullValue())); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/UnifiedSearchIndexerProducerTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/UnifiedSearchIndexerProducerTest.java index 2b806869..88865313 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/UnifiedSearchIndexerProducerTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/index/UnifiedSearchIndexerProducerTest.java @@ -15,7 +15,6 @@ import jakarta.enterprise.inject.spi.InjectionPoint; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProviderTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProviderTest.java index 1fcc269f..24e62b27 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProviderTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/HighLevelRestClientProviderTest.java @@ -6,13 +6,12 @@ import static org.mockito.Mockito.when; import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.WRITE_USER; +import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.junit.jupiter.api.extension.ExtendWith; import uk.gov.justice.services.unifiedsearch.client.index.HighLevelRestClientFactory; import org.apache.http.client.CredentialsProvider; -import org.elasticsearch.client.RestHighLevelClient; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -42,7 +41,7 @@ public void shouldCreateARestClientWithTheCorrectConfiguration() throws Exceptio final int threadCount = 23; final CredentialsProvider credentialsProvider = mock(CredentialsProvider.class); - final RestHighLevelClient restHighLevelClient = mock(RestHighLevelClient.class); + final ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); when(restClientConfiguration.getElasticsearchBaseUri()).thenReturn(elasticsearchBaseUri); when(restClientConfiguration.getElasticsearchTimeout()).thenReturn(elasticsearchTimeout); @@ -53,8 +52,8 @@ public void shouldCreateARestClientWithTheCorrectConfiguration() throws Exceptio elasticsearchBaseUri, credentialsProvider, elasticsearchTimeout, - threadCount)).thenReturn(restHighLevelClient); + threadCount)).thenReturn(elasticsearchClient); - assertThat(highLevelRestClientProvider.newHighLevelClientFor(userType), is(restHighLevelClient)); + assertThat(highLevelRestClientProvider.newHighLevelClientFor(userType), is(elasticsearchClient)); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducerTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducerTest.java index fa559945..3accb716 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducerTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/restclient/UnifiedSearchHighLevelRestClientProducerTest.java @@ -8,9 +8,9 @@ import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.READ_USER; import static uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchSecurityConstants.WRITE_USER; -import org.elasticsearch.client.RestHighLevelClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -29,30 +29,30 @@ public class UnifiedSearchHighLevelRestClientProducerTest { @Test public void shouldCreateHighLevelRestClientForTheReadUser() throws Exception { - final RestHighLevelClient readHighLevelClient = mock(RestHighLevelClient.class); + final ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); - when(highLevelRestClientProvider.newHighLevelClientFor(READ_USER)).thenReturn(readHighLevelClient); + when(highLevelRestClientProvider.newHighLevelClientFor(READ_USER)).thenReturn(elasticsearchClient); - assertThat(unifiedSearchHighLevelRestClientProducer.getReadHighLevelClient(), is(readHighLevelClient)); + assertThat(unifiedSearchHighLevelRestClientProducer.getReadHighLevelClient(), is(elasticsearchClient)); } @Test public void shouldCreateHighLevelRestClientForTheWriteUser() throws Exception { - final RestHighLevelClient writeHighLevelClient = mock(RestHighLevelClient.class); + final ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); - when(highLevelRestClientProvider.newHighLevelClientFor(WRITE_USER)).thenReturn(writeHighLevelClient); + when(highLevelRestClientProvider.newHighLevelClientFor(WRITE_USER)).thenReturn(elasticsearchClient); - assertThat(unifiedSearchHighLevelRestClientProducer.getWriteHighLevelClient(), is(writeHighLevelClient)); + assertThat(unifiedSearchHighLevelRestClientProducer.getWriteHighLevelClient(), is(elasticsearchClient)); } @Test public void shouldCreateHighLevelRestClientForTheMonitorUser() throws Exception { - final RestHighLevelClient monitorHighLevelClient = mock(RestHighLevelClient.class); + final ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); - when(highLevelRestClientProvider.newHighLevelClientFor(MONITOR_USER)).thenReturn(monitorHighLevelClient); + when(highLevelRestClientProvider.newHighLevelClientFor(MONITOR_USER)).thenReturn(elasticsearchClient); - assertThat(unifiedSearchHighLevelRestClientProducer.getMonitorHighLevelClient(), is(monitorHighLevelClient)); + assertThat(unifiedSearchHighLevelRestClientProducer.getMonitorHighLevelClient(), is(elasticsearchClient)); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifierTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifierTest.java index 86efab91..3e2e0ed5 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifierTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/retry/IngestionResponseVerifierTest.java @@ -7,14 +7,14 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; +import co.elastic.clients.elasticsearch._types.Result; import org.junit.jupiter.api.extension.ExtendWith; import uk.gov.justice.services.unifiedsearch.client.index.UnifiedSearchIngestionException; import java.util.UUID; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.rest.RestStatus; +import co.elastic.clients.elasticsearch.core.IndexResponse; +import co.elastic.clients.elasticsearch.core.UpdateResponse; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -35,26 +35,26 @@ public class IngestionResponseVerifierTest { @Test public void handleUpdateResponseWhenResponseStatusIsOK() { final UUID caseId = randomUUID(); - when(updateResponse.status()).thenReturn(RestStatus.OK); + when(updateResponse.result()).thenReturn(Result.Updated); ingestionResponseVerifier.checkUpsertSucceeded(caseId, updateResponse); } @Test public void handleUpdateResponseWhenResponseStatusIsNotOK() { final UUID caseId = randomUUID(); - when(updateResponse.status()).thenReturn(RestStatus.REQUEST_TIMEOUT); + when(updateResponse.result()).thenReturn(Result.NotFound); final UnifiedSearchIngestionException unifiedSearchIngestionException = assertThrows( UnifiedSearchIngestionException.class, () -> ingestionResponseVerifier.checkUpsertSucceeded(caseId, updateResponse)); - assertThat(unifiedSearchIngestionException.getMessage(), is(format("Ingestion failed for index update for document with id: %s with status REQUEST_TIMEOUT", caseId))); + assertThat(unifiedSearchIngestionException.getMessage(), is(format("Ingestion failed for index update for document with id: %s with status NotFound", caseId))); } @Test public void handleIndexResponseWhenResponseStatusIsOK() { final UUID caseId = randomUUID(); - when(indexResponse.status()).thenReturn(RestStatus.OK); + when(indexResponse.result()).thenReturn(Result.Created); ingestionResponseVerifier.checkCreateSucceeded(caseId, indexResponse); } @@ -62,12 +62,12 @@ public void handleIndexResponseWhenResponseStatusIsOK() { public void handleIndexResponseWhenResponseStatusIsNotOK() { final UUID caseId = randomUUID(); - when(indexResponse.status()).thenReturn(RestStatus.REQUEST_TIMEOUT); + when(indexResponse.result()).thenReturn(Result.NoOp); final UnifiedSearchIngestionException unifiedSearchIngestionException = assertThrows( UnifiedSearchIngestionException.class, () -> ingestionResponseVerifier.checkCreateSucceeded(caseId, indexResponse)); - assertThat(unifiedSearchIngestionException.getMessage(), is(format("Ingestion failed for index write for document with id: %s with status REQUEST_TIMEOUT", caseId))); + assertThat(unifiedSearchIngestionException.getMessage(), is(format("Ingestion failed for index write for document with id: %s with status NoOp", caseId))); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchServiceTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchServiceTest.java index 9a0dfbf6..1a8bba2e 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchServiceTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/DefaultUnifiedSearchServiceTest.java @@ -1,8 +1,6 @@ package uk.gov.justice.services.unifiedsearch.client.search; import static java.lang.String.format; -import static org.elasticsearch.search.sort.SortBuilders.fieldSort; -import static org.elasticsearch.search.sort.SortOrder.ASC; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; @@ -10,6 +8,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -18,6 +17,13 @@ import static uk.gov.justice.services.unifiedsearch.client.utils.IndexInfo.CPS_CASE; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch._types.SortOptions; +import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch.core.search.HitsMetadata; +import co.elastic.clients.elasticsearch.core.search.TotalHits; +import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation; +import co.elastic.clients.json.JsonData; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -30,17 +36,12 @@ import jakarta.json.JsonArray; import jakarta.json.JsonObject; -import org.apache.lucene.search.TotalHits; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.NestedSortBuilder; +import co.elastic.clients.elasticsearch.core.GetRequest; +import co.elastic.clients.elasticsearch.core.GetResponse; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; import org.junit.jupiter.api.BeforeEach; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -52,7 +53,7 @@ public class DefaultUnifiedSearchServiceTest { private StringToJsonObjectConverter stringToJsonObjectConverter; @Mock - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient elasticsearchClient; @Mock private SearchRequestFactory searchRequestFactory; @@ -64,13 +65,10 @@ public class DefaultUnifiedSearchServiceTest { private SearchRequest searchRequest; @Mock - private QueryBuilder queryBuilder; - - @Mock - private SearchHits searchHits; + private Query.Builder query; @Mock - private TotalHits totalHits; + private HitsMetadata searchHits; @Mock private SearchResultConverter searchResultConverter; @@ -90,7 +88,6 @@ public void setUp() { MockitoAnnotations.initMocks(this); resultHitNodeName = "cases"; resultInnerHitNodeName = "parties"; - when(searchHits.getTotalHits()).thenReturn(totalHits); } private static Stream indexInfoDataProvider() { @@ -107,8 +104,8 @@ public void shouldSearchById(final IndexInfo indexInfo) throws Exception { final GetResponse getResponse = mock(GetResponse.class); final JsonObject jsonObject = mock(JsonObject.class); - when(restHighLevelClient.get(any(GetRequest.class), any(RequestOptions.class))).thenReturn(getResponse); - when(getResponse.getSourceAsString()).thenReturn("response"); + when(elasticsearchClient.get(any(GetRequest.class))).thenReturn(getResponse); + when(getResponse.source()).thenReturn("response"); when(stringToJsonObjectConverter.convert(responseString)).thenReturn(jsonObject); final JsonObject caseDetailsJson = defaultUnifiedSearchService.search("123", indexInfo.getIndexName()); @@ -120,7 +117,7 @@ public void shouldSearchById(final IndexInfo indexInfo) throws Exception { @MethodSource("indexInfoDataProvider") public void shouldThrowExceptionOnSearchById(final IndexInfo indexInfo) throws Exception { try { - given(restHighLevelClient.get(any(GetRequest.class), any(RequestOptions.class))).willAnswer(invocation -> { + given(elasticsearchClient.get(any(GetRequest.class))).willAnswer(invocation -> { throw new IOException("oops"); }); defaultUnifiedSearchService.search("123", indexInfo.getIndexName()); @@ -133,110 +130,136 @@ public void shouldThrowExceptionOnSearchById(final IndexInfo indexInfo) throws E @ParameterizedTest @MethodSource("indexInfoDataProvider") public void shouldSearchIndexByQueryBuilder(final IndexInfo indexInfo) throws Exception { - final QueryBuilder queryBuilder = mock(QueryBuilder.class); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final Query.Builder query = mock(Query.Builder.class); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); - when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder)).thenReturn(searchRequest); - when(restHighLevelClient.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse); - when(searchResponse.getHits()).thenReturn(searchHits); - when(searchResultConverter.toJsonArray(searchHits, Object.class)).thenReturn(hitsAsJsonArray); + when(searchRequestFactory.getSearchRequestBy(query, indexInfo.getIndexName(), 10, 100, sortOptions)).thenReturn(searchRequest); + when(elasticsearchClient.search(any(SearchRequest.class), eq(JsonData.class))).thenReturn(searchResponse); + when(searchResponse.hits()).thenReturn(searchHits); + when(searchHits.total()).thenReturn(TotalHits.of(t-> t.value(0).relation(TotalHitsRelation.Eq))); + when(searchResultConverter.toJsonArray(searchHits.hits(), Object.class)).thenReturn(hitsAsJsonArray); - final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, fieldSortBuilder); + final JsonObject actualResponse = defaultUnifiedSearchService.search(query, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, sortOptions); assertThat(actualResponse.getInt("totalResults"), is(0)); assertThat(actualResponse.getJsonArray(resultHitNodeName), hasSize(0)); - verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder); - verify(restHighLevelClient).search(searchRequest, RequestOptions.DEFAULT); + verify(searchRequestFactory).getSearchRequestBy(query, indexInfo.getIndexName(), 10, 100, sortOptions); + verify(elasticsearchClient).search(searchRequest, JsonData.class); - verifyNoMoreInteractions(searchRequestFactory, restHighLevelClient, stringToJsonObjectConverter); + verifyNoMoreInteractions(searchRequestFactory, elasticsearchClient, stringToJsonObjectConverter); } @ParameterizedTest @MethodSource("indexInfoDataProvider") public void shouldSearchIndexByQueryBuilderWithNestedSort(final IndexInfo indexInfo) throws Exception { - final QueryBuilder queryBuilder = mock(QueryBuilder.class); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC).setNestedSort(new NestedSortBuilder("nested.sort.path")); + final Query.Builder query = mock(Query.Builder.class); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f + .field("fieldName") + .order(SortOrder.Asc) + .nested(n -> n + .path("nested.sort.path") + ) + ) + ); - when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder)).thenReturn(searchRequest); - when(restHighLevelClient.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse); - when(searchResponse.getHits()).thenReturn(searchHits); - when(searchResultConverter.toJsonArray(searchHits, Object.class)).thenReturn(hitsAsJsonArray); + when(searchRequestFactory.getSearchRequestBy(query, indexInfo.getIndexName(), 10, 100, sortOptions)).thenReturn(searchRequest); + when(elasticsearchClient.search(any(SearchRequest.class), eq(JsonData.class))).thenReturn(searchResponse); + when(searchResponse.hits()).thenReturn(searchHits); + when(searchHits.total()).thenReturn(TotalHits.of(t-> t.value(0).relation(TotalHitsRelation.Eq))); + when(searchResultConverter.toJsonArray(searchHits.hits(), Object.class)).thenReturn(hitsAsJsonArray); - final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, fieldSortBuilder); + final JsonObject actualResponse = defaultUnifiedSearchService.search(query, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, sortOptions); assertThat(actualResponse.getInt("totalResults"), is(0)); assertThat(actualResponse.getJsonArray(resultHitNodeName), hasSize(0)); - verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder); - verify(restHighLevelClient).search(searchRequest, RequestOptions.DEFAULT); + verify(searchRequestFactory).getSearchRequestBy(query, indexInfo.getIndexName(), 10, 100, sortOptions); + verify(elasticsearchClient).search(searchRequest, JsonData.class); - verifyNoMoreInteractions(searchRequestFactory, restHighLevelClient, stringToJsonObjectConverter); + verifyNoMoreInteractions(searchRequestFactory, elasticsearchClient, stringToJsonObjectConverter); } @ParameterizedTest @MethodSource("indexInfoDataProvider") public void shouldSearchIndexByQueryBuilderForInnerHitsAsWell(final IndexInfo indexInfo) throws Exception { - final QueryBuilder queryBuilder = mock(QueryBuilder.class); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final Query.Builder queryBuilder = mock(Query.Builder.class); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); - when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder)).thenReturn(searchRequest); - when(restHighLevelClient.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse); - when(searchResponse.getHits()).thenReturn(searchHits); - when(searchResultConverter.toJsonArray(searchHits, Object.class)).thenReturn(hitsAsJsonArray); - when(searchResultConverter.convertInnerHitsToJsonArray(searchHits, Object.class, resultInnerHitNodeName)).thenReturn(hitsAsJsonArray); + when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, sortOptions)).thenReturn(searchRequest); + when(elasticsearchClient.search(any(SearchRequest.class), eq(JsonData.class))).thenReturn(searchResponse); + when(searchResponse.hits()).thenReturn(searchHits); + when(searchHits.total()).thenReturn(TotalHits.of(t-> t.value(0).relation(TotalHitsRelation.Eq))); + when(searchResultConverter.toJsonArray(searchHits.hits(), Object.class)).thenReturn(hitsAsJsonArray); + when(searchResultConverter.convertInnerHitsToJsonArray(searchHits.hits(), Object.class, resultInnerHitNodeName)).thenReturn(hitsAsJsonArray); - final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, fieldSortBuilder, Object.class, resultInnerHitNodeName); + final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, sortOptions, Object.class, resultInnerHitNodeName); assertThat(actualResponse.getInt("totalResults"), is(0)); assertThat(actualResponse.getJsonArray(resultHitNodeName), hasSize(0)); - verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder); - verify(restHighLevelClient).search(searchRequest, RequestOptions.DEFAULT); + verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, sortOptions); + verify(elasticsearchClient).search(searchRequest, JsonData.class); - verifyNoMoreInteractions(searchRequestFactory, restHighLevelClient, stringToJsonObjectConverter); + verifyNoMoreInteractions(searchRequestFactory, elasticsearchClient, stringToJsonObjectConverter); } @ParameterizedTest @MethodSource("indexInfoDataProvider") public void shouldSearchIndexByQueryBuilderForInnerHitsAsWellWithNestedSort(final IndexInfo indexInfo) throws Exception { - final QueryBuilder queryBuilder = mock(QueryBuilder.class); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC).setNestedSort(new NestedSortBuilder("nested.sort.path")); + final Query.Builder queryBuilder = mock(Query.Builder.class); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f + .field("fieldName") + .order(SortOrder.Asc) + .nested(n -> n + .path("nested.sort.path") + ) + ) + ); - when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder)).thenReturn(searchRequest); - when(restHighLevelClient.search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse); - when(searchResponse.getHits()).thenReturn(searchHits); - when(searchResultConverter.toJsonArray(searchHits, Object.class)).thenReturn(hitsAsJsonArray); - when(searchResultConverter.convertInnerHitsToJsonArray(searchHits, Object.class, resultInnerHitNodeName)).thenReturn(hitsAsJsonArray); + when(searchRequestFactory.getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, sortOptions)).thenReturn(searchRequest); + when(elasticsearchClient.search(any(SearchRequest.class), eq(JsonData.class))).thenReturn(searchResponse); + when(searchResponse.hits()).thenReturn(searchHits); + when(searchHits.total()).thenReturn(TotalHits.of(t-> t.value(0).relation(TotalHitsRelation.Eq))); + when(searchResultConverter.toJsonArray(searchHits.hits(), Object.class)).thenReturn(hitsAsJsonArray); + when(searchResultConverter.convertInnerHitsToJsonArray(searchHits.hits(), Object.class, resultInnerHitNodeName)).thenReturn(hitsAsJsonArray); - final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, fieldSortBuilder, Object.class, resultInnerHitNodeName); + final JsonObject actualResponse = defaultUnifiedSearchService.search(queryBuilder, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, sortOptions, Object.class, resultInnerHitNodeName); assertThat(actualResponse.getInt("totalResults"), is(0)); assertThat(actualResponse.getJsonArray(resultHitNodeName), hasSize(0)); - verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, fieldSortBuilder); - verify(restHighLevelClient).search(searchRequest, RequestOptions.DEFAULT); + verify(searchRequestFactory).getSearchRequestBy(queryBuilder, indexInfo.getIndexName(), 10, 100, sortOptions); + verify(elasticsearchClient).search(searchRequest, JsonData.class); - verifyNoMoreInteractions(searchRequestFactory, restHighLevelClient, stringToJsonObjectConverter); + verifyNoMoreInteractions(searchRequestFactory, elasticsearchClient, stringToJsonObjectConverter); } @ParameterizedTest @MethodSource("indexInfoDataProvider") public void shouldThrowUnifiedSearchClientExceptionOnSearchByQueryBuilder(final IndexInfo indexInfo) { - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); - given(searchRequestFactory.getSearchRequestBy(any(QueryBuilder.class), any(String.class), anyInt(), anyInt(), any(FieldSortBuilder.class))).willAnswer(invocation -> { + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); + given(searchRequestFactory.getSearchRequestBy(any(Query.Builder.class), any(String.class), anyInt(), anyInt(), any(SortOptions.class))).willAnswer(invocation -> { throw new IOException("oops"); }); final UnifiedSearchClientException unifiedSearchClientException = assertThrows(UnifiedSearchClientException.class, () -> defaultUnifiedSearchService.search( - queryBuilder, + query, indexInfo.getIndexName(), Object.class, resultHitNodeName, 10, 100, - fieldSortBuilder)); + sortOptions)); assertThat(unifiedSearchClientException.getMessage(), is("Unable to perform search by QueryBuilder")); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactoryTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactoryTest.java index 88b0decc..9ad1d454 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactoryTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchRequestFactoryTest.java @@ -1,20 +1,17 @@ package uk.gov.justice.services.unifiedsearch.client.search; -import static org.elasticsearch.search.sort.SortBuilders.fieldSort; -import static org.elasticsearch.search.sort.SortOrder.ASC; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static uk.gov.justice.services.test.utils.core.reflection.ReflectionUtil.setField; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.NestedSortBuilder; +import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch._types.SortOptions; import org.junit.jupiter.api.Test; public class SearchRequestFactoryTest { @@ -27,14 +24,14 @@ public void shouldCreateSearchRequestWithoutSorting() { setField(searchRequestFactory, "maxQueryResultSize", "100"); - final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", 10, 100, null); + final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", 10, 100, null); assertThat(searchRequest, notNullValue()); - assertThat(searchRequest.indices().length, is(1)); - assertThat(searchRequest.indices()[0], is("indexName")); - assertThat(searchRequest.source().size(), is(10)); - assertThat(searchRequest.source().from(), is(100)); - assertThat(searchRequest.source().sorts(), is(nullValue())); + assertThat(searchRequest.index().size(), is(1)); + assertThat(searchRequest.index().get(0), is("indexName")); + assertThat(searchRequest.size(), is(10)); + assertThat(searchRequest.from(), is(100)); + assertThat(searchRequest.sort().isEmpty(), is(true)); } @@ -42,72 +39,88 @@ public void shouldCreateSearchRequestWithoutSorting() { public void shouldCreateSearchRequest() { setField(searchRequestFactory, "maxQueryResultSize", "100"); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); - final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", 10, 100, fieldSortBuilder); + final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", 10, 100, sortOptions); assertThat(searchRequest, notNullValue()); - assertThat(searchRequest.indices().length, is(1)); - assertThat(searchRequest.indices()[0], is("indexName")); - assertThat(searchRequest.source().size(), is(10)); - assertThat(searchRequest.source().from(), is(100)); - assertThat(searchRequest.source().sorts(), hasSize(1)); - assertThat(searchRequest.source().sorts().get(0).order(), is(ASC)); + assertThat(searchRequest.index().size(), is(1)); + assertThat(searchRequest.index().get(0), is("indexName")); + assertThat(searchRequest.size(), is(10)); + assertThat(searchRequest.from(), is(100)); + assertThat(searchRequest.sort(), hasSize(1)); + assertThat(searchRequest.sort().get(0).field().order(), is(SortOrder.Asc)); } @Test public void shouldCreateSearchRequestWithNestedSort() { setField(searchRequestFactory, "maxQueryResultSize", "100"); - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC).setNestedSort(new NestedSortBuilder("nested.sort.path")); - - final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", 10, 100, fieldSortBuilder); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f + .field("fieldName") + .order(SortOrder.Asc) + .nested(n -> n + .path("nested.sort.path") + ) + ) + ); + + final SearchRequest searchRequest = searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", 10, 100, sortOptions); assertThat(searchRequest, notNullValue()); - assertThat(searchRequest.indices().length, is(1)); - assertThat(searchRequest.indices()[0], is("indexName")); - assertThat(searchRequest.source().size(), is(10)); - assertThat(searchRequest.source().from(), is(100)); - assertThat(searchRequest.source().sorts(), hasSize(1)); - assertThat(searchRequest.source().sorts().get(0).order(), is(ASC)); - final FieldSortBuilder actualFieldSort = (FieldSortBuilder) searchRequest.source().sorts().get(0); - assertThat(actualFieldSort.getNestedSort().getPath(), is("nested.sort.path")); + assertThat(searchRequest.index().size(), is(1)); + assertThat(searchRequest.index().get(0), is("indexName")); + assertThat(searchRequest.size(), is(10)); + assertThat(searchRequest.from(), is(100)); + assertThat(searchRequest.sort(), hasSize(1)); + assertThat(searchRequest.sort().get(0).field().order(), is(SortOrder.Asc)); + assertThat(searchRequest.sort().get(0).field().nested().path(), is("nested.sort.path")); } @Test public void shouldFailForTooLargeReturnSize() { - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); setField(searchRequestFactory, "maxQueryResultSize", "10"); final IllegalArgumentException illegalArgumentException = assertThrows( IllegalArgumentException.class, - () -> searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", 1000, 100, fieldSortBuilder)); + () -> searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", 1000, 100, sortOptions)); assertThat(illegalArgumentException.getMessage(), is("Provided 'pageSize' param [1000] must be between 0 and 10")); } @Test public void shouldFailForNegativeReturnSize() { - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); + setField(searchRequestFactory, "maxQueryResultSize", "10"); final IllegalArgumentException illegalArgumentException = assertThrows( IllegalArgumentException.class, - () -> searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", -10, 100, fieldSortBuilder)); + () -> searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", -10, 100, sortOptions)); assertThat(illegalArgumentException.getMessage(), is("Provided 'pageSize' param [-10] must be between 0 and 10")); } @Test public void shouldFailForInvalidFromValue() { - final FieldSortBuilder fieldSortBuilder = fieldSort("fieldName").order(ASC); + final SortOptions sortOptions = SortOptions.of(s -> s + .field(f -> f.field("fieldName").order(SortOrder.Asc)) + ); setField(searchRequestFactory, "maxQueryResultSize", "100"); final IllegalArgumentException illegalArgumentException = assertThrows( IllegalArgumentException.class, - () -> searchRequestFactory.getSearchRequestBy(mock(QueryBuilder.class), "indexName", 10, -10, fieldSortBuilder)); + () -> searchRequestFactory.getSearchRequestBy(mock(Query.Builder.class), "indexName", 10, -10, sortOptions)); assertThat(illegalArgumentException.getMessage(), is("Provided 'startFrom' param [-10] must be greater or equal to 0")); } diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverterTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverterTest.java index d14df1bf..3928355c 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverterTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/search/SearchResultConverterTest.java @@ -1,7 +1,8 @@ package uk.gov.justice.services.unifiedsearch.client.search; import static com.jayway.jsonassert.impl.matcher.IsCollectionWithSize.hasSize; -import static org.apache.lucene.search.TotalHits.Relation.EQUAL_TO; +import static java.util.Collections.singletonList; +import static org.mockito.ArgumentMatchers.any; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsNull.notNullValue; @@ -11,21 +12,19 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import co.elastic.clients.json.JsonData; +import co.elastic.clients.json.JsonpMapper; +import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.jupiter.api.extension.ExtendWith; -import uk.gov.justice.services.common.converter.ObjectToJsonObjectConverter; +import uk.gov.justice.services.unifiedsearch.client.domain.CaseDetails; import uk.gov.justice.services.unifiedsearch.client.utils.UnifiedSearchClientException; -import java.io.IOException; - import jakarta.json.JsonArray; import jakarta.json.JsonObject; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.lucene.search.TotalHits; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; + +import co.elastic.clients.elasticsearch.core.search.Hit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -39,49 +38,43 @@ public class SearchResultConverterTest { private ObjectMapper objectMapper; @Mock - private ObjectToJsonObjectConverter objectToJsonObjectConverter; - @Mock - private JsonObject hitAsJsonObject; + private JsonpMapper jsonpMapper; @Mock - private Object hitAsObject; + private JsonObject hitAsJsonObject; - private SearchHits searchHits; - private SearchHit searchHit; + private Hit searchHit; @InjectMocks private SearchResultConverter searchResultConverter; @BeforeEach public void setUp() { - searchHit = new SearchHit(1); - searchHits = new SearchHits(new SearchHit[]{searchHit}, new TotalHits(1, EQUAL_TO), 1F); + searchHit = Hit.of(h -> h.index("dummy-index").id("1").score(1.0).source(JsonData.of(new CaseDetails()))); } @Test - public void shouldThrowException() throws Exception { - when(objectMapper.readValue(searchHit.getSourceAsString(), Object.class)).thenThrow(new JsonGenerationException("Oops", mock(JsonGenerator.class))); + public void shouldThrowException() throws JsonProcessingException { + when(objectMapper.writeValueAsString(any(Object.class))).thenThrow(new IllegalArgumentException("Oops", mock(Throwable.class))); - var e = assertThrows(UnifiedSearchClientException.class, () -> searchResultConverter.toJsonArray(searchHits, Object.class)); + var e = assertThrows(UnifiedSearchClientException.class, () -> searchResultConverter.toJsonArray(singletonList(searchHit), Object.class)); assertThat(e.getMessage(), is("Failed to deserialize search response")); - verify(objectMapper).readValue(searchHit.getSourceAsString(), Object.class); - verifyNoMoreInteractions(objectMapper, objectToJsonObjectConverter); + verify(objectMapper).writeValueAsString(any(CaseDetails.class)); + verifyNoMoreInteractions(objectMapper); } @Test - public void shouldToJsonArray() throws IOException { - when(objectMapper.readValue(searchHit.getSourceAsString(), Object.class)).thenReturn(hitAsObject); - when(objectToJsonObjectConverter.convert(hitAsObject)).thenReturn(hitAsJsonObject); + public void shouldToJsonArray() throws JsonProcessingException { + when(objectMapper.writeValueAsString(any(CaseDetails.class))).thenReturn("{}"); - final JsonArray actualResult = searchResultConverter.toJsonArray(searchHits, Object.class); + final JsonArray actualResult = searchResultConverter.toJsonArray(singletonList(searchHit), Object.class); - verify(objectMapper).readValue(searchHit.getSourceAsString(), Object.class); - verify(objectToJsonObjectConverter).convert(hitAsObject); + verify(objectMapper).writeValueAsString(any(CaseDetails.class)); assertThat(actualResult, is(notNullValue())); assertThat(actualResult, hasSize(1)); - verifyNoMoreInteractions(objectMapper, objectToJsonObjectConverter); + verifyNoMoreInteractions(objectMapper); } } \ No newline at end of file diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformerTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformerTest.java index 749286b1..b51df3d6 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformerTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/CaseDetailsTransformerTest.java @@ -16,7 +16,7 @@ import jakarta.json.JsonObject; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetResponse; +import co.elastic.clients.elasticsearch.core.GetResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -66,7 +66,7 @@ public void shouldUpdateExistingParty() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = caseDetailsTransformer.transform(index, getResponse); @@ -110,7 +110,7 @@ public void shouldUpdateExistingPartyHearingAndApplication() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = caseDetailsTransformer.transform(index, getResponse); @@ -159,7 +159,7 @@ public void shouldUpdateExistingCaseStatus() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = caseDetailsTransformer.transform(index, getResponse); diff --git a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformerTest.java b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformerTest.java index eaa777f6..5dd9ee43 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformerTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-client/src/test/java/uk/gov/justice/services/unifiedsearch/client/transformer/cps/CpsCaseDetailsTransformerTest.java @@ -14,10 +14,9 @@ import jakarta.json.JsonObject; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.get.GetResponse; +import co.elastic.clients.elasticsearch.core.GetResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.hamcrest.MatcherAssert.assertThat; import org.mockito.InjectMocks; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; @@ -56,7 +55,7 @@ public void shouldUpdateExistingParty() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = cpsCaseDetailsTransformer.transform(index, getResponse); @@ -93,7 +92,7 @@ public void shouldUpdateExistingPartyHearing() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = cpsCaseDetailsTransformer.transform(index, getResponse); @@ -131,7 +130,7 @@ public void shouldUpdateExistingCaseStatus() { final GetResponse getResponse = mock(GetResponse.class); - when(getResponse.getSourceAsString()).thenReturn(response.toString()); + when(getResponse.source()).thenReturn(response); final CaseDetails caseDetails = cpsCaseDetailsTransformer.transform(index, getResponse); diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml b/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml index a35d1609..d62f18fb 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml @@ -10,17 +10,13 @@ unifiedsearch-test-utils - - org.elasticsearch - elasticsearch - uk.gov.justice.utils utilities-core - org.elasticsearch.client - elasticsearch-rest-high-level-client + co.elastic.clients + elasticsearch-java commons-io diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClient.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClient.java index 1368719e..85fa6679 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClient.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClient.java @@ -6,39 +6,61 @@ import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.transport.rest_client.RestClientTransport; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClientBuilder; -import org.elasticsearch.client.RestHighLevelClient; public class ElasticSearchClient { private static final CredentialProviderUtil credentialProvider = new CredentialProviderUtil(); - public RestHighLevelClient restClient() { + public ElasticsearchClient restClient() { return restClient(CRIME_CASE); } - public RestHighLevelClient adminRestClient() { + public ElasticsearchClient adminRestClient() { return adminRestClient(CRIME_CASE); } - public RestHighLevelClient restClient(final IndexInfo indexInfo) { + public ElasticsearchClient restClient(final IndexInfo indexInfo) { final RestClientBuilder restClientBuilder = builder(HttpHost.create(ES_URI)); restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialProvider.credentialsProvider(indexInfo))); - return new RestHighLevelClient(restClientBuilder); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(objectMapper); + + RestClientTransport transport = new RestClientTransport(restClientBuilder.build(), jsonpMapper); + + return new ElasticsearchClient(transport); } - public RestHighLevelClient adminRestClient(final IndexInfo indexInfo) { + public ElasticsearchClient adminRestClient(final IndexInfo indexInfo) { final RestClientBuilder restClientBuilder = builder(HttpHost.create(ES_URI)); restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialProvider.adminCredentialsProvider(indexInfo))); - return new RestHighLevelClient(restClientBuilder); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper(objectMapper); + + RestClientTransport transport = new RestClientTransport(restClientBuilder.build(), jsonpMapper); + + return new ElasticsearchClient(transport); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtil.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtil.java index 5e4e16a4..fd91b422 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtil.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtil.java @@ -1,17 +1,14 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; -import static org.elasticsearch.client.RequestOptions.DEFAULT; -import static org.elasticsearch.xcontent.XContentType.JSON; - import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; import java.io.IOException; +import java.io.StringReader; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.indices.CreateIndexRequest; +import co.elastic.clients.elasticsearch.indices.CreateIndexResponse; import org.apache.commons.io.IOUtils; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.client.indices.CreateIndexRequest; -import org.elasticsearch.client.indices.CreateIndexResponse; -import org.elasticsearch.core.TimeValue; public class ElasticSearchIndexCreatorUtil { @@ -32,14 +29,17 @@ public boolean createCaseIndex(final String indexName) throws IOException { } private boolean createIndex(final String indexName, final String sourceConfig) throws IOException { - final CreateIndexRequest request = new CreateIndexRequest(indexName); - request.setTimeout(TimeValue.timeValueMinutes(2)); - request.source(sourceConfig, JSON); - final RestHighLevelClient adminRestClient = elasticSearchClient.adminRestClient(IndexInfo.findByIndexName(indexName)); + CreateIndexRequest request = CreateIndexRequest.of(c -> c + .index(indexName) + .withJson(new StringReader(sourceConfig)) + .timeout(t -> t.time("2m")) + ); + + final ElasticsearchClient adminRestClient = elasticSearchClient.adminRestClient(IndexInfo.findByIndexName(indexName)); try { - final CreateIndexResponse response = adminRestClient.indices().create(request, DEFAULT); + final CreateIndexResponse response = adminRestClient.indices().create(request); - return response.isAcknowledged(); + return response.acknowledged(); } finally { adminRestClient.close(); } diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtil.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtil.java index f3ad60a2..fe12da27 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtil.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtil.java @@ -1,21 +1,22 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.builder.SearchSourceBuilder; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.json.JsonData; + import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; import java.io.IOException; +import java.util.Arrays; +import java.util.List; -import static org.elasticsearch.client.RequestOptions.DEFAULT; -import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; -import static org.elasticsearch.index.query.QueryBuilders.termsQuery; import static uk.gov.justice.services.messaging.JsonObjects.getJsonBuilderFactory; public class ElasticSearchIndexFinderUtil { @@ -27,21 +28,22 @@ public ElasticSearchIndexFinderUtil(final ElasticSearchClient elasticSearchClien } public JsonObject findAll(final String indexName) throws IOException { - return findBy(matchAllQuery(), indexName); + Query.Builder builder = new Query.Builder(); + builder.matchAll(m -> m); + return findBy(builder, indexName); } - public JsonObject findBy(final QueryBuilder queryBuilder, final String indexName) throws IOException { - final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(queryBuilder); - searchSourceBuilder.size(10000); - - final SearchRequest searchRequest = new SearchRequest(indexName); - searchRequest.source(searchSourceBuilder); + public JsonObject findBy(final Query.Builder queryBuilder, final String indexName) throws IOException { + final SearchRequest searchRequest = SearchRequest.of(s -> s + .index(indexName) + .query(queryBuilder.build()) + .size(10_000) + ); - final RestHighLevelClient restClient = elasticSearchClient.restClient(IndexInfo.findByIndexName(indexName)); + final ElasticsearchClient restClient = elasticSearchClient.restClient(IndexInfo.findByIndexName(indexName)); try { - final SearchResponse result = restClient.search(searchRequest, DEFAULT); - final JsonArray jsonArray = toJsonArray(result.getHits()); + final SearchResponse result = restClient.search(searchRequest, JsonData.class); + final JsonArray jsonArray = toJsonArray(result.hits().hits()); return getJsonBuilderFactory().createObjectBuilder() .add("index", jsonArray) .add("totalResults", jsonArray.size()) @@ -54,12 +56,21 @@ public JsonObject findBy(final QueryBuilder queryBuilder, final String indexName public JsonObject findByCaseIds(final String indexName, final String... caseIds) throws IOException { - return findBy(termsQuery("caseId", caseIds), indexName); + Query.Builder builder = new Query.Builder(); + builder.terms(t -> t + .field("caseId") + .terms(v -> v.value( + Arrays.stream(caseIds) + .map(FieldValue::of) + .toList() + ))); + + return findBy(builder, indexName); } - private JsonArray toJsonArray(final SearchHits searchHits) { + private JsonArray toJsonArray(final List> searchHits) { final JsonArrayBuilder results = getJsonBuilderFactory().createArrayBuilder(); - searchHits.forEach(searchHit -> results.add(searchHit.getSourceAsString())); + searchHits.forEach(searchHit -> results.add(searchHit.source().toString())); return results.build(); } diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtil.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtil.java index 1f145e9c..e56cf868 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtil.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtil.java @@ -1,30 +1,32 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; import static java.lang.String.format; -import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.WAIT_UNTIL; -import static org.elasticsearch.client.RequestOptions.DEFAULT; -import static org.elasticsearch.xcontent.XContentType.JSON; import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; import java.io.IOException; +import java.io.StringReader; import java.util.List; import java.util.Objects; - +import java.util.stream.Collectors; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.Refresh; +import co.elastic.clients.elasticsearch.core.BulkRequest; +import co.elastic.clients.elasticsearch.core.BulkResponse; +import co.elastic.clients.elasticsearch.core.IndexRequest; +import co.elastic.clients.elasticsearch.core.bulk.BulkOperation; +import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections.CollectionUtils; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.client.RestHighLevelClient; public class ElasticSearchIndexIngestorUtil { private ElasticSearchClient elasticSearchClient; private ObjectMapper objectMapper; - private RestHighLevelClient restClient; + private ElasticsearchClient restClient; public ElasticSearchIndexIngestorUtil() { @@ -38,23 +40,48 @@ public void ingestCaseData(final List caseData) thro restClient = elasticSearchClient.restClient(IndexInfo.findByIngesterClazz(caseData.get(0))); } - final BulkRequest bulkRequest = new BulkRequest(); - caseData.stream() - .map(caseDataObject-> toIndexRequest(IndexInfo.findByIngesterClazz(caseDataObject), caseDataObject)) + final List operations = caseData.stream() + .map(caseDataObject-> { + IndexRequest request = toIndexRequest(IndexInfo.findByIngesterClazz(caseDataObject), caseDataObject); + if (request == null) return null; + return BulkOperation.of(op -> op + .index(idx -> idx + .index(request.index()) + .id(request.id()) + .document(caseDataObject) + ) + ); + }) .filter(Objects::nonNull) - .forEach(bulkRequest::add); + .toList(); + + final BulkRequest bulkRequest = + co.elastic.clients.elasticsearch.core.BulkRequest.of(b -> b + .refresh(co.elastic.clients.elasticsearch._types.Refresh.WaitFor) + .operations(operations) + ); doBulkRequest(bulkRequest); } private void doBulkRequest(final BulkRequest bulkRequest) throws IOException { - bulkRequest.setRefreshPolicy(WAIT_UNTIL); + BulkRequest requestWithRefresh = BulkRequest.of(b -> { + b.refresh(Refresh.WaitFor); + b.operations(bulkRequest.operations()); + return b; + }); try { - final BulkResponse response = restClient.bulk(bulkRequest, DEFAULT); - - if (response.hasFailures()) { - throw new RuntimeException(format("BulkRequest failed: %s", response.buildFailureMessage())); + final BulkResponse response = restClient.bulk(requestWithRefresh); + + if (response.errors()) { + throw new RuntimeException(format("BulkRequest failed: %s", + response.items().stream() + .filter( res -> Objects.nonNull(res.error())) + .map(BulkResponseItem::error) + .map(Object::toString) + .collect(Collectors.joining(", ")) + )); } } finally { restClient.close(); @@ -64,18 +91,12 @@ private void doBulkRequest(final BulkRequest bulkRequest) throws IOException { @SuppressWarnings("squid:S3011") private IndexRequest toIndexRequest(final IndexInfo indexInfo, final BaseCaseDocument caseDocument) { final String caseId = caseDocument.getCaseId(); - final IndexRequest request = new IndexRequest(indexInfo.getIndexName()); - request.id(caseId); - request.source(toJsonString(caseDocument), JSON); - return request; - } - private String toJsonString(final Object caseDocument) { - try { - return objectMapper.writeValueAsString(caseDocument); - } catch (final JsonProcessingException jpEx) { - throw new RuntimeException("Couldn't convert to JSON !", jpEx); - } + return IndexRequest.of(i -> i + .index(indexInfo.getIndexName()) + .id(caseId) + .document(caseDocument) + ); } } diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtil.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtil.java index 1536fe22..fb5b573b 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtil.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtil.java @@ -1,19 +1,16 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; import static java.lang.String.format; -import static org.elasticsearch.client.RequestOptions.DEFAULT; import static uk.gov.moj.cpp.unifiedsearch.test.util.ingest.CrimeIndexConstants.ES_CRIME_CASE_INDEX_NAME; import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; import java.io.IOException; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.core.TimeValue; -import org.elasticsearch.rest.RestStatus; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.ElasticsearchException; +import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest; +import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse; public class ElasticSearchIndexRemoverUtil { @@ -43,20 +40,23 @@ public void deleteCaseIndex(final String indexName) throws IOException { } public boolean deleteIndex(final String indexName) throws IOException { - RestHighLevelClient adminRestClient = null; + ElasticsearchClient adminRestClient = null; try { - final DeleteIndexRequest request = new DeleteIndexRequest(indexName); - request.timeout(TimeValue.timeValueMinutes(2)); + DeleteIndexRequest request = DeleteIndexRequest.of(d -> d + .index(indexName) + .timeout(t -> t.time("2m")) + ); adminRestClient = elasticSearchClient.adminRestClient(IndexInfo.findByIndexName(indexName)); - final AcknowledgedResponse response = adminRestClient.indices().delete(request, DEFAULT); - if (response.isAcknowledged()) { + final DeleteIndexResponse response = adminRestClient.indices().delete(request); + if (response.acknowledged()) { return true; } } catch (final ElasticsearchException exception) { - if (exception.status() == RestStatus.NOT_FOUND) { + if (exception.response() != null + && exception.response().status() == 404){ //This is OK } else { throw new RuntimeException(format("Failed to delete index: %s", indexName), exception); diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/CaseDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/CaseDocument.java index 0cf9f6fb..4ff0b221 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/CaseDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/CaseDocument.java @@ -44,6 +44,25 @@ public CaseDocument(final String caseId, final String caseReference, final Strin this.sourceSystemReference = sourceSystemReference; } + @Override + public String toString() { + return "CaseDocument{" + + "caseId='" + caseId + '\'' + + ", caseReference='" + caseReference + '\'' + + ", prosecutingAuthority='" + prosecutingAuthority + '\'' + + ", caseStatus='" + caseStatus + '\'' + + ", _case_type='" + _case_type + '\'' + + ", _is_sjp=" + _is_sjp + + ", _is_magistrates=" + _is_magistrates + + ", _is_crown=" + _is_crown + + ", _is_charging=" + _is_charging + + ", sjpNoticeServed='" + sjpNoticeServed + '\'' + + ", sourceSystemReference='" + sourceSystemReference + '\'' + + ", parties=" + parties + + ", hearings=" + hearings + + ", applications=" + applications + + '}'; + } public String getCaseId() { return caseId; diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/OffenceDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/OffenceDocument.java index 31870b47..55b5029b 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/OffenceDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/OffenceDocument.java @@ -22,6 +22,29 @@ public class OffenceDocument { private List pleas; private VerdictDocument verdict; + @Override + public String toString() { + return "OffenceDocument{" + + "offenceId='" + offenceId + '\'' + + ", offenceCode='" + offenceCode + '\'' + + ", offenceTitle='" + offenceTitle + '\'' + + ", offenceLegislation='" + offenceLegislation + '\'' + + ", proceedingsConcluded=" + proceedingsConcluded + + ", arrestDate='" + arrestDate + '\'' + + ", dateOfInformation='" + dateOfInformation + '\'' + + ", endDate='" + endDate + '\'' + + ", startDate='" + startDate + '\'' + + ", chargeDate='" + chargeDate + '\'' + + ", modeOfTrial='" + modeOfTrial + '\'' + + ", orderIndex=" + orderIndex + + ", wording='" + wording + '\'' + + ", laaReference=" + laaReference + + ", courtOrders=" + courtOrders + + ", pleas=" + pleas + + ", verdict=" + verdict + + '}'; + } + public OffenceDocument(final String offenceId, final String offenceCode, final String offenceTitle, final String offenceLegislation, final boolean proceedingsConcluded, final String arrestDate, final String dateOfInformation, final String endDate, final String startDate, final String chargeDate, final String modeOfTrial, final int orderIndex, final String wording, final LaaReferenceDocument laaReference, final List courtOrders, final List pleas, diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/PartyDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/PartyDocument.java index 9323673e..9b22e134 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/PartyDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/PartyDocument.java @@ -149,6 +149,33 @@ public AddressDocument getDefendantAddress() { return defendantAddress; } + @Override + public String toString() { + return "PartyDocument{" + + "partyId='" + partyId + '\'' + + ", firstName='" + firstName + '\'' + + ", middleName='" + middleName + '\'' + + ", lastName='" + lastName + '\'' + + ", title='" + title + '\'' + + ", dateOfBirth='" + dateOfBirth + '\'' + + ", gender='" + gender + '\'' + + ", addressLines='" + addressLines + '\'' + + ", postCode='" + postCode + '\'' + + ", pncId='" + pncId + '\'' + + ", arrestSummonsNumber='" + arrestSummonsNumber + '\'' + + ", _party_type='" + _party_type + '\'' + + ", organisationName='" + organisationName + '\'' + + ", aliases=" + aliases + + ", nationalInsuranceNumber='" + nationalInsuranceNumber + '\'' + + ", proceedingsConcluded=" + proceedingsConcluded + + ", representationOrder=" + representationOrder + + ", offences=" + offences + + ", masterPartyId='" + masterPartyId + '\'' + + ", croNumber='" + croNumber + '\'' + + ", courtProceedingsInitiated='" + courtProceedingsInitiated + '\'' + + ", defendantAddress=" + defendantAddress + + '}'; + } public static class Builder { diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/CaseDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/CaseDocument.java index ca68eb42..d02a6818 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/CaseDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/CaseDocument.java @@ -118,6 +118,30 @@ public List getLinkedCases() { return linkedCases; } + @Override + public String toString() { + return "CaseDocument{" + + "caseId='" + caseId + '\'' + + ", urn='" + urn + '\'' + + ", cpsUnitCode='" + cpsUnitCode + '\'' + + ", cjsAreaCodes=" + cjsAreaCodes + + ", cpsAreaCode='" + cpsAreaCode + '\'' + + ", caseType='" + caseType + '\'' + + ", caseStatusCode='" + caseStatusCode + '\'' + + ", operationName='" + operationName + '\'' + + ", paralegalOfficer='" + paralegalOfficer + '\'' + + ", crownAdvocate='" + crownAdvocate + '\'' + + ", prosecutor='" + prosecutor + '\'' + + ", witnessCareUnitCode='" + witnessCareUnitCode + '\'' + + ", witnessCareOfficer='" + witnessCareOfficer + '\'' + + ", unit='" + unit + '\'' + + ", unitGroup='" + unitGroup + '\'' + + ", parties=" + parties + + ", hearings=" + hearings + + ", linkedCases=" + linkedCases + + '}'; + } + public static class Builder { private String caseId; diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/OffenceDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/OffenceDocument.java index f25eec76..2aa9f370 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/OffenceDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/OffenceDocument.java @@ -10,6 +10,19 @@ public class OffenceDocument { private String startDate; private String endDate; + @Override + public String toString() { + return "OffenceDocument{" + + "offenceId='" + offenceId + '\'' + + ", offenceCode='" + offenceCode + '\'' + + ", custodyTimeLimit='" + custodyTimeLimit + '\'' + + ", type='" + type + '\'' + + ", description='" + description + '\'' + + ", startDate='" + startDate + '\'' + + ", endDate='" + endDate + '\'' + + '}'; + } + public OffenceDocument(final String offenceId, final String offenceCode, final String custodyTimeLimit, final String type, final String description, final String startDate, final String endDate) { this.offenceId = offenceId; diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/PartyDocument.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/PartyDocument.java index 9ecddf97..992b4106 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/PartyDocument.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/main/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/document/cps/PartyDocument.java @@ -19,6 +19,23 @@ public class PartyDocument { private PartyDocument() { } + @Override + public String toString() { + return "PartyDocument{" + + "partyId='" + partyId + '\'' + + ", _party_type=" + _party_type + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", aliases=" + aliases + + ", dateOfBirth='" + dateOfBirth + '\'' + + ", asn='" + asn + '\'' + + ", pncId='" + pncId + '\'' + + ", organisationName='" + organisationName + '\'' + + ", oicShoulderNumber='" + oicShoulderNumber + '\'' + + ", offences=" + offences + + '}'; + } + public PartyDocument(final String partyId, final List _party_type, final String firstName, final String lastName, final List aliases, final String dateOfBirth, final String asn, final String pncId, final String organisationName, final String oicShoulderNumber, diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClientTest.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClientTest.java index 8610329a..5316d737 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClientTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchClientTest.java @@ -5,12 +5,14 @@ import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CRIME_CASE; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo; -import org.elasticsearch.client.RestHighLevelClient; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -34,8 +36,8 @@ public void setUp() { @Test public void shouldReturnHighLevelRestClient() { - final RestHighLevelClient restHighLevelClient1 = elasticSearchClient.restClient(); - final RestHighLevelClient restHighLevelClient2 = elasticSearchClient.adminRestClient(); + final ElasticsearchClient restHighLevelClient1 = elasticSearchClient.restClient(); + final ElasticsearchClient restHighLevelClient2 = elasticSearchClient.adminRestClient(); assertNotNull(restHighLevelClient1); assertNotNull(restHighLevelClient2); @@ -45,8 +47,8 @@ public void shouldReturnHighLevelRestClient() { @MethodSource("provideCaseIndex") public void shouldReturnHighLevelRestClientForCaseIndexes(final IndexInfo indexInfo) { - final RestHighLevelClient restHighLevelClient1 = elasticSearchClient.restClient(indexInfo); - final RestHighLevelClient restHighLevelClient2 = elasticSearchClient.adminRestClient(indexInfo); + final ElasticsearchClient restHighLevelClient1 = elasticSearchClient.restClient(indexInfo); + final ElasticsearchClient restHighLevelClient2 = elasticSearchClient.adminRestClient(indexInfo); assertNotNull(restHighLevelClient1); assertNotNull(restHighLevelClient2); diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtilTest.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtilTest.java index 88d73c67..7c0e4cfc 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtilTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexCreatorUtilTest.java @@ -10,6 +10,9 @@ import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CRIME_CASE; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch.indices.CreateIndexRequest; +import co.elastic.clients.elasticsearch.indices.CreateIndexResponse; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -17,11 +20,7 @@ import java.io.IOException; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.indices.CreateIndexRequest; -import org.elasticsearch.client.indices.CreateIndexResponse; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -47,8 +46,8 @@ public void shouldCreateCaseIndexWithIndexName(final IndexInfo indexInfo) throws final ElasticSearchIndexCreatorUtil elasticSearchIndexCreatorUtil = new ElasticSearchIndexCreatorUtil(elasticSearchClient); final CreateIndexResponse createIndexResponse = mock(CreateIndexResponse.class); - when(createIndexResponse.isAcknowledged()).thenReturn(true); - when(elasticSearchClient.adminRestClient(indexInfo).indices().create(any(CreateIndexRequest.class), any(RequestOptions.class))).thenReturn(createIndexResponse); + when(createIndexResponse.acknowledged()).thenReturn(true); + when(elasticSearchClient.adminRestClient(indexInfo).indices().create(any(CreateIndexRequest.class))).thenReturn(createIndexResponse); final boolean caseIndex = elasticSearchIndexCreatorUtil.createCaseIndex(indexInfo.getIndexName()); diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtilTest.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtilTest.java index 7a7e0309..815061c1 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtilTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexFinderUtilTest.java @@ -1,7 +1,5 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; -import static org.apache.lucene.search.TotalHits.Relation.EQUAL_TO; -import static org.elasticsearch.client.RequestOptions.DEFAULT; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.mockito.ArgumentMatchers.any; @@ -14,7 +12,17 @@ import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CPS_CASE; import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CRIME_CASE; +import java.util.List; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import co.elastic.clients.elasticsearch.core.search.HitsMetadata; +import co.elastic.clients.elasticsearch.core.search.TotalHits; +import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation; +import co.elastic.clients.json.JsonData; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -26,15 +34,6 @@ import jakarta.json.JsonNumber; import jakarta.json.JsonObject; -import org.apache.lucene.search.TotalHits; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.index.query.MatchAllQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.TermsQueryBuilder; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; import org.junit.jupiter.api.BeforeEach; import org.mockito.Answers; import org.mockito.Mock; @@ -68,18 +67,26 @@ public void shouldFindBy(final IndexInfo indexInfo) throws IOException { final String testJsonString = "test"; final SearchResponse searchResponse = mock(SearchResponse.class); - final SearchHit searchHit = mock(SearchHit.class); - final SearchHits searchHits = new SearchHits(new SearchHit[]{searchHit}, new TotalHits(1, EQUAL_TO), 1F); + final Hit searchHit = mock(Hit.class); + + final HitsMetadata searchHits = HitsMetadata.of(hm -> hm + .hits(List.of(searchHit)) + .total(new TotalHits.Builder() + .value(1L) + .relation(TotalHitsRelation.Eq) + .build()) + .maxScore(1.0) + ); - when(elasticSearchClient.restClient(indexInfo).search(any(SearchRequest.class), any(RequestOptions.class))).thenReturn(searchResponse); - when(searchHit.getSourceAsString()).thenReturn(testJsonString); - when(searchResponse.getHits()).thenReturn(searchHits); + when(searchHit.source()).thenReturn(testJsonString); + when(elasticSearchClient.restClient(indexInfo).search(any(SearchRequest.class), eq(JsonData.class))).thenReturn(searchResponse); + when(searchResponse.hits()).thenReturn(searchHits); - final QueryBuilder queryBuilder = mock(QueryBuilder.class); + final Query.Builder queryBuilder = mock(Query.Builder.class); final JsonObject jsonObject = elasticSearchIndexFinderUtil.findBy(queryBuilder, indexInfo.getIndexName()); final JsonNumber totalResults = getJsonNumber(jsonObject, "totalResults").get(); - verify(elasticSearchClient.restClient(indexInfo)).search(any(SearchRequest.class), eq(DEFAULT)); + verify(elasticSearchClient.restClient(indexInfo)).search(any(SearchRequest.class), eq(JsonData.class)); assertThat(totalResults.intValue(), is(1)); assertThat(jsonObject.getJsonArray("index").getJsonString(0).getString(), is(testJsonString)); } @@ -89,7 +96,7 @@ public void shouldFindBy(final IndexInfo indexInfo) throws IOException { public void shouldFindByCaseIds(final IndexInfo indexInfo) throws IOException { final ElasticSearchIndexFinderUtil elasticSearchIndexFinderUtilSpy = spy(elasticSearchIndexFinderUtil); elasticSearchIndexFinderUtilSpy.findByCaseIds(indexInfo.getIndexName(), "01"); - verify(elasticSearchIndexFinderUtilSpy).findBy(any(TermsQueryBuilder.class), eq(indexInfo.getIndexName())); + verify(elasticSearchIndexFinderUtilSpy).findBy(any(Query.Builder.class), eq(indexInfo.getIndexName())); } @ParameterizedTest @@ -97,6 +104,6 @@ public void shouldFindByCaseIds(final IndexInfo indexInfo) throws IOException { public void shouldFindAll(final IndexInfo indexInfo) throws IOException { final ElasticSearchIndexFinderUtil elasticSearchIndexFinderUtilSpy = spy(elasticSearchIndexFinderUtil); elasticSearchIndexFinderUtilSpy.findAll(indexInfo.getIndexName()); - verify(elasticSearchIndexFinderUtilSpy).findBy(any(MatchAllQueryBuilder.class), eq(indexInfo.getIndexName())); + verify(elasticSearchIndexFinderUtilSpy).findBy(any(Query.Builder.class), eq(indexInfo.getIndexName())); } } \ No newline at end of file diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtilTest.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtilTest.java index 5f16ea66..33dbd60b 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtilTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexIngestorUtilTest.java @@ -11,6 +11,11 @@ import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CPS_CASE; import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CRIME_CASE; +import co.elastic.clients.elasticsearch._types.ErrorCause; +import co.elastic.clients.elasticsearch.core.BulkRequest; +import co.elastic.clients.elasticsearch.core.BulkResponse; +import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem; +import co.elastic.clients.elasticsearch.core.bulk.OperationType; import org.junit.jupiter.api.extension.ExtendWith; import uk.gov.moj.cpp.unifiedsearch.test.util.ingest.document.CaseDocument; import uk.gov.moj.cpp.unifiedsearch.test.util.ingest.mothers.ApplicationDocumentMother; @@ -18,12 +23,10 @@ import uk.gov.moj.cpp.unifiedsearch.test.util.ingest.mothers.PartyDocumentMother; import java.io.IOException; +import java.util.Collections; import java.util.UUID; import com.fasterxml.jackson.databind.ObjectMapper; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.client.RequestOptions; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -48,12 +51,11 @@ public void shouldIngestData() throws IOException { final BulkResponse bulkResponse = mock(BulkResponse.class); - when(elasticSearchClient.restClient(CRIME_CASE).bulk(any(BulkRequest.class), any(RequestOptions.class))).thenReturn(bulkResponse); - when(bulkResponse.hasFailures()).thenReturn(false); - when(objectMapper.writeValueAsString(caseDocument)).thenReturn("test"); + when(elasticSearchClient.restClient(CRIME_CASE).bulk(any(BulkRequest.class))).thenReturn(bulkResponse); + when(bulkResponse.errors()).thenReturn(false); elasticSearchIndexIngestorUtil.ingestCaseData(asList(caseDocument)); - assertThat(bulkResponse.hasFailures(), is(false)); + assertThat(bulkResponse.errors(), is(false)); } @Test @@ -63,13 +65,13 @@ public void shouldFailIfResponseHasFailures() throws IOException { final CaseDocument caseDocument = getCrimeCaseDocument(); final BulkResponse bulkResponse = mock(BulkResponse.class); - when(elasticSearchClient.restClient(CRIME_CASE).bulk(any(BulkRequest.class), any(RequestOptions.class))).thenReturn(bulkResponse); - when(bulkResponse.hasFailures()).thenReturn(true); - when(bulkResponse.buildFailureMessage()).thenReturn(exceptionMessage); - when(objectMapper.writeValueAsString(caseDocument)).thenReturn("test"); + when(elasticSearchClient.restClient(CRIME_CASE).bulk(any(BulkRequest.class))).thenReturn(bulkResponse); + when(bulkResponse.errors()).thenReturn(true); + when(bulkResponse.items()).thenReturn(Collections.singletonList(BulkResponseItem.of(t -> t.error(ErrorCause.of( e -> e.reason(exceptionMessage))) + .operationType(OperationType.Create).index("index").status(1)))); var e = assertThrows(RuntimeException.class, () -> elasticSearchIndexIngestorUtil.ingestCaseData(asList(caseDocument))); - assertThat(e.getMessage(), is("BulkRequest failed: " + exceptionMessage)); + assertThat(e.getMessage(), is("BulkRequest failed: ErrorCause: {\"reason\":\"Some really bad exception\"}")); } @Test @@ -77,12 +79,11 @@ public void shouldIngestCpsCaseData() throws IOException { final uk.gov.moj.cpp.unifiedsearch.test.util.ingest.document.cps.CaseDocument caseDocument = getCpsCaseDocument(); final BulkResponse bulkResponse = mock(BulkResponse.class); - when(elasticSearchClient.restClient(CPS_CASE).bulk(any(BulkRequest.class), any(RequestOptions.class))).thenReturn(bulkResponse); - when(bulkResponse.hasFailures()).thenReturn(false); - when(objectMapper.writeValueAsString(caseDocument)).thenReturn("test"); + when(elasticSearchClient.restClient(CPS_CASE).bulk(any(BulkRequest.class))).thenReturn(bulkResponse); + when(bulkResponse.errors()).thenReturn(false); elasticSearchIndexIngestorUtil.ingestCaseData(asList(caseDocument)); - assertThat(bulkResponse.hasFailures(), is(false)); + assertThat(bulkResponse.errors(), is(false)); } @Test @@ -93,13 +94,13 @@ public void shouldFailIfResponseHasFailuresForCpsCase() throws IOException { final uk.gov.moj.cpp.unifiedsearch.test.util.ingest.document.cps.CaseDocument caseDocument = getCpsCaseDocument(); final BulkResponse bulkResponse = mock(BulkResponse.class); - when(elasticSearchClient.restClient(CPS_CASE).bulk(any(BulkRequest.class), any(RequestOptions.class))).thenReturn(bulkResponse); - when(bulkResponse.hasFailures()).thenReturn(true); - when(bulkResponse.buildFailureMessage()).thenReturn(exceptionMessage); - when(objectMapper.writeValueAsString(caseDocument)).thenReturn("test"); + when(elasticSearchClient.restClient(CPS_CASE).bulk(any(BulkRequest.class))).thenReturn(bulkResponse); + when(bulkResponse.errors()).thenReturn(true); + when(bulkResponse.items()).thenReturn(Collections.singletonList(BulkResponseItem.of(t -> t.error(ErrorCause.of( e -> e.reason(exceptionMessage))) + .operationType(OperationType.Create).index("index").status(1)))); var e = assertThrows(RuntimeException.class, () -> elasticSearchIndexIngestorUtil.ingestCaseData(asList(caseDocument))); - assertThat(e.getMessage(), is("BulkRequest failed: " + exceptionMessage)); + assertThat(e.getMessage(), is("BulkRequest failed: ErrorCause: {\"reason\":\"Some really bad exception\"}")); } private CaseDocument getCrimeCaseDocument() { diff --git a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtilTest.java b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtilTest.java index 4baf9863..f547b767 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtilTest.java +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/src/test/java/uk/gov/moj/cpp/unifiedsearch/test/util/ingest/ElasticSearchIndexRemoverUtilTest.java @@ -1,11 +1,9 @@ package uk.gov.moj.cpp.unifiedsearch.test.util.ingest; -import static org.elasticsearch.client.RequestOptions.DEFAULT; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -15,6 +13,12 @@ import static uk.gov.moj.cpp.unifiedsearch.test.util.constant.IndexInfo.CRIME_CASE; import java.util.stream.Stream; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.ElasticsearchException; +import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest; +import co.elastic.clients.elasticsearch.indices.DeleteIndexResponse; +import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -22,11 +26,6 @@ import java.io.IOException; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.IndicesClient; -import org.elasticsearch.client.RestHighLevelClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -44,13 +43,13 @@ public class ElasticSearchIndexRemoverUtilTest { private ElasticSearchIndexCreatorUtil elasticSearchIndexCreatorUtil; @Mock - private IndicesClient indicesClient; + private ElasticsearchIndicesClient indicesClient; @Mock - private AcknowledgedResponse acknowledgedResponse; + private DeleteIndexResponse acknowledgedResponse; @Mock - private RestHighLevelClient restHighLevelClient; + private ElasticsearchClient restHighLevelClient; @InjectMocks private ElasticSearchIndexRemoverUtil elasticSearchIndexRemoverUtil; @@ -144,8 +143,8 @@ public void shouldDeleteIndex(final IndexInfo indexInfo) throws IOException { when(elasticSearchClient.adminRestClient(any(IndexInfo.class))).thenReturn(restHighLevelClient); when(restHighLevelClient.indices()).thenReturn(indicesClient); - when(indicesClient.delete(any(DeleteIndexRequest.class), eq(DEFAULT))).thenReturn(acknowledgedResponse); - when(acknowledgedResponse.isAcknowledged()).thenReturn(true); + when(indicesClient.delete(any(DeleteIndexRequest.class))).thenReturn(acknowledgedResponse); + when(acknowledgedResponse.acknowledged()).thenReturn(true); final boolean result = elasticSearchIndexRemoverUtil.deleteIndex(indexInfo.getIndexName());