From 22e62f93372a53377b7f9c4b6ecf5bc5268feeba Mon Sep 17 00:00:00 2001 From: "angelo.andreussi" Date: Tue, 29 Oct 2024 16:29:45 +0100 Subject: [PATCH] fix: restored possibility to update XMl configurations properties with null or empty values --- .../xml/adapters/XmlPropertiesAdapter.java | 15 ++++++---- .../adapters/XmlPropertiesAdapterTest.java | 29 +++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/service/api/src/main/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapter.java b/service/api/src/main/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapter.java index 4b2a8d52765..eb6ab54f302 100644 --- a/service/api/src/main/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapter.java +++ b/service/api/src/main/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapter.java @@ -22,6 +22,7 @@ import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; +import java.util.HashMap; public class XmlPropertiesAdapter, V extends XmlPropertyAdapted> extends XmlAdapter> { private final Class propertyClass; @@ -47,16 +48,18 @@ public Map unmarshal(V[] properties) { } }) .filter(adaptedProp -> xmlPropertyAdapters.containsKey((adaptedProp.getType()))) - .collect(Collectors.toMap( - XmlPropertyAdapted::getName, - adaptedProp -> { - final XmlPropertyAdapter xmlPropertyAdapter = xmlPropertyAdapters.get(adaptedProp.getType()); - return xmlPropertyAdapter.unmarshallValues(adaptedProp); - })); + .collect(HashMap::new, + (adaptedPropMap, adaptedProp) -> adaptedPropMap.put(adaptedProp.getName(), extractValueFromXmlProperty(adaptedProp)), + HashMap::putAll); // This is a work-around for Collectors.toMap limitation on null values return unmarshalledProperties; } + private Object extractValueFromXmlProperty(V adaptedProp) { + final XmlPropertyAdapter xmlPropertyAdapter = xmlPropertyAdapters.get(adaptedProp.getType()); + return xmlPropertyAdapter.unmarshallValues(adaptedProp); + } + @Override public V[] marshal(Map props) { final List adaptedProperties = Optional.ofNullable(props) diff --git a/service/api/src/test/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapterTest.java b/service/api/src/test/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapterTest.java index a0776ecadf5..31826b8468d 100644 --- a/service/api/src/test/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapterTest.java +++ b/service/api/src/test/java/org/eclipse/kapua/model/xml/adapters/XmlPropertiesAdapterTest.java @@ -260,4 +260,33 @@ public void testUnmarshallingMissingType() { new TestPropertyAdapted("anotherValue", null, "42") })); } + + //Scenario in which, for example, I update a device configuration with some properties set to the default value (null or "") and some to a defined valued + @Test + public void testUnmarshallingEmptyNullValuesFields() { + final StringPropertyAdapter stringAdapter = Mockito.spy(new StringPropertyAdapter()); + final BooleanPropertyAdapter booleanAdapter = Mockito.spy(new BooleanPropertyAdapter()); + final LongPropertyAdapter longAdapter = Mockito.spy(new LongPropertyAdapter()); + final HashMap adapters = new HashMap() { + { + put(TestTypes.First, stringAdapter); + put(TestTypes.Second, booleanAdapter); + put(TestTypes.Fourth, longAdapter); + } + }; + final XmlPropertiesAdapter instance = new TestPropertiesAdapter(adapters); + final Map got = instance.unmarshal(new TestPropertyAdapted[]{ + new TestPropertyAdapted("aString", TestTypes.First, "TheString"), + new TestPropertyAdapted("emptyValues", TestTypes.Second, "", ""), + new TestPropertyAdapted("emptyValue", TestTypes.Fourth, ""), + new TestPropertyAdapted("nullValue", TestTypes.Fourth, (String) null) + }); + Assert.assertNotNull(got); + Assert.assertEquals(4, got.keySet().size()); + Assert.assertNotNull(got.get("aString")); + Assert.assertArrayEquals(new Boolean[]{null, null}, (Boolean[]) got.get("emptyValues")); + Assert.assertNull(got.get("emptyValue")); + Assert.assertNull(got.get("nullValue")); + } + } \ No newline at end of file