2 * Copyright (c) 2018 AT&T and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package io.fd.honeycomb.transportpce.binding.converter;
18 import com.google.gson.stream.JsonReader;
19 import com.google.gson.stream.JsonWriter;
21 import io.fd.honeycomb.transportpce.binding.converter.api.DataObjectConverter;
22 import io.fd.honeycomb.transportpce.test.common.DataStoreContext;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.io.InputStreamReader;
27 import java.io.Reader;
28 import java.io.StringWriter;
29 import java.io.Writer;
30 import java.util.Optional;
31 import javax.annotation.Nonnull;
33 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
34 import org.opendaylight.yangtools.yang.binding.DataObject;
35 import org.opendaylight.yangtools.yang.common.QName;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
37 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
38 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
39 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
40 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
41 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
42 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
43 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
44 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
45 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
46 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
50 public class JSONDataObjectConverter extends AbstractDataObjectConverter {
52 private static final Logger LOG = LoggerFactory.getLogger(JSONDataObjectConverter.class);
54 private JSONDataObjectConverter(SchemaContext schemaContext, BindingNormalizedNodeCodecRegistry codecRegistry) {
55 super(schemaContext, codecRegistry);
59 * extracts codec and schema context (?).
61 * @param dataStoreContextUtil datastore context util used to extract codec and schema context
62 * @return {@link AbstractDataObjectConverter}
64 public static DataObjectConverter createWithDataStoreUtil(@Nonnull DataStoreContext dataStoreContextUtil) {
65 return new JSONDataObjectConverter(dataStoreContextUtil.getSchemaContext(),
66 dataStoreContextUtil.getBindingToNormalizedNodeCodec());
70 * extracts codec and schema context (?).
72 * @param schemaContext schema context for converter
73 * @param codecRegistry codec registry used for converting
76 public static DataObjectConverter createWithSchemaContext(@Nonnull SchemaContext schemaContext,
77 @Nonnull BindingNormalizedNodeCodecRegistry codecRegistry) {
78 return new JSONDataObjectConverter(schemaContext, codecRegistry);
82 * Transforms the JSON input stream into normalized nodes.
84 * @param inputStream of the given JSON
85 * @return {@link Optional} instance of {@link NormalizedNode}.
88 public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
89 @Nonnull InputStream inputStream) {
91 JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
92 return parseInputJSON(reader);
93 } catch (IOException e) {
94 LOG.warn(e.getMessage(), e);
95 return Optional.empty();
100 public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
101 @Nonnull Reader inputReader, SchemaNode parentSchema) {
102 throw new UnsupportedOperationException("Not Implemented yet");
106 public Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> transformIntoNormalizedNode(
107 @Nonnull Reader inputReader) {
108 JsonReader reader = new JsonReader(inputReader);
109 return parseInputJSON(reader);
113 public <T extends DataObject> Writer writerFromDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
114 ConvertType<T> convertType) {
115 Writer writer = new StringWriter();
116 JsonWriter jsonWriter = new JsonWriter(writer);
117 JSONCodecFactory jsonCodecFactory = JSONCodecFactory.createLazy(getSchemaContext());
118 NormalizedNodeStreamWriter create =
119 JSONNormalizedNodeStreamWriter.createExclusiveWriter(jsonCodecFactory, null, null, jsonWriter);
121 try (NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(create);) {
123 .write(convertType.toNormalizedNodes(dataObjectClass.cast(object), dataObjectClass).get());
124 } catch (IOException ioe) {
125 throw new IllegalStateException(ioe);
131 public <T extends DataObject> Writer writerFromRpcDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
132 ConvertType<T> convertType, QName rpcOutputQName, String rpcName) {
137 * Parses the input json with concrete implementation of {@link JsonParserStream}.
139 * @param reader of the given JSON
142 private Optional<NormalizedNode<? extends YangInstanceIdentifier.PathArgument, ?>> parseInputJSON(
144 NormalizedNodeResult result = new NormalizedNodeResult();
145 try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
146 JsonParserStream jsonParser = JsonParserStream.create(streamWriter, getSchemaContext(),
147 getSchemaContext())) {
148 jsonParser.parse(reader);
149 } catch (IOException e) {
150 LOG.warn("An error {} occured during parsing Json input stream", e.getMessage(), e);
151 return Optional.empty();
153 return Optional.ofNullable(result.getResult());