From 8b3720a0b1fe3163b64a41d15babc11c8e055860 Mon Sep 17 00:00:00 2001 From: allanmckenzie Date: Wed, 23 Jul 2025 12:29:30 +0100 Subject: [PATCH] PEG-2095: Upgrade jackson to 2.15.0 to fix security vulnerabilities --- CHANGELOG.md | 6 + .../core/featurecontrol/domain/Feature.java | 6 +- .../featurecontrol/domain/FeatureControl.java | 3 +- .../api/JsonObjectConvertersFactoryTest.java | 6 +- .../jackson/ObjectMapperProducer.java | 42 +++++-- .../IntegerEnumBeanDeserializerModifier.java | 2 +- .../integerenum/IntegerEnumDeserializer.java | 2 +- .../gov/justice/services/yaml/YamlParser.java | 2 + .../JsonObjectToObjectConverterTest.java | 58 +++++---- .../converter/ObjectMapperProducerTest.java | 113 +++++++++++++++++- .../justice/services/yaml/YamlParserTest.java | 7 +- .../yaml/subscriptiondescriptor/Event.java | 11 +- .../subscriptiondescriptor/Subscription.java | 19 ++- .../SubscriptionDescriptorDef.java | 12 +- .../SubscriptionsDescriptor.java | 16 ++- pom.xml | 5 +- 16 files changed, 255 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9244cbd8..b1e43a31e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file, which loose This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Security +- Upgrade jackson to version 2.15.0 to fix security vulnerabilities: + - **CVE-2022-42003** Detail: https://cwe.mitre.org/data/definitions/502.html + - **CVE-2025-52999** Detail: https://cwe.mitre.org/data/definitions/121.html + - **CVE-2022-42004** Detail: https://cwe.mitre.org/data/definitions/400.html + - **CCVE-2025-49128** Detail: https://cwe.mitre.org/data/definitions/209.html # [17.103.0] - 2025-07-16 ### Changed diff --git a/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/Feature.java b/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/Feature.java index 2e4222116..07d294ed0 100644 --- a/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/Feature.java +++ b/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/Feature.java @@ -2,12 +2,16 @@ import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + public class Feature { private final String featureName; private final boolean enabled; - public Feature(final String featureName, final boolean enabled) { + @JsonCreator + public Feature(@JsonProperty("feature_name") final String featureName, @JsonProperty("enabled") final boolean enabled) { this.featureName = featureName; this.enabled = enabled; } diff --git a/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/FeatureControl.java b/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/FeatureControl.java index 3a974b6e3..2b3ec9a94 100644 --- a/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/FeatureControl.java +++ b/framework-api/framework-api-core/src/main/java/uk/gov/justice/services/core/featurecontrol/domain/FeatureControl.java @@ -4,13 +4,14 @@ import java.util.Objects; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; public class FeatureControl { private final List features; @JsonCreator - public FeatureControl(final List features) { + public FeatureControl(@JsonProperty("feature") final List features) { this.features = features; } diff --git a/framework-utilities/test-utils/test-utils-framework-api/src/test/java/uk/gov/justice/services/test/utils/framework/api/JsonObjectConvertersFactoryTest.java b/framework-utilities/test-utils/test-utils-framework-api/src/test/java/uk/gov/justice/services/test/utils/framework/api/JsonObjectConvertersFactoryTest.java index a6a737894..e74433b78 100644 --- a/framework-utilities/test-utils/test-utils-framework-api/src/test/java/uk/gov/justice/services/test/utils/framework/api/JsonObjectConvertersFactoryTest.java +++ b/framework-utilities/test-utils/test-utils-framework-api/src/test/java/uk/gov/justice/services/test/utils/framework/api/JsonObjectConvertersFactoryTest.java @@ -66,10 +66,10 @@ public void shouldCreateStringToJsonObjectConverter() throws Exception { private void checkSetUpCorrectly(final ObjectMapper objectMapper) { final Set registeredModuleTypes = getValueOfField(objectMapper, "_registeredModuleTypes", Set.class); - assertThat(registeredModuleTypes, hasItem("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule")); + assertThat(registeredModuleTypes, hasItem("jackson-datatype-jsr310")); assertThat(registeredModuleTypes, hasItem("com.fasterxml.jackson.datatype.jdk8.Jdk8Module")); - assertThat(registeredModuleTypes, hasItem("com.fasterxml.jackson.module.paramnames.ParameterNamesModule")); - assertThat(registeredModuleTypes, hasItem("uk.gov.justice.services.common.converter.jackson.jsr353.InclusionAwareJSR353Module")); + assertThat(registeredModuleTypes, hasItem("jackson-module-parameter-names")); + assertThat(registeredModuleTypes, hasItem("jackson-datatype-jsr353")); assertThat(registeredModuleTypes, hasItem("uk.gov.justice.services.common.converter.jackson.additionalproperties.AdditionalPropertiesModule")); assertThat(registeredModuleTypes, hasItem("uk.gov.justice.services.common.converter.jackson.integerenum.IntegerEnumModule")); } diff --git a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/ObjectMapperProducer.java b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/ObjectMapperProducer.java index 28ea20b28..a63a65cbb 100644 --- a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/ObjectMapperProducer.java +++ b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/ObjectMapperProducer.java @@ -4,6 +4,7 @@ import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.READ_ENUMS_USING_TO_STRING; +import static com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS; import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS; import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_WITH_ZONE_ID; import static com.fasterxml.jackson.databind.SerializationFeature.WRITE_ENUMS_USING_TO_STRING; @@ -23,10 +24,11 @@ import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; -import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer; @@ -43,32 +45,26 @@ public ObjectMapper objectMapper() { return configureObjectMapper(new ObjectMapper()); } - public ObjectMapper objectMapperWith(final JsonFactory jsonFactory) { - return configureObjectMapper(new ObjectMapper(jsonFactory)); - } public ObjectMapper yamlObjectMapper() { - return configureObjectMapper(new ObjectMapper(new YAMLFactory())) - .setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); - } - private ObjectMapper configureObjectMapper(final ObjectMapper objectMapper) { - return objectMapper + return new ObjectMapper(new YAMLFactory()) .registerModule(javaTimeModuleWithFormattedDateTime()) .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(PROPERTIES)) .registerModule(new InclusionAwareJSR353Module()) .registerModule(new AdditionalPropertiesModule()) .registerModule(new IntegerEnumModule()) .configure(WRITE_DATES_AS_TIMESTAMPS, false) .configure(WRITE_DATES_WITH_ZONE_ID, false) + .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) .configure(WRITE_NULL_MAP_VALUES, false) .setTimeZone(getTimeZone(UTC)) - .setSerializationInclusion(NON_ABSENT) .enable(WRITE_ENUMS_USING_TO_STRING) - .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) .enable(READ_ENUMS_USING_TO_STRING) - .setConstructorDetector(USE_PROPERTIES_BASED); + .enable(ACCEPT_CASE_INSENSITIVE_ENUMS) + .setConstructorDetector(USE_PROPERTIES_BASED) + .setSerializationInclusion(NON_ABSENT) + ; } private JavaTimeModule javaTimeModuleWithFormattedDateTime() { @@ -76,4 +72,24 @@ private JavaTimeModule javaTimeModuleWithFormattedDateTime() { javaTimeModule.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(ofPattern(ISO_8601))); return javaTimeModule; } + + private ObjectMapper configureObjectMapper(final ObjectMapper objectMapper) { + return objectMapper + .registerModule(javaTimeModuleWithFormattedDateTime()) + .registerModule(new Jdk8Module()) + .registerModule(new ParameterNamesModule(PROPERTIES)) + .registerModule(new InclusionAwareJSR353Module()) + .registerModule(new AdditionalPropertiesModule()) + .registerModule(new IntegerEnumModule()) + .configure(WRITE_DATES_AS_TIMESTAMPS, false) + .configure(WRITE_DATES_WITH_ZONE_ID, false) + .configure(WRITE_NULL_MAP_VALUES, false) + .setTimeZone(getTimeZone(UTC)) + .setSerializationInclusion(NON_ABSENT) + .enable(WRITE_ENUMS_USING_TO_STRING) + .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) + .enable(READ_ENUMS_USING_TO_STRING) + .setConstructorDetector(USE_PROPERTIES_BASED) + ; + } } diff --git a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumBeanDeserializerModifier.java b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumBeanDeserializerModifier.java index c9380c79f..5652b0d41 100644 --- a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumBeanDeserializerModifier.java +++ b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumBeanDeserializerModifier.java @@ -22,7 +22,7 @@ public JsonDeserializer modifyEnumDeserializer( final Class> enumClass = (Class>) type.getRawClass(); - final EnumResolver enumResolver = constructFor(enumClass, nopInstance()); + final EnumResolver enumResolver = constructFor(config, enumClass); return new IntegerEnumDeserializer( enumResolver, diff --git a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumDeserializer.java b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumDeserializer.java index 1b00b33d6..0bace9dcf 100644 --- a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumDeserializer.java +++ b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/common/converter/jackson/integerenum/IntegerEnumDeserializer.java @@ -21,7 +21,7 @@ public class IntegerEnumDeserializer extends EnumDeserializer { public IntegerEnumDeserializer(final EnumResolver enumResolver, final EnumObjectUtil enumObjectUtil) { - super(enumResolver); + super(enumResolver, true); this.enumerations = asList(enumResolver.getRawEnums()); this.enumObjectUtil = enumObjectUtil; } diff --git a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/yaml/YamlParser.java b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/yaml/YamlParser.java index 7db1f61ae..eb7bb4f3b 100644 --- a/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/yaml/YamlParser.java +++ b/framework-utilities/utilities/utilities-core/src/main/java/uk/gov/justice/services/yaml/YamlParser.java @@ -1,5 +1,6 @@ package uk.gov.justice.services.yaml; +import static com.fasterxml.jackson.databind.cfg.ConstructorDetector.USE_PROPERTIES_BASED; import static java.lang.String.format; import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; @@ -9,6 +10,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; public class YamlParser { diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/JsonObjectToObjectConverterTest.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/JsonObjectToObjectConverterTest.java index dd6c90148..2747d4870 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/JsonObjectToObjectConverterTest.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/JsonObjectToObjectConverterTest.java @@ -1,5 +1,7 @@ package uk.gov.justice.services.common.converter; +import static java.time.ZoneOffset.UTC; +import static java.time.format.DateTimeFormatter.ofPattern; import static java.util.UUID.randomUUID; import static javax.json.Json.createObjectBuilder; import static org.hamcrest.CoreMatchers.equalTo; @@ -9,12 +11,14 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsCollectionContaining.hasItems; import static org.mockito.Mockito.doThrow; +import static uk.gov.justice.services.common.converter.ZonedDateTimes.ISO_8601; import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; import java.io.IOException; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.UUID; @@ -64,23 +68,33 @@ public void shouldConvertPojoToJsonObject() throws Exception { @Test public void shouldConvertToPojoWithUTCDateTime() throws Exception { - assertThat(jsonObjectToObjectConverter - .convert(Json.createObjectBuilder().add("dateTime", "2016-07-25T13:09:01.0+00:00").build(), - PojoWithDateTime.class).getDateTime(), - equalTo(ZonedDateTime.of(2016, 7, 25, 13, 9, 1, 0, ZoneId.of("UTC")))); - assertThat(jsonObjectToObjectConverter - .convert(Json.createObjectBuilder().add("dateTime", "2016-07-25T13:09:01.0Z").build(), - PojoWithDateTime.class).getDateTime(), - equalTo(ZonedDateTime.of(2016, 7, 25, 13, 9, 1, 0, ZoneId.of("UTC")))); - assertThat(jsonObjectToObjectConverter - .convert(Json.createObjectBuilder().add("dateTime", "2016-07-25T13:09:01Z").build(), - PojoWithDateTime.class).getDateTime(), - equalTo(ZonedDateTime.of(2016, 7, 25, 13, 9, 1, 0, ZoneId.of("UTC")))); - assertThat(jsonObjectToObjectConverter - .convert(Json.createObjectBuilder().add("dateTime", "2016-07-25T16:09:01.0+03:00").build(), - PojoWithDateTime.class).getDateTime(), - equalTo(ZonedDateTime.of(2016, 7, 25, 13, 9, 1, 0, ZoneId.of("UTC")))); - + final ZonedDateTime expectedDateTime = ZonedDateTime.of(2016, 7, 25, 13, 9, 1, 0, UTC); + + final PojoWithDateTime pojoWithDateTime_1 = jsonObjectToObjectConverter.convert( + createObjectBuilder() + .add("dateTime", "2016-07-25T13:09:01.0+00:00") + .build(), + PojoWithDateTime.class); + final PojoWithDateTime pojoWithDateTime_2 = jsonObjectToObjectConverter + .convert(createObjectBuilder() + .add("dateTime", "2016-07-25T13:09:01.0Z") + .build(), + PojoWithDateTime.class); + final PojoWithDateTime pojoWithDateTime_3 = jsonObjectToObjectConverter + .convert(createObjectBuilder() + .add("dateTime", "2016-07-25T16:09:01.0+03:00") + .build(), + PojoWithDateTime.class); + final PojoWithDateTime pojoWithDateTime_4 = jsonObjectToObjectConverter + .convert(createObjectBuilder() + .add("dateTime", "2016-07-25T13:09:01.000Z") + .build(), + PojoWithDateTime.class); + + assertThat(pojoWithDateTime_1.getDateTime(), equalTo(expectedDateTime)); + assertThat(pojoWithDateTime_2.getDateTime(), equalTo(expectedDateTime)); + assertThat(pojoWithDateTime_3.getDateTime(), equalTo(expectedDateTime)); + assertThat(pojoWithDateTime_4.getDateTime(), equalTo(expectedDateTime)); } @Test @@ -88,7 +102,7 @@ public void shouldThrowExceptionOnConversionError() throws IOException { final UUID uuid = randomUUID(); - final JsonObject jsonObject = Json.createObjectBuilder().add("id", uuid.toString()).build(); + final JsonObject jsonObject = createObjectBuilder().add("id", uuid.toString()).build(); doThrow(JsonProcessingException.class).when(objectMapper).writeValueAsString(jsonObject); @@ -119,10 +133,10 @@ private JsonObject jsonObject() { .add(ATTRIBUTE_1) .add(ATTRIBUTE_2).build(); - return Json.createObjectBuilder() + return createObjectBuilder() .add("id", ID.toString()) .add("name", NAME) - .add("internalPojo", Json.createObjectBuilder() + .add("internalPojo", createObjectBuilder() .add("internalId", INTERNAL_ID.toString()) .add("internalName", INTERNAL_NAME).build()) .add("attributes", array).build(); @@ -135,7 +149,7 @@ public static class Pojo { private List attributes; private InternalPojo internalPojo; - public Pojo () { + public Pojo() { } @@ -203,7 +217,7 @@ public ZonedDateTime getDateTime() { public static class SingleArgumentConstructorPojo { private UUID id; - public SingleArgumentConstructorPojo (UUID id) { + public SingleArgumentConstructorPojo(UUID id) { this.id = id; } diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/ObjectMapperProducerTest.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/ObjectMapperProducerTest.java index d4ef8c135..e2c31b6bb 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/ObjectMapperProducerTest.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/common/converter/ObjectMapperProducerTest.java @@ -1,5 +1,6 @@ package uk.gov.justice.services.common.converter; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; import static com.jayway.jsonassert.JsonAssert.with; import static java.time.ZoneOffset.UTC; import static java.time.format.DateTimeFormatter.ofPattern; @@ -16,6 +17,8 @@ import static uk.gov.justice.services.common.converter.ZonedDateTimes.ISO_8601; import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; +import uk.gov.justice.services.yaml.subscriptiondescriptor.SubscriptionDescriptorDef; +import uk.gov.justice.services.yaml.subscriptiondescriptor.SubscriptionsDescriptor; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -31,6 +34,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.jayway.jsonassert.JsonAssert; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; @@ -41,10 +45,36 @@ public class ObjectMapperProducerTest { private static final String JSON_OBJECT_STRING = "{\n" + " \"id\": \"861c9430-7bc6-4bf0-b549-6534394b8d65\"\n" + "}"; + private static final String YAML_AS_STRING = "---\n" + "subscription_descriptor:\n" + " spec_version: 1.0.0\n"; + private static final String YAML = """ + subscriptions_descriptor: + spec_version: 1.0.0 + service: examplecontext + service_component: EVENT_LISTENER + subscriptions: + - name: subscription1 + prioritisation: 1 + events: + - name: example.recipe-added + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json + - name: example.recipe-deleted + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json + event_source_name: example + + - name: subscription2 + events: + - name: people.person-added + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json + - name: people.person-removed + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json + event_source_name: people + ... + """; + private ObjectMapper objectMapper; @BeforeEach @@ -285,7 +315,7 @@ public void shouldNotWriteAdditionalPropertiesWhenNullPassed() throws Exception @Test public void shouldConvertYamlToJsonObject() throws Exception { - final ObjectMapper yamlObjectMapper = new ObjectMapperProducer().objectMapperWith(new YAMLFactory()); + final ObjectMapper yamlObjectMapper = new ObjectMapperProducer().yamlObjectMapper(); final Object yamlObject = yamlObjectMapper.readValue(YAML_AS_STRING, Object.class); final JSONObject yamlAsJsonObject = new JSONObject(objectMapper.writeValueAsString(yamlObject)); @@ -293,6 +323,87 @@ public void shouldConvertYamlToJsonObject() throws Exception { assertThat(yamlAsJsonObject.getJSONObject("subscription_descriptor").get("spec_version"), is("1.0.0")); } + @Test + public void shouldConvertYamlToJsonObject2() throws Exception { + + final String yaml = """ + subscriptions_descriptor: + spec_version: 1.0.0 + service: examplecontext + service_component: EVENT_LISTENER + subscriptions: + - name: subscription1 + prioritisation: 1 + events: + - name: example.recipe-added + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json + - name: example.recipe-deleted + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json + event_source_name: example + + - name: subscription2 + events: + - name: people.person-added + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json + - name: people.person-removed + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json + event_source_name: people + ... + """; + + final ObjectMapper yamlObjectMapper = new ObjectMapperProducer().yamlObjectMapper(); + + final Object yamlObject = yamlObjectMapper.readValue(yaml, Object.class); + final JSONObject yamlAsJsonObject = new JSONObject(objectMapper.writeValueAsString(yamlObject)); + + + System.out.println(yamlAsJsonObject); + assertThat(yamlAsJsonObject.getJSONObject("subscriptions_descriptor").get("spec_version"), is("1.0.0")); + } + + + @Test + public void shouldConvertYamlToJsonObject3() throws Exception { + + final String yaml = """ + subscriptions_descriptor: + spec_version: 1.0.0 + service: examplecontext + service_component: EVENT_LISTENER + subscriptions: + - name: subscription1 + prioritisation: 1 + events: + - name: example.recipe-added + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-added.json + - name: example.recipe-deleted + schema_uri: http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json + event_source_name: example + + - name: subscription2 + events: + - name: people.person-added + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-added.json + - name: people.person-removed + schema_uri: http://justice.gov.uk/json/schemas/domains/people/people.person-removed.json + event_source_name: people + ... + """; + + final ObjectMapper yamlObjectMapper = new ObjectMapper(new YAMLFactory()) + .configure(FAIL_ON_UNKNOWN_PROPERTIES, false); + ; + + final SubscriptionDescriptorDef subscriptionsDescriptor = yamlObjectMapper.readValue(yaml, SubscriptionDescriptorDef.class); + System.out.println(subscriptionsDescriptor); + +// final JSONObject yamlAsJsonObject = new JSONObject(objectMapper.writeValueAsString(yamlObject)); +// +// +// System.out.println(yamlAsJsonObject); +// assertThat(yamlAsJsonObject.getJSONObject("subscriptions_descriptor").get("spec_version"), is("1.0.0")); + } + @Test public void shouldConvertDatesUsingTheCorrectISO_8601Format() throws Exception { diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/YamlParserTest.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/YamlParserTest.java index ff78f2b70..93a63f968 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/YamlParserTest.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/YamlParserTest.java @@ -20,6 +20,10 @@ import java.util.Map; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.junit.jupiter.api.Test; public class YamlParserTest { @@ -49,8 +53,7 @@ public void shouldParseSubscriptionPathAsSubscriptionDescriptorDefUsingClassType assertThat(events_1.get(1).getName(), is("example.recipe-deleted")); assertThat(events_1.get(1).getSchemaUri(), is("http://justice.gov.uk/json/schemas/domains/example/example.recipe-deleted.json")); } - - + @Test public void shouldParseSubscriptionPathAsSubscriptionDescriptorDef() throws Exception { diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Event.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Event.java index 726410892..e37473783 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Event.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Event.java @@ -1,6 +1,7 @@ package uk.gov.justice.services.yaml.subscriptiondescriptor; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; public class Event { @@ -8,7 +9,7 @@ public class Event { private final String schemaUri; @JsonCreator - public Event(final String name, final String schemaUri) { + public Event(@JsonProperty("name") final String name, @JsonProperty("schema_uri") final String schemaUri) { this.name = name; this.schemaUri = schemaUri; } @@ -20,4 +21,12 @@ public String getName() { public String getSchemaUri() { return schemaUri; } + + @Override + public String toString() { + return "Event{" + + "name='" + name + '\'' + + ", schemaUri='" + schemaUri + '\'' + + '}'; + } } diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Subscription.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Subscription.java index 192c10fed..a81cabc3f 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Subscription.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/Subscription.java @@ -4,6 +4,7 @@ import java.util.Objects; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; public class Subscription { @@ -13,10 +14,10 @@ public class Subscription { private final String prioritisation; @JsonCreator - public Subscription(final String name, - final List events, - final String eventSourceName, - final String prioritisation) { + public Subscription(@JsonProperty("name") final String name, + @JsonProperty("events") final List events, + @JsonProperty("event_source_name") final String eventSourceName, + @JsonProperty("prioritisation") final String prioritisation) { this.name = name; this.events = events; this.eventSourceName = eventSourceName; @@ -54,4 +55,14 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(name, events,prioritisation, eventSourceName); } + + @Override + public String toString() { + return "Subscription{" + + "name='" + name + '\'' + + ", events=" + events + + ", eventSourceName='" + eventSourceName + '\'' + + ", prioritisation='" + prioritisation + '\'' + + '}'; + } } diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionDescriptorDef.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionDescriptorDef.java index 10bd3a78f..a793e11e5 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionDescriptorDef.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionDescriptorDef.java @@ -1,18 +1,28 @@ package uk.gov.justice.services.yaml.subscriptiondescriptor; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; public class SubscriptionDescriptorDef { + @JsonProperty("subscriptions_descriptor") private final SubscriptionsDescriptor subscriptionsDescriptor; @JsonCreator - public SubscriptionDescriptorDef(final SubscriptionsDescriptor subscriptionsDescriptor) { + public SubscriptionDescriptorDef(@JsonProperty("subscriptions-descriptor") final SubscriptionsDescriptor subscriptionsDescriptor) { this.subscriptionsDescriptor = subscriptionsDescriptor; } public SubscriptionsDescriptor getSubscriptionsDescriptor() { return subscriptionsDescriptor; } + + @Override + public String toString() { + return "SubscriptionDescriptorDef{" + + "subscriptionsDescriptor=" + subscriptionsDescriptor + + '}'; + } } diff --git a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionsDescriptor.java b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionsDescriptor.java index 45fd2ee5f..ad8377064 100644 --- a/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionsDescriptor.java +++ b/framework-utilities/utilities/utilities-core/src/test/java/uk/gov/justice/services/yaml/subscriptiondescriptor/SubscriptionsDescriptor.java @@ -4,6 +4,7 @@ import java.util.Objects; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; public class SubscriptionsDescriptor { @@ -13,7 +14,11 @@ public class SubscriptionsDescriptor { private final List subscriptions; @JsonCreator - public SubscriptionsDescriptor(final String specVersion, final String service, final String serviceComponent, final List subscriptions) { + public SubscriptionsDescriptor( + @JsonProperty("spec_version") final String specVersion, + @JsonProperty("service") final String service, + @JsonProperty("service_component") final String serviceComponent, + @JsonProperty("subscription") final List subscriptions) { this.specVersion = specVersion; this.service = service; this.serviceComponent = serviceComponent; @@ -51,4 +56,13 @@ public List getSubscriptions() { return subscriptions; } + @Override + public String toString() { + return "SubscriptionsDescriptor{" + + "specVersion='" + specVersion + '\'' + + ", service='" + service + '\'' + + ", serviceComponent='" + serviceComponent + '\'' + + ", subscriptions=" + subscriptions + + '}'; + } } diff --git a/pom.xml b/pom.xml index 2dbe266ab..2ea2394ed 100644 --- a/pom.xml +++ b/pom.xml @@ -36,17 +36,16 @@ framework-libraries - 17.103.1 + 17.104.0-M2-SNAPSHOT 2.0.0 17.0.1 - 17.103.1 + 17.103.2-SNAPSHOT 8.0.13 3.7.1 -