/* * Copyright © 2018 Orange, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.transportpce.pce.gnpy; import com.google.common.base.Function; //false positive in SpotBug -> cannot be used with FluentIterable... import com.google.common.collect.FluentIterable; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.Collections; import java.util.Optional; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; 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.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.common.QName; 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.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.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations { private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class); public ServiceDataStoreOperationsImpl(NetworkTransactionService networkTransactionService) { } public void createXMLFromDevice(DataStoreContext dataStoreContextUtil, OrgOpenroadmDevice device, String output) throws GnpyException { if (device != null) { Optional> 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)); writer.write(writerFromDataObject.toString()); writer.close(); } catch (IOException e) { throw new GnpyException( String.format("In ServiceDataStoreOperationsImpl : Bufferwriter error"),e); } LOG.debug("GNPy: device xml : {}", writerFromDataObject.toString()); } } public String createJsonStringFromDataObject(final InstanceIdentifier id, DataObject object) throws GnpyException, Exception { final SchemaPath scPath = SchemaPath .create(FluentIterable.from(id.getPathArguments()).transform(new Function() { @Override public QName apply(final PathArgument input) { return BindingReflections.findQName(input.getType()); } }), true); final Writer writer = new StringWriter(); NormalizedNodeStreamWriter domWriter; try { // Prepare the variables final ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create(); Iterable moduleInfos = Collections .singleton(BindingReflections.getModuleInfo(object.getClass())); moduleContext.addModuleInfos(moduleInfos); SchemaContext schemaContext = moduleContext.tryToCreateSchemaContext().get(); BindingRuntimeContext bindingContext; bindingContext = BindingRuntimeContext.create(moduleContext, schemaContext); final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(bindingContext); /* * This function needs : - context - scPath.getParent() - * scPath.getLastComponent().getNamespace(), - * JsonWriterFactory.createJsonWriter(writer) */ domWriter = JSONNormalizedNodeStreamWriter.createExclusiveWriter( JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.createSimple(schemaContext), scPath.getParent(), scPath.getLastComponent().getNamespace(), JsonWriterFactory.createJsonWriter(writer, 2)); // The write part codecRegistry.getSerializer(id.getTargetType()).serialize(object, codecRegistry.newWriter(id, domWriter)); domWriter.close(); writer.close(); } catch (IOException | YangSyntaxErrorException | ReactorException e) { throw new GnpyException("In ServiceDataStoreOperationsImpl: exception during json file creation",e); } return writer.toString(); } // Write the json as a string in a file public void writeStringFile(String jsonString, String fileName) throws GnpyException { try { FileWriter file = new FileWriter(fileName); file.write(jsonString); file.close(); } catch (IOException e) { throw new GnpyException("In ServiceDataStoreOperationsImpl : exception during file writing",e); } } }