From e6ff0efe828a014fbeaf738a068ba56dd31c5705 Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 16 Jun 2021 05:28:33 -0500 Subject: [PATCH 01/11] set up without index scenario --- pom.xml | 2 +- .../osdu/core/common/util/JsonUtils.java | 57 ++++++++++++++++--- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 96b61b4..3b8691d 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ org.opengroup.osdu os-core-common - 0.10.0-SNAPSHOT-UREF + 0.11.0-SNAPSHOT-UREF jar diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 4633382..48bc79d 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -48,24 +48,32 @@ public class JsonUtils { * @return JsonElement list with property, if it found and null if not */ public static List getJsonPropertyValueFromJsonObject(String propertyName, JsonObject jsonObject) { - List result = new ArrayList<>(); String[] propertiesHierarchy = splitJsonPropertiesByDots(propertyName); - if (propertiesHierarchy[0].endsWith(PN_END)) { + if (propertiesHierarchy[0].endsWith(PN_END) && isNestedArrayElementHomogenious(propertiesHierarchy[0])) { + return getOneNestedJsonProperyValueFromJsonObject(propertiesHierarchy, jsonObject); + } else if (propertiesHierarchy[0].endsWith(PN_END)) { return getNestedJsonPropertyValueFromJsonObject(propertiesHierarchy, jsonObject); } + List result = new ArrayList<>(); result.add(getNestedJsonElement(propertiesHierarchy, jsonObject)); return result; } - private static List getNestedJsonPropertyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { + private static List getOneNestedJsonProperyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { List result = new ArrayList<>(); - String[] innerNestedNames = new String[propertyNestedNames.length - 1]; - System.arraycopy(propertyNestedNames, 1, innerNestedNames, 0, propertyNestedNames.length - 1); + String[] innerNestedNames = getInnerNestedPropertyNames(propertyNestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(propertyNestedNames[0])) ; + + } + + private static List getNestedJsonPropertyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { + List result = new ArrayList<>(); - JsonArray elementArray = jsonObject.getAsJsonArray(propertyNestedNames[0].substring(0, propertyNestedNames[0].length() - 2 )) ; + String[] innerNestedNames = getInnerNestedPropertyNames(propertyNestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(propertyNestedNames[0])) ; for (int i = 0; i < elementArray.size(); i++) { JsonObject element = elementArray.get(i).getAsJsonObject(); @@ -134,9 +142,8 @@ public class JsonUtils { } private static void overrideNestedNumberPropertyOfJsonObject(String[] nestedNames, List values, JsonObject jsonObject) { - JsonArray elementArray = jsonObject.getAsJsonArray(nestedNames[0].substring(0, nestedNames[0].length() - 2 )) ; - String[] innerNestedNames = new String[nestedNames.length - 1]; - System.arraycopy(nestedNames, 1, innerNestedNames, 0, nestedNames.length - 1); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; + String[] innerNestedNames = getInnerNestedPropertyNames(nestedNames); for (int i = 0; i < elementArray.size(); i++) { JsonObject element = elementArray.get(i).getAsJsonObject(); @@ -186,4 +193,36 @@ public class JsonUtils { if(name == null) return null; return name.split("\\."); } + + private static boolean isNestedArrayElementHomogenious(String nestedArrayName) { + int openIndex = nestedArrayName.indexOf("["); + return openIndex == nestedArrayName.length() - 2; + } + + private static String[] getInnerNestedPropertyNames(String[] nestedPropertyNames) { + String[] innerNestedNames = new String[nestedPropertyNames.length - 1]; + System.arraycopy(nestedPropertyNames, 1, innerNestedNames, 0, nestedPropertyNames.length - 1); + + return innerNestedNames; + } + + private static String getNestedJsonArrayName(String nestedArrayName) { + int openIndex = nestedArrayName.indexOf("["); + return nestedArrayName.substring(0, openIndex); + } + + private static int getNestedArrayElementIndex(String itemNameWithIndex) { + int openIndex = itemNameWithIndex.indexOf("[") + 1; + int closeIndex = itemNameWithIndex.indexOf("]"); + String indexString = itemNameWithIndex.substring(openIndex, closeIndex); + + int index; + try { + index = Integer.parseInt(indexString); + } catch (Exception e) { + index = -1; + } + + return index; + } } \ No newline at end of file -- GitLab From 74aa855335051342d906d8eb275d47842d49d21b Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 16 Jun 2021 07:59:50 -0500 Subject: [PATCH 02/11] support inhomogenious cases --- .../osdu/core/common/util/JsonUtils.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 48bc79d..349aa97 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -63,10 +63,18 @@ public class JsonUtils { private static List getOneNestedJsonProperyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { List result = new ArrayList<>(); - String[] innerNestedNames = getInnerNestedPropertyNames(propertyNestedNames); JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(propertyNestedNames[0])) ; + int elementIndex = getNestedArrayElementIndex(propertyNestedNames[0]); + + if (elementIndex < 0 || elementIndex >= elementArray.size()) { + result.add(null); + } else { + JsonElement element = getNestedJsonElement(innerNestedNames, elementArray.get(elementIndex).getAsJsonObject()); + result.add(element); + } + return result; } private static List getNestedJsonPropertyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { @@ -130,7 +138,10 @@ public class JsonUtils { public static void overrideNumberPropertyOfJsonObject(String propertyName, List value, JsonObject jsonObject) { String[] nestedNames = splitJsonPropertiesByDots(propertyName); - if (nestedNames[0].endsWith(PN_END)) { + if (nestedNames[0].endsWith(PN_END) && isNestedArrayElementHomogenious(nestedNames[0])) { + overrideOneNestedNumberPorpertyOfJsonObject(nestedNames, value, jsonObject); + return; + } else if (nestedNames[0].endsWith(PN_END)) { overrideNestedNumberPropertyOfJsonObject(nestedNames, value, jsonObject); return; } @@ -141,6 +152,19 @@ public class JsonUtils { .ifPresent(json -> json.addProperty(nestedNames[nestedNames.length - 1], value.get(0))); } + private static void overrideOneNestedNumberPorpertyOfJsonObject(String[] nestedNames, List values, JsonObject jsonObject) { + String[] innerNestedNames = getInnerNestedPropertyNames(nestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; + int elementIndex = getNestedArrayElementIndex(nestedNames[0]); + + JsonObject element = elementArray.get(elementIndex).getAsJsonObject(); + JsonObject targetJsonObject = buildNewJsonObject(innerNestedNames, element); + + if (targetJsonObject != null) { + targetJsonObject.addProperty(innerNestedNames[innerNestedNames.length - 1], values.get(0)); + } + } + private static void overrideNestedNumberPropertyOfJsonObject(String[] nestedNames, List values, JsonObject jsonObject) { JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; String[] innerNestedNames = getInnerNestedPropertyNames(nestedNames); -- GitLab From ef7a0da7691ac564d231b754e977da85134ce59a Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 16 Jun 2021 08:14:25 -0500 Subject: [PATCH 03/11] add unit tests for inhomogenious JsonUtil changes --- .../osdu/core/common/util/JsonUtils.java | 8 +-- .../common/model/units/JsonUtilsTest.java | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 349aa97..92ba88c 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -51,9 +51,9 @@ public class JsonUtils { String[] propertiesHierarchy = splitJsonPropertiesByDots(propertyName); if (propertiesHierarchy[0].endsWith(PN_END) && isNestedArrayElementHomogenious(propertiesHierarchy[0])) { - return getOneNestedJsonProperyValueFromJsonObject(propertiesHierarchy, jsonObject); - } else if (propertiesHierarchy[0].endsWith(PN_END)) { return getNestedJsonPropertyValueFromJsonObject(propertiesHierarchy, jsonObject); + } else if (propertiesHierarchy[0].endsWith(PN_END)) { + return getOneNestedJsonProperyValueFromJsonObject(propertiesHierarchy, jsonObject); } List result = new ArrayList<>(); @@ -139,10 +139,10 @@ public class JsonUtils { String[] nestedNames = splitJsonPropertiesByDots(propertyName); if (nestedNames[0].endsWith(PN_END) && isNestedArrayElementHomogenious(nestedNames[0])) { - overrideOneNestedNumberPorpertyOfJsonObject(nestedNames, value, jsonObject); + overrideNestedNumberPropertyOfJsonObject(nestedNames, value, jsonObject); return; } else if (nestedNames[0].endsWith(PN_END)) { - overrideNestedNumberPropertyOfJsonObject(nestedNames, value, jsonObject); + overrideOneNestedNumberPorpertyOfJsonObject(nestedNames, value, jsonObject); return; } diff --git a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java index 7fdaa15..2e65df7 100644 --- a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java +++ b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java @@ -181,6 +181,50 @@ public class JsonUtilsTest { assertNull(result.get(2)); } + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfProperty_whenOneOfNestedArrayItemsPropertyPresented() { + String propertyName = "markers[1].value"; + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + when(mockJsonObject.get("value")).thenReturn(mockJsonPrimitive); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(1)).get("value"); + assertSame(mockJsonPrimitive, result.get(0)); + } + + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfNull_whenOneOfNestedArrayItemsPropertyNotPresented() { + String propertyName = "markers[1].value"; + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(1)).get("value"); + assertNull(result.get(0)); + } + + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfNull_whenNextedArrayItemIndexExceedsBoundary() { + String propertyName = "markers[2].value"; + + setupJsonArrayMock(1); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + when(mockJsonObject.get("value")).thenReturn(mockJsonPrimitive); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(0)).get("value"); + assertNull(result.get(0)); + } + // ---- JsonUtils.isJsonPropertyPresentedInJsonObject tests ---- @Test @@ -281,6 +325,20 @@ public class JsonUtilsTest { verify(mockJsonObject, times(1)).addProperty("value", 32); } + @Test + public void overrideOneNumberPropertyOfJsonObject_succeed_whenJsonObjectPresentedInNestedArray() { + String propertyName = "markers[1].value"; + Integer value1 = 12; + List values = new ArrayList<>(); + values.add(value1); + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + overrideNumberPropertyOfJsonObject(propertyName, values, mockJsonObject); + verify(mockJsonObject, times(1)).addProperty("value", 12); + } + // ---- JsonUtils.overrideStringPropertyOfJsonObject tests ---- @Test -- GitLab From 5172e66fb234e17bbac2eeb590d0bd9e660e689a Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 16 Jun 2021 08:26:53 -0500 Subject: [PATCH 04/11] fix existing unit tests --- .../osdu/core/common/crs/UnitConversionImpl.java | 8 +++++--- .../org/opengroup/osdu/core/common/util/JsonUtils.java | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java index 78de924..4de854f 100644 --- a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java +++ b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java @@ -197,13 +197,15 @@ public class UnitConversionImpl { } private String constructPropertyName(String name, int index) { - if (!name.contains("[")) { - return name; - } else { + String[] nestedNames = splitJsonPropertiesByDots(name); + + if (name.contains("[") && isNestedArrayElementHomogenious(nestedNames[0])) { String target = name.substring(name.indexOf("["), name.indexOf("]") + 1); String position = "[" + index + "]"; String result = name.replace(target, position); return result; + } else { + return name; } } } diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 92ba88c..078a6fb 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -218,24 +218,24 @@ public class JsonUtils { return name.split("\\."); } - private static boolean isNestedArrayElementHomogenious(String nestedArrayName) { + public static boolean isNestedArrayElementHomogenious(String nestedArrayName) { int openIndex = nestedArrayName.indexOf("["); return openIndex == nestedArrayName.length() - 2; } - private static String[] getInnerNestedPropertyNames(String[] nestedPropertyNames) { + public static String[] getInnerNestedPropertyNames(String[] nestedPropertyNames) { String[] innerNestedNames = new String[nestedPropertyNames.length - 1]; System.arraycopy(nestedPropertyNames, 1, innerNestedNames, 0, nestedPropertyNames.length - 1); return innerNestedNames; } - private static String getNestedJsonArrayName(String nestedArrayName) { + public static String getNestedJsonArrayName(String nestedArrayName) { int openIndex = nestedArrayName.indexOf("["); return nestedArrayName.substring(0, openIndex); } - private static int getNestedArrayElementIndex(String itemNameWithIndex) { + public static int getNestedArrayElementIndex(String itemNameWithIndex) { int openIndex = itemNameWithIndex.indexOf("[") + 1; int closeIndex = itemNameWithIndex.indexOf("]"); String indexString = itemNameWithIndex.substring(openIndex, closeIndex); -- GitLab From def95e12723de3cf0ccd41e7ff4ba28e9f455dee Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 16 Jun 2021 08:34:54 -0500 Subject: [PATCH 05/11] add 2 more inhomogeneous test cases --- .../core/common/crs/UnitConversionTests.java | 51 ++++++++++++++++ src/test/resources/testdata/nested-data.json | 58 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java index 86f1e58..4f9efb6 100644 --- a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java +++ b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java @@ -404,6 +404,57 @@ public class UnitConversionTests { Assert.assertEquals(record, resultRecord); } + @Test + public void shouldReturnUpdatedRecordWhenDataContainsValidInhomogeneousNestedArrayProperties() { + JsonObject record = testData.getAsJsonObject("inhomogeneousNestedArrayPropertyIsValid"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + JsonObject meta = (JsonObject) metaArray.get(0); + String persistableReference = meta.get("persistableReference").getAsString(); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConversionMessages().size() == 0); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + JsonElement data = resultRecord.get("data"); + JsonArray markers = data.getAsJsonObject().getAsJsonArray("markers"); + JsonObject item1 = markers.get(0).getAsJsonObject(); + double actualConvertedMeasuredDepthValue1 = item1.get("measuredDepth").getAsDouble(); + Assert.assertEquals(10.0, actualConvertedMeasuredDepthValue1, 0.00001); + JsonObject item2 = markers.get(1).getAsJsonObject(); + double actualConvertedMeasuredDepthValue2 = item2.get("measuredDepth").getAsDouble(); + Assert.assertEquals(6.096, actualConvertedMeasuredDepthValue2, 0.00001); + JsonArray resultMetaArray = resultRecord.getAsJsonArray("meta"); + Assert.assertEquals(1, resultMetaArray.size()); + JsonObject resultMeta = (JsonObject) resultMetaArray.get(0); + String resultPersistableReference = resultMeta.get("persistableReference").getAsString(); + Assert.assertTrue(persistableReference != resultPersistableReference); + String resultName = resultMeta.get("name").getAsString(); + Assert.assertEquals("m", resultName); + } + + @Test + public void shouldReturnOriginalRecordWhenInhomogeneousNestedArrayPropertyValueTypeIsInvalidInDataAndNested() { + JsonObject record = testData.getAsJsonObject("inhomogeneousNestedArrayPropertyWithInvalidDataType"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecord.setConvertStatus(ConvertStatus.SUCCESS); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConvertStatus() == ConvertStatus.ERROR); + String message = String.format(UnitConversionImpl.ILLEGAL_PROPERTY_VALUE, "markers[2].measuredDepth"); + Assert.assertEquals(message, conversionRecords.get(0).getConversionMessages().get(0)); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + Assert.assertEquals(record, resultRecord); + } + private JsonObject getTestData() { InputStream inStream = this.getClass().getResourceAsStream("/testdata/nested-data.json"); BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); diff --git a/src/test/resources/testdata/nested-data.json b/src/test/resources/testdata/nested-data.json index 65661be..ab2a99b 100644 --- a/src/test/resources/testdata/nested-data.json +++ b/src/test/resources/testdata/nested-data.json @@ -390,5 +390,63 @@ "Y": 10.00, "Z": 0 } + }, + "inhomogeneousNestedArrayPropertyIsValid": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "propertyNames": [ + "markers[1].measuredDepth" + ], + "name": "ft" + } + ] + }, + "inhomogeneousNestedArrayPropertyWithInvalidDataType": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + }, + { + "measuredDepth": "invalidType", + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "propertyNames": [ + "markers[2].measuredDepth" + ], + "name": "ft" + } + ] } } \ No newline at end of file -- GitLab From 1218b201bd64f41e0a00ba193f025393b1050aaa Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Thu, 17 Jun 2021 07:56:31 -0500 Subject: [PATCH 06/11] fix override index out of boundary --- .../opengroup/osdu/core/common/util/JsonUtils.java | 4 ++++ .../core/common/model/units/JsonUtilsTest.java | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 078a6fb..0ff1d43 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -157,6 +157,10 @@ public class JsonUtils { JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; int elementIndex = getNestedArrayElementIndex(nestedNames[0]); + if (elementIndex < 0 || elementIndex >= elementArray.size()) { + return; + } + JsonObject element = elementArray.get(elementIndex).getAsJsonObject(); JsonObject targetJsonObject = buildNewJsonObject(innerNestedNames, element); diff --git a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java index 2e65df7..37647d6 100644 --- a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java +++ b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java @@ -339,6 +339,20 @@ public class JsonUtilsTest { verify(mockJsonObject, times(1)).addProperty("value", 12); } + @Test + public void overrideNumberPropertyOfJsonObject_notHappened_whenJsonObjectIndexOutOfBoundary() { + String propertyName = "markers[1].value"; + Integer value1 = 12; + List values = new ArrayList<>(); + values.add(value1); + + setupJsonArrayMock(1); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + overrideNumberPropertyOfJsonObject(propertyName, values, mockJsonObject); + verify(mockJsonObject, never()).addProperty(anyString(), any(Number.class)); + } + // ---- JsonUtils.overrideStringPropertyOfJsonObject tests ---- @Test -- GitLab From 29946d6f36f86b81d3488c001d65d8b389a44d2a Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Thu, 17 Jun 2021 08:04:23 -0500 Subject: [PATCH 07/11] add unit test cases for index out of boundary in unitconversion impl --- .../core/common/crs/UnitConversionTests.java | 19 +++++++++++++ src/test/resources/testdata/nested-data.json | 27 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java index 4f9efb6..17eb3f7 100644 --- a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java +++ b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java @@ -455,6 +455,25 @@ public class UnitConversionTests { Assert.assertEquals(record, resultRecord); } + @Test + public void shouldReturnOriginalRecordWhenInhomogeneousNestedArrayPropertyValueIndexOutOfBoundary() { + JsonObject record = testData.getAsJsonObject("inhomogeneousPropertyIndexOutOfBoundary"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecord.setConvertStatus(ConvertStatus.SUCCESS); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConvertStatus() == ConvertStatus.SUCCESS); + String message = String.format(UnitConversionImpl.MISSING_PROPERTY, "markers[2].measuredDepth"); + Assert.assertEquals(message, conversionRecords.get(0).getConversionMessages().get(0)); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + Assert.assertEquals(record, resultRecord); + } + private JsonObject getTestData() { InputStream inStream = this.getClass().getResourceAsStream("/testdata/nested-data.json"); BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); diff --git a/src/test/resources/testdata/nested-data.json b/src/test/resources/testdata/nested-data.json index ab2a99b..bfdeb5a 100644 --- a/src/test/resources/testdata/nested-data.json +++ b/src/test/resources/testdata/nested-data.json @@ -448,5 +448,32 @@ "name": "ft" } ] + }, + "inhomogeneousPropertyIndexOutOfBoundary": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "propertyNames": [ + "markers[2].measuredDepth" + ], + "name": "ft" + } + ] } } \ No newline at end of file -- GitLab From eafc5c3b89dcebf7f3b5ca2f5916ba2dff1ae31d Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Thu, 17 Jun 2021 12:43:32 -0500 Subject: [PATCH 08/11] update testing version number --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3b8691d..55fe94c 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ org.opengroup.osdu os-core-common - 0.11.0-SNAPSHOT-UREF + 0.11.1-SNAPSHOT-UREF jar -- GitLab From 80e708e1abe9763a3bdf798f6c30480d2230c8ad Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Mon, 21 Jun 2021 08:30:29 -0500 Subject: [PATCH 09/11] change reference string to new format --- src/test/resources/testdata/nested-data.json | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/test/resources/testdata/nested-data.json b/src/test/resources/testdata/nested-data.json index bfdeb5a..12111cd 100644 --- a/src/test/resources/testdata/nested-data.json +++ b/src/test/resources/testdata/nested-data.json @@ -17,7 +17,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -44,7 +44,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -71,7 +71,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -94,7 +94,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "depth.inner.value" ], @@ -143,7 +143,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD.value" ], @@ -163,7 +163,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD.value" ], @@ -181,7 +181,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -199,7 +199,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -217,7 +217,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -235,7 +235,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -253,7 +253,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": "MD", "name": "ft" } @@ -268,7 +268,7 @@ "meta": [ { "path": "", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -286,7 +286,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "name": "ft" } ] @@ -410,7 +410,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[1].measuredDepth" ], @@ -441,7 +441,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[2].measuredDepth" ], @@ -468,7 +468,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[2].measuredDepth" ], -- GitLab From e6fad44df70edc356ac35c9b7805718e79a99b4c Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Wed, 23 Jun 2021 08:17:59 -0500 Subject: [PATCH 10/11] fix typo --- .../opengroup/osdu/core/common/crs/UnitConversionImpl.java | 2 +- .../java/org/opengroup/osdu/core/common/util/JsonUtils.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java index 4de854f..5be1896 100644 --- a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java +++ b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java @@ -199,7 +199,7 @@ public class UnitConversionImpl { private String constructPropertyName(String name, int index) { String[] nestedNames = splitJsonPropertiesByDots(name); - if (name.contains("[") && isNestedArrayElementHomogenious(nestedNames[0])) { + if (name.contains("[") && isNestedArrayElementHomogeneous(nestedNames[0])) { String target = name.substring(name.indexOf("["), name.indexOf("]") + 1); String position = "[" + index + "]"; String result = name.replace(target, position); diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 0ff1d43..7d82c92 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -50,7 +50,7 @@ public class JsonUtils { public static List getJsonPropertyValueFromJsonObject(String propertyName, JsonObject jsonObject) { String[] propertiesHierarchy = splitJsonPropertiesByDots(propertyName); - if (propertiesHierarchy[0].endsWith(PN_END) && isNestedArrayElementHomogenious(propertiesHierarchy[0])) { + if (propertiesHierarchy[0].endsWith(PN_END) && isNestedArrayElementHomogeneous(propertiesHierarchy[0])) { return getNestedJsonPropertyValueFromJsonObject(propertiesHierarchy, jsonObject); } else if (propertiesHierarchy[0].endsWith(PN_END)) { return getOneNestedJsonProperyValueFromJsonObject(propertiesHierarchy, jsonObject); @@ -138,7 +138,7 @@ public class JsonUtils { public static void overrideNumberPropertyOfJsonObject(String propertyName, List value, JsonObject jsonObject) { String[] nestedNames = splitJsonPropertiesByDots(propertyName); - if (nestedNames[0].endsWith(PN_END) && isNestedArrayElementHomogenious(nestedNames[0])) { + if (nestedNames[0].endsWith(PN_END) && isNestedArrayElementHomogeneous(nestedNames[0])) { overrideNestedNumberPropertyOfJsonObject(nestedNames, value, jsonObject); return; } else if (nestedNames[0].endsWith(PN_END)) { @@ -222,7 +222,7 @@ public class JsonUtils { return name.split("\\."); } - public static boolean isNestedArrayElementHomogenious(String nestedArrayName) { + public static boolean isNestedArrayElementHomogeneous(String nestedArrayName) { int openIndex = nestedArrayName.indexOf("["); return openIndex == nestedArrayName.length() - 2; } -- GitLab From 621cbcd757e233126dba367a46ed38b10a1d835a Mon Sep 17 00:00:00 2001 From: Yimin Zhou Date: Mon, 28 Jun 2021 07:52:54 -0500 Subject: [PATCH 11/11] update version of core library --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 55fe94c..8d72ee0 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ org.opengroup.osdu os-core-common - 0.11.1-SNAPSHOT-UREF + 0.12.0-SNAPSHOT jar -- GitLab