GNPy migration to Aluminium
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / gnpy / ServiceDataStoreOperationsImpl.java
index 5b6ccaf685b041faa1bd47f64d03d1dbca75b2b1..f553d7dee0bc91e10a0704f3738ebf4dcb269f6e 100644 (file)
 package org.opendaylight.transportpce.pce.gnpy;
 
 import com.google.common.collect.FluentIterable;
-import java.io.BufferedWriter;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.stream.JsonWriter;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Optional;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
-import org.opendaylight.transportpce.common.DataStoreContext;
-import org.opendaylight.transportpce.common.converter.XMLDataObjectConverter;
-import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.Result;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
-import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev190103.GnpyApi;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
-    value = "DLS_DEAD_LOCAL_STORE",
-    justification = "FIXME aluminium migration pending: need to convert GNPy to BindingDOMCodecServices")
 public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations {
 
-    private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class);
+    private static final JsonParser PARSER = new JsonParser();
+    private BindingDOMCodecServices bindingDOMCodecServices;
 
-    public ServiceDataStoreOperationsImpl(NetworkTransactionService networkTransactionService) {
+    public ServiceDataStoreOperationsImpl(BindingDOMCodecServices bindingDOMCodecServices) throws GnpyException {
+        this.bindingDOMCodecServices = bindingDOMCodecServices;
     }
 
     @Override
-    public void createXMLFromDevice(DataStoreContext dataStoreContextUtil, OrgOpenroadmDevice device, String output)
+    public String createJsonStringFromDataObject(final InstanceIdentifier<GnpyApi> id, GnpyApi object)
         throws GnpyException {
-
-        if (device != null) {
-            Optional<NormalizedNode<?, ?>> transformIntoNormalizedNode = null;
-            XMLDataObjectConverter cwDsU = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil);
-            transformIntoNormalizedNode = cwDsU.toNormalizedNodes(device, OrgOpenroadmDevice.class);
-            if (!transformIntoNormalizedNode.isPresent()) {
-                throw new GnpyException(String.format(
-                    "In ServiceDataStoreOperationsImpl: Cannot transform the device %s into normalized nodes",
-                    device.toString()));
-            }
-            Writer writerFromDataObject =
-                cwDsU.writerFromDataObject(device, OrgOpenroadmDevice.class,cwDsU.dataContainer());
-            try (BufferedWriter writer = new BufferedWriter(new FileWriter(output,StandardCharsets.UTF_8))) {
-                writer.write(writerFromDataObject.toString());
-            } catch (IOException e) {
-                throw new GnpyException(
-                    String.format("In ServiceDataStoreOperationsImpl : Bufferwriter error %s",e));
-            }
-            LOG.debug("GNPy: device xml : {}", writerFromDataObject);
-        }
-    }
-
-    @Override
-    public String createJsonStringFromDataObject(final InstanceIdentifier<?> id, DataObject object)
-        throws GnpyException, Exception {
-
         final SchemaPath scPath = SchemaPath.create(FluentIterable
                 .from(id.getPathArguments())
                 .transform(input -> BindingReflections.findQName(input.getType())), true);
-
-        // Prepare the variables
-        // Create the schema context
-        Collection<? extends YangModuleInfo> moduleInfos = Collections.singleton(BindingReflections
-                .getModuleInfo(Result.class));
-        @NonNull
-        EffectiveModelContext schemaContext = BindingRuntimeHelpers.createEffectiveModel(moduleInfos);
-
         /*
          * This function needs : - context - scPath.getParent() -
          * scPath.getLastComponent().getNamespace(), -
          * JsonWriterFactory.createJsonWriter(writer)
          */
-        final Writer writer = new StringWriter();
 
-        try (NormalizedNodeStreamWriter domWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
-                JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.createSimple(schemaContext),
-                scPath.getParent(), scPath.getLastComponent().getNamespace(),
-                JsonWriterFactory.createJsonWriter(writer, 2));) {
-            // The write part
-            //FIXME
-            //codecRegistry.getSerializer(id.getTargetType()).serialize(object, codecRegistry.newWriter(id, domWriter));
+        JSONCodecFactory codecFactory = JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02
+                .getShared(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext());
+        try (Writer writer = new StringWriter();
+                JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, 2);) {
+            NormalizedNodeStreamWriter jsonStreamWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
+                    codecFactory, scPath.getParent(), scPath.getLastComponent().getNamespace(), jsonWriter);
+            try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStreamWriter)) {
+                nodeWriter.write(bindingDOMCodecServices.toNormalizedNode(id, object).getValue());
+                nodeWriter.flush();
+            }
+            JsonObject asJsonObject = PARSER.parse(writer.toString()).getAsJsonObject();
+            return new Gson().toJson(asJsonObject);
         } catch (IOException e) {
-            throw new GnpyException("In ServiceDataStoreOperationsImpl: exception during json file creation",e);
+            throw new GnpyException("Cannot convert data to Json string", e);
         }
-        return writer.toString();
     }
 
     // Write the json as a string in a file