Added Json to CompositeNode translation
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / rest / impl / JsonReader.java
diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonReader.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonReader.java
new file mode 100644 (file)
index 0000000..fa00908
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opendaylight.controller.sal.rest.impl;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper;
+import org.opendaylight.controller.sal.restconf.impl.SimpleNodeWrapper;
+
+import com.google.common.collect.Lists;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+
+class JsonReader {
+
+    public CompositeNodeWrapper read(InputStream entityStream) throws UnsupportedJsonFormatException {
+        JsonParser parser = new JsonParser();
+        
+        JsonElement rootElement = parser.parse(new InputStreamReader(entityStream));
+        if (!rootElement.isJsonObject()) {
+            throw new UnsupportedJsonFormatException("Root element of Json has to be Object");
+        }
+        
+        Set<Entry<String, JsonElement>> entrySetsOfRootJsonObject = rootElement.getAsJsonObject().entrySet();
+        if (entrySetsOfRootJsonObject.size() != 1) {
+            throw new UnsupportedJsonFormatException("Json Object should contain one element");
+        } else {
+            Entry<String, JsonElement> childEntry = Lists.newArrayList(entrySetsOfRootJsonObject).get(0);
+            String firstElementName = childEntry.getKey();
+            JsonElement firstElementType = childEntry.getValue();
+            if (firstElementType.isJsonObject()) { // container in yang
+                return createStructureWithRoot(firstElementName, firstElementType.getAsJsonObject());
+            }
+            if (firstElementType.isJsonArray()) { // list in yang
+                if (firstElementType.getAsJsonArray().size() == 1) {
+                    JsonElement firstElementInArray = firstElementType.getAsJsonArray().get(0);
+                    if (firstElementInArray.isJsonObject()) {
+                        return createStructureWithRoot(firstElementName, firstElementInArray.getAsJsonObject());
+                    }
+                    throw new UnsupportedJsonFormatException("Array as the first element in Json Object can have only Object element");
+                }
+            }
+            throw new UnsupportedJsonFormatException("First element in Json Object has to be \"Object\" or \"Array with one Object element\". Other scenarios are not supported yet.");
+        }
+    }
+    
+    private CompositeNodeWrapper createStructureWithRoot(String rootObjectName, JsonObject rootObject) {
+        CompositeNodeWrapper firstNode = new CompositeNodeWrapper(rootObjectName);
+        for (Entry<String, JsonElement> childOfFirstNode : rootObject.entrySet()) {
+            addChildToParent(childOfFirstNode.getKey(), childOfFirstNode.getValue(), firstNode);
+        }
+        return firstNode;
+    }
+    
+    private void addChildToParent(String childName, JsonElement childType, CompositeNodeWrapper parent) {
+        if (childType.isJsonObject()) {
+            CompositeNodeWrapper child = new CompositeNodeWrapper(childName);
+            parent.addValue(child);
+            for (Entry<String, JsonElement> childOfChild : childType.getAsJsonObject().entrySet()) {
+                addChildToParent(childOfChild.getKey(), childOfChild.getValue(), child);
+            }
+        } else if (childType.isJsonArray()) {
+            for (JsonElement childOfChildType : childType.getAsJsonArray()) {
+                addChildToParent(childName, childOfChildType, parent);
+            }
+        } else if (childType.isJsonPrimitive()) {
+            JsonPrimitive childPrimitive = childType.getAsJsonPrimitive();
+            String value = childPrimitive.getAsString();
+            SimpleNodeWrapper child = null;
+            if (value.equals("[null]")) {
+                child = new SimpleNodeWrapper(childName, null);
+            } else {
+                child = new SimpleNodeWrapper(childName, value);
+            }
+            parent.addValue(child);
+        }
+    }
+}