fix some sonar issues
[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 javassist.ClassPool;
23
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator;
26 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
27 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
28 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
29 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
30 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
31 import org.opendaylight.transportpce.common.DataStoreContext;
32 import org.opendaylight.transportpce.common.converter.XMLDataObjectConverter;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
34 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
35 import org.opendaylight.yangtools.yang.binding.DataObject;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
38 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
39 import org.opendaylight.yangtools.yang.common.QName;
40 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
41 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
42 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
43 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
44 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
45 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
46 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
47 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
48 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52 public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations {
53
54     private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class);
55     private final DataBroker dataBroker;
56
57     public ServiceDataStoreOperationsImpl(DataBroker dataBroker) {
58         this.dataBroker = dataBroker;
59     }
60
61     public void createXMLFromDevice(DataStoreContext dataStoreContextUtil, OrgOpenroadmDevice device, String output) {
62         if (device != null) {
63             Optional<NormalizedNode<?, ?>> transformIntoNormalizedNode = null;
64             XMLDataObjectConverter cwDsU = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil);
65             transformIntoNormalizedNode = cwDsU.toNormalizedNodes(device, OrgOpenroadmDevice.class);
66             if (!transformIntoNormalizedNode.isPresent()) {
67                 throw new IllegalStateException(
68                         String.format("Could not transform the input %s into normalized nodes", device));
69             }
70             Writer writerFromDataObject =
71                 cwDsU.writerFromDataObject(device, OrgOpenroadmDevice.class,cwDsU.dataContainer());
72             try {
73                 BufferedWriter writer = new BufferedWriter(new FileWriter(output));
74                 writer.write(writerFromDataObject.toString());
75                 writer.close();
76             } catch (IOException e) {
77                 LOG.error("Bufferwriter error ");
78             }
79             LOG.debug("GNPy: device xml : {}", writerFromDataObject.toString());
80         }
81     }
82
83     public String createJsonStringFromDataObject(final InstanceIdentifier<?> id, DataObject object) throws Exception {
84
85         // See this link for more info :
86         // https://github.com/opendaylight/fpc/blob/master/impl/src/main/java/org/opendaylight/fpc/utils/FpcCodecUtils.java
87         final SchemaPath scPath = SchemaPath
88                 .create(FluentIterable.from(id.getPathArguments()).transform(new Function<PathArgument, QName>() {
89                     @Override
90                     public QName apply(final PathArgument input) {
91                         return BindingReflections.findQName(input.getType());
92                     }
93                 }), true);
94         final Writer writer = new StringWriter();
95         NormalizedNodeStreamWriter domWriter;
96
97         try {
98             // Prepare the variables
99             final ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create();
100             Iterable<? extends YangModuleInfo> moduleInfos = Collections
101                     .singleton(BindingReflections.getModuleInfo(object.getClass()));// TransportpceGnpyData.class));
102             moduleContext.addModuleInfos(moduleInfos);
103             SchemaContext schemaContext = moduleContext.tryToCreateSchemaContext().get();
104             BindingRuntimeContext bindingContext;
105             bindingContext = BindingRuntimeContext.create(moduleContext, schemaContext);
106             final BindingNormalizedNodeCodecRegistry bindingStreamCodecs = new BindingNormalizedNodeCodecRegistry(
107                     StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault())));
108             bindingStreamCodecs.onBindingRuntimeContextUpdated(bindingContext);
109             BindingNormalizedNodeCodecRegistry codecRegistry = bindingStreamCodecs;
110
111             /*
112              * This function needs : - context - scPath.getParent() -
113              * scPath.getLastComponent().getNamespace(), -
114              * JsonWriterFactory.createJsonWriter(writer)
115              */
116             domWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
117                     JSONCodecFactory.createSimple(schemaContext), scPath.getParent(),
118                     scPath.getLastComponent().getNamespace(), JsonWriterFactory.createJsonWriter(writer, 2));
119             // The write part
120             final BindingStreamEventWriter bindingWriter = codecRegistry.newWriter(id, domWriter);
121             codecRegistry.getSerializer(id.getTargetType()).serialize(object, bindingWriter);
122             // file.write(writer.toString());
123             // file.close();
124             writer.close();
125         } catch (IOException e) {
126             LOG.error("GNPy: writer error ");
127         } catch (YangSyntaxErrorException e) {
128             LOG.warn("GNPy: exception {} occured during json file creation", e.getMessage(), e);
129         } catch (ReactorException e) {
130             LOG.warn("GNPy: exception {} occured during json file creation", e.getMessage(), e);
131 //        } catch (Exception e) {
132 //            LOG.warn("An error {} occured during json file creation", e.getMessage(), e);
133         }
134         return writer.toString();
135     }
136
137     // Write the json as a string in a file
138     public void writeStringFile(String jsonString, String fileName) {
139         try {
140             FileWriter file = new FileWriter(fileName);
141             file.write(jsonString);
142             file.close();
143         } catch (IOException e) {
144             LOG.error("GNPy: writer error ");
145         }
146     }
147 }