From fc158749ff63c17359d15c0688c3ad3d7132aa4c Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Mon, 18 Jun 2012 14:38:56 +0000
Subject: [PATCH] SP-111 / BIS-49: JSON-RPC - properly handle circular
 dependencies

SVN: 25762
---
 .../JsonTypeAndClassDeserializer.java         | 22 +++++++++++++------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
index ec50687085e..ab6cb776ebc 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/server/json/deserializer/JsonTypeAndClassDeserializer.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -230,16 +231,23 @@ public class JsonTypeAndClassDeserializer extends AsPropertyTypeDeserializer
         final JsonParser actualJp;
         final JsonDeserializer<Object> deserializer;
 
-        if (t == JsonToken.START_ARRAY && _baseType.getRawClass().equals(Object.class))
-        {
-            JavaType collectionType =
-                    ctxt.getConfig().getTypeFactory().constructRawCollectionType(Collection.class);
-            deserializer = ctxt.findContextualValueDeserializer(collectionType, _property);
-        } else
+        JavaType type = _baseType;
+
+        if (type.getRawClass().equals(Object.class))
         {
-            deserializer = ctxt.findContextualValueDeserializer(_baseType, _property);
+            if (t == JsonToken.START_ARRAY)
+            {
+                type =
+                        ctxt.getConfig().getTypeFactory()
+                                .constructRawCollectionType(Collection.class);
+            } else if (t == JsonToken.START_OBJECT)
+            {
+                type = ctxt.getConfig().getTypeFactory().constructRawMapType(Map.class);
+            }
         }
 
+        deserializer = ctxt.findContextualValueDeserializer(type, _property);
+
         if (tb != null)
         {
             tb.writeEndObject();
-- 
GitLab