diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java index a390e617ea31b9bb9f399deed3b9cc2b921ea48d..950774d23c9ebeb55bc6f04bc0779bdcff04b712 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java @@ -14,6 +14,8 @@ package org.opengroup.osdu.indexer.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.api.client.http.HttpMethods; import com.google.common.base.Strings; import com.google.common.collect.Lists; @@ -60,6 +62,8 @@ public class StorageServiceImpl implements StorageService { private final Gson gson = new Gson(); + @Inject + private ObjectMapper objectMapper; @Inject private IUrlFetchService urlFetchService; @Inject @@ -89,7 +93,7 @@ public class StorageServiceImpl implements StorageService { return Records.builder().records(valid).notFound(notFound).conversionStatuses(conversionStatuses).missingRetryRecords(missingRetryRecordIds).build(); } - private Records getRecords(List<String> ids) throws URISyntaxException { + protected Records getRecords(List<String> ids) throws URISyntaxException { // e.g. {"records":["test:10"]} String body = this.gson.toJson(RecordIds.builder().records(ids).build()); @@ -114,9 +118,12 @@ public class StorageServiceImpl implements StorageService { throw new AppException(HttpStatus.SC_NOT_FOUND, "Invalid request", "Storage service returned empty response"); } - Type recordsListType = new TypeToken<Records>() { - }.getType(); - Records records = this.gson.fromJson(bulkStorageData, recordsListType); + Records records = null; + try { + records = this.objectMapper.readValue(bulkStorageData, Records.class); + } catch (JsonProcessingException e) { + throw new AppException(RequestStatus.INVALID_RECORD, "Invalid request", "Successful Storage service response with wrong json"); + } // no retry possible, update record status as failed -- storage service cannot locate records if (!records.getNotFound().isEmpty()) { diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java new file mode 100644 index 0000000000000000000000000000000000000000..42791ea57c2541a2073ee87df7033bb6da3758f1 --- /dev/null +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java @@ -0,0 +1,54 @@ +package org.opengroup.osdu.indexer.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import org.opengroup.osdu.core.common.http.IUrlFetchService; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.http.HttpResponse; +import org.opengroup.osdu.core.common.model.indexer.Records; +import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; +import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; + +import java.net.URISyntaxException; +import java.util.Collections; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class StorageServiceImplTest { + + @Spy + private ObjectMapper objectMapper = new ObjectMapper(); + @Mock + private IUrlFetchService urlFetchService; + @Mock + private IRequestInfo requestInfo; + @Mock + private IndexerConfigurationProperties configurationProperties; + @InjectMocks + private StorageServiceImpl sut; + + @Test + public void should_parse_long_integer_values_as_integer_types() throws URISyntaxException { + when(this.requestInfo.getHeaders()).thenReturn(new DpsHeaders()); + + String body = "{\"records\":[{\"id\":\"id1\",\"version\":0,\"data\":{\"long_int\":1000000000000000000000000,\"int\":123}}],\"notFound\":[],\"conversionStatuses\":[],\"missingRetryRecords\":[]}"; + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(body); + when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); + + Records rec = sut.getRecords(Collections.singletonList("id1")); + assertEquals(1, rec.getRecords().size()); + assertEquals("1000000000000000000000000", rec.getRecords().get(0).getData().get("long_int").toString()); + assertEquals("123", rec.getRecords().get(0).getData().get("int").toString()); + } +} \ No newline at end of file diff --git a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java index d32955169190c779486a55fe6b549b7ef7b20c09..218488386affee78476390c4ba1081774ce6a3a5 100644 --- a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java +++ b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java @@ -14,6 +14,7 @@ package org.opengroup.osdu.indexer.azure.service; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.junit.Before; diff --git a/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java b/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java index 3ffbbbd4cdd40f018ba41288a6fdf4e67a044d3a..99bf8b099a3cff09c7581b24f7e338f752c12637 100644 --- a/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java +++ b/provider/indexer-gcp/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java @@ -14,6 +14,7 @@ package org.opengroup.osdu.indexer.service; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -24,6 +25,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.Spy; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; @@ -66,6 +68,8 @@ public class StorageServiceTest { private IRequestInfo requestInfo; @Mock private IndexerConfigurationProperties configurationProperties; + @Spy + private ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks private StorageServiceImpl sut; diff --git a/provider/indexer-reference/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java b/provider/indexer-reference/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java index 4b46abf2e3380742203290ead746c39dff3a4049..47bfb735e84e23c3681d8b003d8e79a11c4c2455 100644 --- a/provider/indexer-reference/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java +++ b/provider/indexer-reference/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.when; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; @@ -41,6 +42,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.Spy; import org.opengroup.osdu.core.common.http.IUrlFetchService; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; @@ -70,6 +72,8 @@ public class StorageServiceTest { private IRequestInfo requestInfo; @Mock private IndexerConfigurationProperties configurationProperties; + @Spy + private ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks private StorageServiceImpl sut; diff --git a/testing/indexer-test-core/src/main/resources/features/indexrecord/indexRecord-schema-service.feature b/testing/indexer-test-core/src/main/resources/features/indexrecord/indexRecord-schema-service.feature index 50051edcf49854757c25ce510b0125945f38aa7b..05c25961282d3ebec5af580932fd7d73f5917f7b 100644 --- a/testing/indexer-test-core/src/main/resources/features/indexrecord/indexRecord-schema-service.feature +++ b/testing/indexer-test-core/src/main/resources/features/indexrecord/indexRecord-schema-service.feature @@ -25,8 +25,9 @@ Feature: Indexing of the documents Then I should get the <number> documents for the <index> in the Elastic Search with out <skippedAttribute> Examples: - | kind | recordFile | number | index | skippedAttribute | acl | - | "tenant1:indexer:test-data--Integration:2.0.0" | "index_records_2" | 4 | "tenant1-indexer-test-data--integration-2.0.0" | "data.Location" | "data.default.viewers@tenant1" | + | kind | recordFile | number | index | skippedAttribute | acl | + | "tenant1:indexer:test-data--Integration:2.0.0" | "index_records_2" | 4 | "tenant1-indexer-test-data--integration-2.0.0" | "data.Location" | "data.default.viewers@tenant1" | + | "tenant1:indexer:test-data--Integration:2.0.0" | "index_records_2" | 1 | "tenant1-indexer-test-data--integration-2.0.0" | "data.InvalidInteger" | "data.default.viewers@tenant1" | Scenario Outline: Ingest the record and Index in the Elastic Search with tags When I ingest records with the <recordFile> with <acl> for a given <kind> diff --git a/testing/indexer-test-core/src/main/resources/testData/index_records_2.json b/testing/indexer-test-core/src/main/resources/testData/index_records_2.json index ef6634d9663cce67428f5009d64464eba62ec42f..ff23f4c2c970d9488d7d0842294cebf58a0e8d40 100644 --- a/testing/indexer-test-core/src/main/resources/testData/index_records_2.json +++ b/testing/indexer-test-core/src/main/resources/testData/index_records_2.json @@ -18,7 +18,8 @@ "EmptyAttribute": "", "Rank": 1, "Score" : 10, - "Established": "2000-03-27T23:38:48Z" + "Established": "2000-03-27T23:38:48Z", + "InvalidInteger": 123456789123456789 } }, { @@ -40,7 +41,8 @@ "EmptyAttribute": "", "Rank": 1, "Score" : 10, - "Established": "2000-03-27T23:38:48Z" + "Established": "2000-03-27T23:38:48Z", + "InvalidInteger": 123456789123456789 } }, { @@ -62,7 +64,8 @@ "EmptyAttribute": "", "Rank": 1, "Score" : 10, - "Established": "2000-03-27T23:38:48Z" + "Established": "2000-03-27T23:38:48Z", + "InvalidInteger": 123456789123456789 } }, { @@ -84,7 +87,8 @@ "EmptyAttribute": "", "Rank": 1, "Score" : 10, - "Established": "2000-03-27T23:38:48Z" + "Established": "2000-03-27T23:38:48Z", + "InvalidInteger": 123456789123456789 } }, { @@ -107,7 +111,7 @@ "Rank": "Test", "Score" : 10, "Established": 123456, - "InvalidInteger": 2147483648 + "InvalidInteger": 8888 } } ] \ No newline at end of file