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

Reply via email to