0413ef4e1436fcfdd0f58dc54de43597539e02b9
[transportpce.git] / test-common / src / main / java / org / opendaylight / transportpce / binding / converter / JSONDataObjectConverter.java
1 /*
2  * Copyright © 2016 AT&T 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 package org.opendaylight.transportpce.binding.converter;
9
10 import com.google.gson.stream.JsonReader;
11 import com.google.gson.stream.JsonWriter;
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.io.InputStreamReader;
15 import java.io.Reader;
16 import java.io.StringWriter;
17 import java.io.Writer;
18 import java.util.Optional;
19 import javax.annotation.Nonnull;
20 import org.opendaylight.transportpce.binding.converter.api.DataObjectConverter;
21 import org.opendaylight.transportpce.test.common.DataStoreContext;
22 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
28 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
29 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
30 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
31 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
32 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
33 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
35 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 public class JSONDataObjectConverter extends AbstractDataObjectConverter {
40
41     private static final Logger LOG = LoggerFactory.getLogger(JSONDataObjectConverter.class);
42
43     private JSONDataObjectConverter(SchemaContext schemaContext, BindingNormalizedNodeCodecRegistry codecRegistry) {
44         super(schemaContext, codecRegistry);
45     }
46
47     /**
48      * extracts codec and schema context (?).
49      *
50      * @param dataStoreContextUtil datastore context util used to extract codec and schema context
51      * @return {@link AbstractDataObjectConverter}
52      */
53     public static DataObjectConverter createWithDataStoreUtil(@Nonnull DataStoreContext dataStoreContextUtil) {
54         return new JSONDataObjectConverter(dataStoreContextUtil.getSchemaContext(),
55                 dataStoreContextUtil.getBindingToNormalizedNodeCodec());
56     }
57
58     /**
59      * extracts codec and schema context (?).
60      *
61      * @param schemaContext schema context for converter
62      * @param codecRegistry codec registry used for converting
63      * @return converter
64      */
65     public static DataObjectConverter createWithSchemaContext(@Nonnull SchemaContext schemaContext,
66             @Nonnull BindingNormalizedNodeCodecRegistry codecRegistry) {
67         return new JSONDataObjectConverter(schemaContext, codecRegistry);
68     }
69
70     /**
71      * Transforms the JSON input stream into normalized nodes.
72      *
73      * @param inputStream of the given JSON
74      * @return {@link Optional} instance of {@link NormalizedNode}.
75      */
76     @Override
77     public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
78             @Nonnull InputStream inputStream) {
79         try {
80             JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
81             return parseInputJSON(reader);
82         } catch (IOException e) {
83             LOG.warn(e.getMessage(), e);
84             return Optional.empty();
85         }
86     }
87
88     @Override
89     public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
90             @Nonnull Reader inputReader, SchemaNode parentSchema) {
91         throw new UnsupportedOperationException("Not Implemented yet");
92     }
93
94     @Override
95     public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
96             @Nonnull Reader inputReader) {
97         JsonReader reader = new JsonReader(inputReader);
98         return parseInputJSON(reader);
99     }
100
101     @Override
102     public <T extends DataObject> Writer writerFromDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
103             ConvertType<T> convertType) {
104         Writer writer = new StringWriter();
105         JsonWriter jsonWriter = new JsonWriter(writer);
106         JSONCodecFactory jsonCodecFactory = JSONCodecFactory.createLazy(getSchemaContext());
107         NormalizedNodeStreamWriter create =
108                 JSONNormalizedNodeStreamWriter.createExclusiveWriter(jsonCodecFactory, null, null, jsonWriter);
109
110         try (NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(create);) {
111             normalizedNodeWriter
112                     .write(convertType.toNormalizedNodes(dataObjectClass.cast(object), dataObjectClass).get());
113         } catch (IOException ioe) {
114             throw new IllegalStateException(ioe);
115         }
116         return writer;
117     }
118
119     @Override
120     public <T extends DataObject> Writer writerFromRpcDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
121             ConvertType<T> convertType, QName rpcOutputQName, String rpcName) {
122         return null;
123     }
124
125     /**
126      * Parses the input json with concrete implementation of {@link JsonParserStream}.
127      *
128      * @param reader of the given JSON
129      *
130      */
131     private Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> parseInputJSON(
132             JsonReader reader) {
133         NormalizedNodeResult result = new NormalizedNodeResult();
134         try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
135             JsonParserStream jsonParser = JsonParserStream.create(streamWriter, getSchemaContext(),
136             getSchemaContext())) {
137             jsonParser.parse(reader);
138         } catch (IOException e) {
139             LOG.warn("An error {} occured during parsing Json input stream", e.getMessage(), e);
140             return Optional.empty();
141         }
142         return Optional.ofNullable(result.getResult());
143     }
144
145 }