Yair Zaslavsky has uploaded a new change for review. Change subject: core: Change enum JSON deserialization ......................................................................
core: Change enum JSON deserialization This patch introduces an enum deserializer to replace the behavior that in case of an unnown literal an exception would be thrown. This may happen in the future, if a Command parameter class with an enum field is stored in DB, and then oVirt engine is upgraded, and the new code contains a change in the enum literal. Change-Id: Ie9d6f2e4a02eeda999e525101c2f54789a34cfaf Signed-off-by: Yair Zaslavsky <[email protected]> --- A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonEnumDeserializer.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerFactory.java A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerProvider.java M backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerTest.java 5 files changed, 106 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/51/17951/1 diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonEnumDeserializer.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonEnumDeserializer.java new file mode 100644 index 0000000..a46f326 --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonEnumDeserializer.java @@ -0,0 +1,31 @@ +package org.ovirt.engine.core.utils.serialization.json; + +import java.io.IOException; + +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.deser.std.EnumDeserializer; +import org.codehaus.jackson.map.util.EnumResolver; + +public class JsonEnumDeserializer extends EnumDeserializer { + + public JsonEnumDeserializer() { + super(null); + // this. + } + + public JsonEnumDeserializer(EnumResolver<?> res) { + super(res); + } + + @Override + public Enum<?> deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + try { + return super.deserialize(jp, ctxt); + } catch (Exception ex) { + return null; + } + } +} diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java index e34d7fc..d4e5844 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializer.java @@ -47,6 +47,7 @@ formattedMapper.getDeserializationConfig().addMixInAnnotations(VmStatic.class, JsonVmStaticMixIn.class); formattedMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); formattedMapper.enableDefaultTyping(); + formattedMapper.setDeserializerProvider(new JsonObjectDeserializerProvider()); } @Override diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerFactory.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerFactory.java new file mode 100644 index 0000000..076bb5f --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerFactory.java @@ -0,0 +1,26 @@ +package org.ovirt.engine.core.utils.serialization.json; + +import org.codehaus.jackson.map.BeanProperty; +import org.codehaus.jackson.map.DeserializationConfig; +import org.codehaus.jackson.map.DeserializerProvider; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.deser.BeanDeserializerFactory; +import org.codehaus.jackson.map.util.EnumResolver; +import org.codehaus.jackson.type.JavaType; + +public class JsonObjectDeserializerFactory extends BeanDeserializerFactory { + + public JsonObjectDeserializerFactory() { + super(null); + } + + @Override + public JsonDeserializer<?> createEnumDeserializer(DeserializationConfig config, DeserializerProvider p, + JavaType type, BeanProperty property) + throws JsonMappingException + { + EnumResolver<?> resolver = EnumResolver.constructUnsafeUsingToString(type.getRawClass()); + return new JsonEnumDeserializer(resolver); + } +} diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerProvider.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerProvider.java new file mode 100644 index 0000000..b1705f4 --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerProvider.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.core.utils.serialization.json; + +import org.codehaus.jackson.map.BeanProperty; +import org.codehaus.jackson.map.DeserializationConfig; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.deser.StdDeserializerProvider; +import org.codehaus.jackson.type.JavaType; + +public class JsonObjectDeserializerProvider extends StdDeserializerProvider { + + public JsonObjectDeserializerProvider() { + super(new JsonObjectDeserializerFactory()); + } + + public JsonDeserializer<Object> findValueDeserializer(DeserializationConfig config, + JavaType propertyType, BeanProperty property) + throws JsonMappingException { + return super.findValueDeserializer(config, propertyType, property); + } +} diff --git a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerTest.java b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerTest.java index b50e15e..9138999 100644 --- a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerTest.java +++ b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/serialization/json/JsonObjectDeserializerTest.java @@ -14,6 +14,18 @@ */ public class JsonObjectDeserializerTest { + private static enum Color { + UNKNOWN, + BLUE, + RED + }; + + private static enum Kind { + UNKNOWN, + PERSON, + ANIMAL + }; + @Test public void testSerialize() { JsonSerializablePojo serializablePojo = new JsonSerializablePojo(); @@ -56,4 +68,19 @@ Assert.assertTrue(map.get("success")); } + @Test + public void testEnumDeserialization() { + Color color = new JsonObjectDeserializer().deserialize("\"RED\"", Color.class); + assertEquals(Color.RED, color); + + } + + @Test + public void testEnumDeserializationLiteralDoesNotExist() { + Kind kind = new JsonObjectDeserializer().deserialize("\"RED\"", Kind.class); + assertEquals(null, kind); + + } + + } -- To view, visit http://gerrit.ovirt.org/17951 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie9d6f2e4a02eeda999e525101c2f54789a34cfaf Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
