5342387afa0008c5539f2b8e0b6669a168a2a45b
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / gnpy / ServiceDataStoreOperationsImpl.java
1 /*
2  * Copyright © 2018 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.transportpce.pce.gnpy;
10
11 import com.google.common.base.Function;
12 import com.google.common.collect.FluentIterable;
13
14 import java.io.BufferedWriter;
15 import java.io.FileWriter;
16 import java.io.IOException;
17 import java.io.StringWriter;
18 import java.io.Writer;
19 import java.util.Collections;
20 import java.util.Optional;
21
22 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
23 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
24 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
25 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
26 import org.opendaylight.transportpce.common.DataStoreContext;
27 import org.opendaylight.transportpce.common.converter.XMLDataObjectConverter;
28 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
30 import org.opendaylight.yangtools.yang.binding.DataObject;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
33 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
34 import org.opendaylight.yangtools.yang.common.QName;
35 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
37 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
38 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
39 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
40 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
41 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
42 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
43 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations {
48
49     private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class);
50
51     public ServiceDataStoreOperationsImpl(NetworkTransactionService networkTransactionService) {
52     }
53
54     public void createXMLFromDevice(DataStoreContext dataStoreContextUtil, OrgOpenroadmDevice device, String output)
55         throws GnpyException {
56
57         if (device != null) {
58             Optional<NormalizedNode<?, ?>> transformIntoNormalizedNode = null;
59             XMLDataObjectConverter cwDsU = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil);
60             transformIntoNormalizedNode = cwDsU.toNormalizedNodes(device, OrgOpenroadmDevice.class);
61             if (!transformIntoNormalizedNode.isPresent()) {
62                 throw new GnpyException(String.format(
63                     "In ServiceDataStoreOperationsImpl: Cannot transform the device %s into normalized nodes",
64                     device.toString()));
65             }
66             Writer writerFromDataObject =
67                 cwDsU.writerFromDataObject(device, OrgOpenroadmDevice.class,cwDsU.dataContainer());
68             try {
69                 BufferedWriter writer = new BufferedWriter(new FileWriter(output));
70                 writer.write(writerFromDataObject.toString());
71                 writer.close();
72             } catch (IOException e) {
73                 throw new GnpyException(
74                     String.format("In ServiceDataStoreOperationsImpl : Bufferwriter error"),e);
75             }
76             LOG.debug("GNPy: device xml : {}", writerFromDataObject.toString());
77         }
78     }
79
80     public String createJsonStringFromDataObject(final InstanceIdentifier<?> id, DataObject object)
81         throws GnpyException, Exception {
82
83         final SchemaPath scPath = SchemaPath
84                 .create(FluentIterable.from(id.getPathArguments()).transform(new Function<PathArgument, QName>() {
85                     @Override
86                     public QName apply(final PathArgument input) {
87                         return BindingReflections.findQName(input.getType());
88                     }
89                 }), true);
90         final Writer writer = new StringWriter();
91         NormalizedNodeStreamWriter domWriter;
92
93         try {
94             // Prepare the variables
95             final ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create();
96             Iterable<? extends YangModuleInfo> moduleInfos = Collections
97                     .singleton(BindingReflections.getModuleInfo(object.getClass()));
98             moduleContext.addModuleInfos(moduleInfos);
99             SchemaContext schemaContext = moduleContext.tryToCreateSchemaContext().get();
100             BindingRuntimeContext bindingContext;
101             bindingContext = BindingRuntimeContext.create(moduleContext, schemaContext);
102             final BindingNormalizedNodeCodecRegistry codecRegistry =
103                 new BindingNormalizedNodeCodecRegistry(bindingContext);
104
105             /*
106              * This function needs : - context - scPath.getParent() -
107              * scPath.getLastComponent().getNamespace(), -
108              * JsonWriterFactory.createJsonWriter(writer)
109              */
110             domWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
111                 JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.createSimple(schemaContext),
112                 scPath.getParent(), scPath.getLastComponent().getNamespace(),
113                 JsonWriterFactory.createJsonWriter(writer, 2));
114             // The write part
115             codecRegistry.getSerializer(id.getTargetType()).serialize(object, codecRegistry.newWriter(id, domWriter));
116             domWriter.close();
117             writer.close();
118         } catch (IOException | YangSyntaxErrorException | ReactorException e) {
119             throw new GnpyException("In ServiceDataStoreOperationsImpl: exception during json file creation",e);
120         }
121         return writer.toString();
122     }
123
124     // Write the json as a string in a file
125     public void writeStringFile(String jsonString, String fileName) throws GnpyException {
126         try {
127             FileWriter file = new FileWriter(fileName);
128             file.write(jsonString);
129             file.close();
130         } catch (IOException e) {
131             throw new GnpyException("In ServiceDataStoreOperationsImpl : exception during file writing",e);
132         }
133     }
134 }