diff --git a/access-control-parent/access-control-drools/pom.xml b/access-control-parent/access-control-drools/pom.xml index 79b65bba..3fecd416 100644 --- a/access-control-parent/access-control-drools/pom.xml +++ b/access-control-parent/access-control-drools/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-parent - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-drools diff --git a/access-control-parent/access-control-providers/access-control-assignment-providers/pom.xml b/access-control-parent/access-control-providers/access-control-assignment-providers/pom.xml index 22e09dfe..e8012789 100644 --- a/access-control-parent/access-control-providers/access-control-assignment-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-assignment-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-assignment-providers diff --git a/access-control-parent/access-control-providers/access-control-common-providers/pom.xml b/access-control-parent/access-control-providers/access-control-common-providers/pom.xml index 05572c81..7e7ae30c 100644 --- a/access-control-parent/access-control-providers/access-control-common-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-common-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-common-providers diff --git a/access-control-parent/access-control-providers/access-control-hearing-providers/pom.xml b/access-control-parent/access-control-providers/access-control-hearing-providers/pom.xml index 50d48ecb..4e46830b 100644 --- a/access-control-parent/access-control-providers/access-control-hearing-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-hearing-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-hearing-providers diff --git a/access-control-parent/access-control-providers/access-control-progression-providers/pom.xml b/access-control-parent/access-control-providers/access-control-progression-providers/pom.xml index de40c194..84440a9e 100644 --- a/access-control-parent/access-control-providers/access-control-progression-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-progression-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-progression-providers diff --git a/access-control-parent/access-control-providers/access-control-refdata-providers/pom.xml b/access-control-parent/access-control-providers/access-control-refdata-providers/pom.xml index 7a7cd1fd..34b38c18 100644 --- a/access-control-parent/access-control-providers/access-control-refdata-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-refdata-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-refdata-providers diff --git a/access-control-parent/access-control-providers/access-control-sjp-providers/pom.xml b/access-control-parent/access-control-providers/access-control-sjp-providers/pom.xml index 0e3a8b51..ae6aac3d 100644 --- a/access-control-parent/access-control-providers/access-control-sjp-providers/pom.xml +++ b/access-control-parent/access-control-providers/access-control-sjp-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-providers - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-sjp-providers diff --git a/access-control-parent/access-control-providers/pom.xml b/access-control-parent/access-control-providers/pom.xml index 6435fdcc..acbb7892 100644 --- a/access-control-parent/access-control-providers/pom.xml +++ b/access-control-parent/access-control-providers/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-parent - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-providers diff --git a/access-control-parent/access-control-test-utils/pom.xml b/access-control-parent/access-control-test-utils/pom.xml index 5edec9e7..344ea297 100644 --- a/access-control-parent/access-control-test-utils/pom.xml +++ b/access-control-parent/access-control-test-utils/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.access-control access-control-parent - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT access-control-test-utils diff --git a/access-control-parent/pom.xml b/access-control-parent/pom.xml index 4a3b6721..809a7472 100644 --- a/access-control-parent/pom.xml +++ b/access-control-parent/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.access-control diff --git a/activiti-parent/activiti-embedded-rest-example/pom.xml b/activiti-parent/activiti-embedded-rest-example/pom.xml index c696b00c..fd067c5c 100644 --- a/activiti-parent/activiti-embedded-rest-example/pom.xml +++ b/activiti-parent/activiti-embedded-rest-example/pom.xml @@ -3,7 +3,7 @@ activiti-parent uk.gov.moj.cpp.activiti - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/activiti-parent/activiti-embedded-rest/pom.xml b/activiti-parent/activiti-embedded-rest/pom.xml index 8f988d67..d7c81457 100644 --- a/activiti-parent/activiti-embedded-rest/pom.xml +++ b/activiti-parent/activiti-embedded-rest/pom.xml @@ -3,7 +3,7 @@ activiti-parent uk.gov.moj.cpp.activiti - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/activiti-parent/pom.xml b/activiti-parent/pom.xml index 20c826b7..2570a5ab 100644 --- a/activiti-parent/pom.xml +++ b/activiti-parent/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.activiti diff --git a/audit-library-parent/audit-client/pom.xml b/audit-library-parent/audit-client/pom.xml index 980d7fe7..f101aeb4 100644 --- a/audit-library-parent/audit-client/pom.xml +++ b/audit-library-parent/audit-client/pom.xml @@ -3,7 +3,7 @@ audit-library-parent uk.gov.moj.cpp.audit - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/audit-library-parent/pom.xml b/audit-library-parent/pom.xml index afd5a1b5..755fb60d 100644 --- a/audit-library-parent/pom.xml +++ b/audit-library-parent/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.audit diff --git a/cpp-platform-library-utils/cpp-platform-azure-utils/pom.xml b/cpp-platform-library-utils/cpp-platform-azure-utils/pom.xml index 841b2707..352e7290 100644 --- a/cpp-platform-library-utils/cpp-platform-azure-utils/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-azure-utils/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-library-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-persistence/pom.xml b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-persistence/pom.xml index d9761ac0..53b6892d 100644 --- a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-persistence/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-persistence/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-data-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT cpp-platform-data-utils-persistence diff --git a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-rest/pom.xml b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-rest/pom.xml index 24432cf5..e9fe546f 100644 --- a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-rest/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-rest/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-data-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-service/pom.xml b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-service/pom.xml index e6956aeb..9bbd716c 100644 --- a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-service/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-service/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-data-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT cpp-platform-data-utils-service diff --git a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-test-utils/pom.xml b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-test-utils/pom.xml index c6f933c2..7dd60a30 100644 --- a/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-test-utils/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-data-utils/cpp-platform-data-utils-test-utils/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-data-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT cpp-platform-data-utils-test-utils diff --git a/cpp-platform-library-utils/cpp-platform-data-utils/pom.xml b/cpp-platform-library-utils/cpp-platform-data-utils/pom.xml index 62f37568..769a8b15 100644 --- a/cpp-platform-library-utils/cpp-platform-data-utils/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-data-utils/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.common.library.utils cpp-platform-library-utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT cpp-platform-data-utils diff --git a/cpp-platform-library-utils/cpp-platform-test-utils/pom.xml b/cpp-platform-library-utils/cpp-platform-test-utils/pom.xml index 46319df4..c74f045a 100644 --- a/cpp-platform-library-utils/cpp-platform-test-utils/pom.xml +++ b/cpp-platform-library-utils/cpp-platform-test-utils/pom.xml @@ -3,7 +3,7 @@ cpp-platform-library-utils uk.gov.moj.cpp.common.library.utils - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/cpp-platform-library-utils/pom.xml b/cpp-platform-library-utils/pom.xml index c4967868..184de2ac 100644 --- a/cpp-platform-library-utils/pom.xml +++ b/cpp-platform-library-utils/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.common.library.utils diff --git a/feature-control/pom.xml b/feature-control/pom.xml index 2ed81b1c..b93ecf82 100644 --- a/feature-control/pom.xml +++ b/feature-control/pom.xml @@ -3,7 +3,7 @@ platform-libraries-parent-pom uk.gov.moj.platform.libraries - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/healthchecks-parent/pom.xml b/healthchecks-parent/pom.xml index d51fbdb4..ab0b03ea 100644 --- a/healthchecks-parent/pom.xml +++ b/healthchecks-parent/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.healthchecks diff --git a/healthchecks-parent/unifiedsearch-healthchecks/pom.xml b/healthchecks-parent/unifiedsearch-healthchecks/pom.xml index 1d51ce28..8ede9d6b 100644 --- a/healthchecks-parent/unifiedsearch-healthchecks/pom.xml +++ b/healthchecks-parent/unifiedsearch-healthchecks/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.healthchecks healthchecks-parent - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 @@ -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 9c92f567..c0372c8b 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 javax.inject.Inject; import javax.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/healthchecks-parent/workmanagement-healthchecks/pom.xml b/healthchecks-parent/workmanagement-healthchecks/pom.xml index 6fa1b670..4ff8573a 100644 --- a/healthchecks-parent/workmanagement-healthchecks/pom.xml +++ b/healthchecks-parent/workmanagement-healthchecks/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.cpp.healthchecks healthchecks-parent - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/id-mapper-client/pom.xml b/id-mapper-client/pom.xml index a41ea4fe..bc824f13 100644 --- a/id-mapper-client/pom.xml +++ b/id-mapper-client/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.system.id-mapper diff --git a/metrics-micrometer/pom.xml b/metrics-micrometer/pom.xml index d703305a..95d0111d 100644 --- a/metrics-micrometer/pom.xml +++ b/metrics-micrometer/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT metrics-micrometer diff --git a/platform-libraries-bom/pom.xml b/platform-libraries-bom/pom.xml index f5b66534..8e79a761 100644 --- a/platform-libraries-bom/pom.xml +++ b/platform-libraries-bom/pom.xml @@ -3,7 +3,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index f0ce4e59..0cc2f975 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom cpp.platform.libraries - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT pom @@ -37,10 +37,10 @@ 2. While release through ADO pipeline, for white listed release branches (main/release-8.x.x) it's done through git hook (legacy solution) via azure pipeline code 3. While release through ADO pipeline, for branches other than white listed release branches, it's done through versions:set command via azure pipeline code --> - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT - 17.104.0 + 17.104.2-M1 17.104.0 @@ -51,11 +51,11 @@ ${framework.version} 8.0.5 - 17.104.46 - 17.0.240 - 17.0.147 - 17.0.129 - 17.103.131 + 17.104.50 + 17.0.269 + 17.104.173 + 17.104.180 + 17.104.136 2.3.1 8.4.0 2.15.0 diff --git a/service-components/command/command-api/pom.xml b/service-components/command/command-api/pom.xml index e4024709..fea41218 100644 --- a/service-components/command/command-api/pom.xml +++ b/service-components/command/command-api/pom.xml @@ -3,7 +3,7 @@ command uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/command/command-controller/pom.xml b/service-components/command/command-controller/pom.xml index bf9165b0..79f17ff0 100644 --- a/service-components/command/command-controller/pom.xml +++ b/service-components/command/command-controller/pom.xml @@ -3,7 +3,7 @@ command uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/command/command-handler/pom.xml b/service-components/command/command-handler/pom.xml index 72c71695..b8779e3f 100644 --- a/service-components/command/command-handler/pom.xml +++ b/service-components/command/command-handler/pom.xml @@ -3,7 +3,7 @@ command uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/command/pom.xml b/service-components/command/pom.xml index f28a6f6f..237e3acd 100644 --- a/service-components/command/pom.xml +++ b/service-components/command/pom.xml @@ -3,7 +3,7 @@ service-components uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/event/event-api/pom.xml b/service-components/event/event-api/pom.xml index 62703a0b..4d998551 100644 --- a/service-components/event/event-api/pom.xml +++ b/service-components/event/event-api/pom.xml @@ -3,7 +3,7 @@ event uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/event/event-indexer/pom.xml b/service-components/event/event-indexer/pom.xml index ae910a36..40506faa 100644 --- a/service-components/event/event-indexer/pom.xml +++ b/service-components/event/event-indexer/pom.xml @@ -3,7 +3,7 @@ event uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/event/event-listener/pom.xml b/service-components/event/event-listener/pom.xml index aed8ba88..a2805177 100644 --- a/service-components/event/event-listener/pom.xml +++ b/service-components/event/event-listener/pom.xml @@ -3,7 +3,7 @@ event uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/event/event-processor/pom.xml b/service-components/event/event-processor/pom.xml index 7b3fc551..f8ecbdb9 100644 --- a/service-components/event/event-processor/pom.xml +++ b/service-components/event/event-processor/pom.xml @@ -3,7 +3,7 @@ event uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/event/pom.xml b/service-components/event/pom.xml index 85036228..edcfef7d 100644 --- a/service-components/event/pom.xml +++ b/service-components/event/pom.xml @@ -3,7 +3,7 @@ service-components uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/pom.xml b/service-components/pom.xml index 06b2a770..8267471e 100644 --- a/service-components/pom.xml +++ b/service-components/pom.xml @@ -4,7 +4,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/query/pom.xml b/service-components/query/pom.xml index 87390e09..97650638 100644 --- a/service-components/query/pom.xml +++ b/service-components/query/pom.xml @@ -3,7 +3,7 @@ service-components uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/query/query-api/pom.xml b/service-components/query/query-api/pom.xml index 01dc4933..2f508760 100644 --- a/service-components/query/query-api/pom.xml +++ b/service-components/query/query-api/pom.xml @@ -3,7 +3,7 @@ query uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/query/query-controller/pom.xml b/service-components/query/query-controller/pom.xml index 0a563b06..99e74d55 100644 --- a/service-components/query/query-controller/pom.xml +++ b/service-components/query/query-controller/pom.xml @@ -3,7 +3,7 @@ query uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/query/query-view/pom.xml b/service-components/query/query-view/pom.xml index e6b32233..3f15f037 100644 --- a/service-components/query/query-view/pom.xml +++ b/service-components/query/query-view/pom.xml @@ -3,7 +3,7 @@ query uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/service-components/service-component-config/pom.xml b/service-components/service-component-config/pom.xml index 09961e3e..82ff2fb1 100644 --- a/service-components/service-component-config/pom.xml +++ b/service-components/service-component-config/pom.xml @@ -3,7 +3,7 @@ service-components uk.gov.moj.cpp.common - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 diff --git a/system-documentgenerator-client/pom.xml b/system-documentgenerator-client/pom.xml index a31d6fcf..bd192b2a 100644 --- a/system-documentgenerator-client/pom.xml +++ b/system-documentgenerator-client/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.system.documentgenerator diff --git a/system-users-library/pom.xml b/system-users-library/pom.xml index c8a6b81d..8b76f883 100644 --- a/system-users-library/pom.xml +++ b/system-users-library/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.common diff --git a/unifiedsearch-library-parent/pom.xml b/unifiedsearch-library-parent/pom.xml index 6b52b32b..1a92e08d 100644 --- a/unifiedsearch-library-parent/pom.xml +++ b/unifiedsearch-library-parent/pom.xml @@ -5,7 +5,7 @@ uk.gov.moj.platform.libraries platform-libraries-parent-pom - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT uk.gov.moj.cpp.unifiedsearch diff --git a/unifiedsearch-library-parent/unifiedsearch-client/pom.xml b/unifiedsearch-library-parent/unifiedsearch-client/pom.xml index 42bd81b3..75e93c9e 100644 --- a/unifiedsearch-library-parent/unifiedsearch-client/pom.xml +++ b/unifiedsearch-library-parent/unifiedsearch-client/pom.xml @@ -3,7 +3,7 @@ unifiedsearch-library-parent uk.gov.moj.cpp.unifiedsearch - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 @@ -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 d2150e84..4f2a494e 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 javax.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 25a16b89..8c9a946f 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 javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import javax.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 f3d036a8..4ff43f48 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 javax.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 1a5f18d6..b8b1e367 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 javax.inject.Named; import javax.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 afb42d01..df0b85ac 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 javax.inject.Named; import javax.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 72238b01..f728d963 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 javax.inject.Inject; import javax.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 f1b3dcd9..5a6c39c5 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 javax.inject.Inject; import javax.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 39490d5b..5f28aca7 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 javax.annotation.PostConstruct; import javax.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 acd9576d..d3fa4efd 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 javax.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 c8a5a22e..088da34e 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 javax.inject.Inject; import javax.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 41840c37..1d539b9e 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 javax.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 d4d943de..ac56e6fe 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 e047f73d..07a84d1f 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 javax.enterprise.context.ApplicationScoped; import javax.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 b8ffd02e..826b1618 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 javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; -import java.io.IOException; +import javax.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 = javax.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 aa9f00cd..c96d0673 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 javax.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 44041002..f28ea3fd 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 javax.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 f12b5c30..acc399e3 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 javax.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 4b1bcc49..a2e42ef8 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 javax.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 e5da6cde..557d6fd1 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 javax.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 6fef1729..239a1f55 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 javax.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 96f46401..b66e794c 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 javax.json.JsonArray; import javax.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 bcff7bbe..8a0cd97c 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 javax.json.JsonArray; import javax.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 83b47706..bfc8a874 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 javax.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 53c883d2..784aa8bf 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 javax.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 fd40b9bc..1fe013f1 100644 --- a/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml +++ b/unifiedsearch-library-parent/unifiedsearch-test-utils/pom.xml @@ -3,24 +3,20 @@ unifiedsearch-library-parent uk.gov.moj.cpp.unifiedsearch - 17.104.4-SNAPSHOT + 17.104.4-M3-SNAPSHOT 4.0.0 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 8b96d63c..2a3844cd 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 javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.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 723b148e..6b415e91 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 javax.json.JsonNumber; import javax.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());