2 * Copyright © 2018 Orange, Inc. and others. All rights reserved.
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
9 package org.opendaylight.transportpce.pce.gnpy;
11 import com.google.common.collect.FluentIterable;
12 import java.io.BufferedWriter;
13 import java.io.FileWriter;
14 import java.io.IOException;
15 import java.io.StringWriter;
16 import java.io.Writer;
17 import java.nio.charset.StandardCharsets;
18 import java.util.Collections;
19 import java.util.Optional;
20 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
21 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
22 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
23 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
24 import org.opendaylight.transportpce.common.DataStoreContext;
25 import org.opendaylight.transportpce.common.converter.XMLDataObjectConverter;
26 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
28 import org.opendaylight.yangtools.yang.binding.DataObject;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
33 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
34 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
35 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
36 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
37 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations {
43 private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class);
45 public ServiceDataStoreOperationsImpl(NetworkTransactionService networkTransactionService) {
49 public void createXMLFromDevice(DataStoreContext dataStoreContextUtil, OrgOpenroadmDevice device, String output)
50 throws GnpyException {
53 Optional<NormalizedNode<?, ?>> transformIntoNormalizedNode = null;
54 XMLDataObjectConverter cwDsU = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil);
55 transformIntoNormalizedNode = cwDsU.toNormalizedNodes(device, OrgOpenroadmDevice.class);
56 if (!transformIntoNormalizedNode.isPresent()) {
57 throw new GnpyException(String.format(
58 "In ServiceDataStoreOperationsImpl: Cannot transform the device %s into normalized nodes",
61 Writer writerFromDataObject =
62 cwDsU.writerFromDataObject(device, OrgOpenroadmDevice.class,cwDsU.dataContainer());
63 try (BufferedWriter writer = new BufferedWriter(new FileWriter(output,StandardCharsets.UTF_8))) {
64 writer.write(writerFromDataObject.toString());
65 } catch (IOException e) {
66 throw new GnpyException(
67 String.format("In ServiceDataStoreOperationsImpl : Bufferwriter error %s",e));
69 LOG.debug("GNPy: device xml : {}", writerFromDataObject);
74 public String createJsonStringFromDataObject(final InstanceIdentifier<?> id, DataObject object)
75 throws GnpyException, Exception {
77 final SchemaPath scPath = SchemaPath.create(FluentIterable
78 .from(id.getPathArguments())
79 .transform(input -> BindingReflections.findQName(input.getType())), true);
81 // Prepare the variables
82 final ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create();
83 Iterable<? extends YangModuleInfo> moduleInfos = Collections
84 .singleton(BindingReflections.getModuleInfo(object.getClass()));
85 moduleContext.addModuleInfos(moduleInfos);
86 SchemaContext schemaContext = moduleContext.tryToCreateSchemaContext().get();
87 BindingRuntimeContext bindingContext;
88 bindingContext = BindingRuntimeContext.create(moduleContext, schemaContext);
89 final BindingNormalizedNodeCodecRegistry codecRegistry =
90 new BindingNormalizedNodeCodecRegistry(bindingContext);
93 * This function needs : - context - scPath.getParent() -
94 * scPath.getLastComponent().getNamespace(), -
95 * JsonWriterFactory.createJsonWriter(writer)
97 final Writer writer = new StringWriter();
99 try (NormalizedNodeStreamWriter domWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
100 JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.createSimple(schemaContext),
101 scPath.getParent(), scPath.getLastComponent().getNamespace(),
102 JsonWriterFactory.createJsonWriter(writer, 2));) {
104 codecRegistry.getSerializer(id.getTargetType()).serialize(object, codecRegistry.newWriter(id, domWriter));
105 } catch (IOException e) {
106 throw new GnpyException("In ServiceDataStoreOperationsImpl: exception during json file creation",e);
108 return writer.toString();
111 // Write the json as a string in a file
113 public void writeStringFile(String jsonString, String fileName) throws GnpyException {
114 try (FileWriter file = new FileWriter(fileName,StandardCharsets.UTF_8)) {
115 file.write(jsonString);
116 } catch (IOException e) {
117 throw new GnpyException("In ServiceDataStoreOperationsImpl : exception during file writing",e);