pce(gnpy) for Sulfur
[transportpce.git] / common / src / main / java / org / opendaylight / transportpce / common / converter / JsonStringConverter.java
old mode 100644 (file)
new mode 100755 (executable)
index 7f7680b..52f8e4a
@@ -7,18 +7,20 @@
  */
 package org.opendaylight.transportpce.common.converter;
 
-import com.google.common.collect.FluentIterable;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.nio.charset.StandardCharsets;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -31,7 +33,9 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,8 +58,6 @@ public class JsonStringConverter<T extends DataObject> {
      */
     public String createJsonStringFromDataObject(final InstanceIdentifier<T> id, T dataObject,
             JSONCodecFactorySupplier supplier) throws IOException {
-        final SchemaPath scPath = SchemaPath.create(FluentIterable.from(id.getPathArguments())
-                .transform(input -> BindingReflections.findQName(input.getType())), true);
         /*
          * This function needs : - context - scPath.getParent() -
          * scPath.getLastComponent().getNamespace(), -
@@ -65,9 +67,14 @@ public class JsonStringConverter<T extends DataObject> {
         JSONCodecFactory codecFactory = supplier
                 .getShared(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext());
         try (Writer writer = new StringWriter();
-                JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, 4);) {
-            NormalizedNodeStreamWriter jsonStreamWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
-                    codecFactory, scPath.getParent(), scPath.getLastComponent().getNamespace(), jsonWriter);
+                JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, 4)) {
+            EffectiveStatementInference rootNode = SchemaInferenceStack
+                .of(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext())
+                .toInference();
+            rootNode.getEffectiveModelContext();
+            rootNode.getEffectiveModelContext();
+            NormalizedNodeStreamWriter jsonStreamWriter = JSONNormalizedNodeStreamWriter
+                .createExclusiveWriter(codecFactory, rootNode, EffectiveModelContext.NAME.getNamespace(), jsonWriter);
             try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStreamWriter)) {
                 nodeWriter.write(bindingDOMCodecServices.toNormalizedNode(id, dataObject).getValue());
                 nodeWriter.flush();
@@ -90,17 +97,36 @@ public class JsonStringConverter<T extends DataObject> {
     @SuppressWarnings("unchecked")
     public T createDataObjectFromJsonString(YangInstanceIdentifier path, String jsonString,
             JSONCodecFactorySupplier supplier) {
-        JsonReader reader = new JsonReader(new StringReader(jsonString));
+        return createDataObjectFromReader(path, new StringReader(jsonString), supplier);
+    }
+
+    public T createDataObjectFromInputStream(YangInstanceIdentifier path, InputStream jsonStream,
+                                            JSONCodecFactorySupplier supplier) {
+        return createDataObjectFromReader(path, new InputStreamReader(jsonStream, StandardCharsets.UTF_8), supplier);
+    }
+
+    /**
+     * Create a dataObject of T type from Reader.
+     * @param path YangInstanceIdentifier
+     * @param inputReader Reader (could be all class implementing Reader) containing Json data.
+     * @param supplier RFC7951 or DRAFT_LHOTKA_NETMOD_YANG_JSON_02
+     * @return the created object.
+     */
+    private T createDataObjectFromReader(YangInstanceIdentifier path, Reader inputReader,
+                                         JSONCodecFactorySupplier supplier) {
+
         NormalizedNodeResult result = new NormalizedNodeResult();
-        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-                JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
-                        supplier
-                                .getShared(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext()))) {
+        try (JsonReader reader = new JsonReader(inputReader);
+             NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+             JsonParserStream jsonParser = JsonParserStream
+                     .create(
+                             streamWriter,
+                             supplier.getShared(bindingDOMCodecServices
+                                     .getRuntimeContext().getEffectiveModelContext()))) {
             jsonParser.parse(reader);
-            return (T) bindingDOMCodecServices
-                    .fromNormalizedNode(path, result.getResult()).getValue();
+            return (T) bindingDOMCodecServices.fromNormalizedNode(path, result.getResult()).getValue();
         } catch (IOException e) {
-            LOG.warn("An error occured during parsing Json input stream", e);
+            LOG.warn("An error occured during parsing input reader", e);
             return null;
         }
     }