BUG-7983: unify JSONCodec and XmlCodec methods 69/53869/5
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Mar 2017 18:06:21 +0000 (20:06 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 4 Apr 2017 15:59:51 +0000 (17:59 +0200)
This patch introduces TypeAwareCodec to define the common interface
which both these codecs implement. We adjust methods to conform
to this interface.

Change-Id: I25ccaf56c2e6013dee01016efe5fd7c960790f70
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
25 files changed:
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/AbstractJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/BooleanJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/EmptyJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NullJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NumberJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/QuotedJSONCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/TypeAwareCodec.java [new file with mode: 0644]

index 2b1ddd8428a9a171426f0a555d31169e9f730604..74715cef77dc69b808501691e06ec59168d7ccc2 100644 (file)
@@ -24,13 +24,13 @@ abstract class AbstractJSONCodec<T> implements JSONCodec<T> {
     }
 
     @Override
-    public final Class<T> getDataClass() {
+    public final Class<T> getDataType() {
         return codec.getInputClass();
     }
 
     @Override
-    public final T deserializeString(final String input) {
-        return codec.deserialize(input);
+    public final T parseValue(final Object ctx, final String str) {
+        return codec.deserialize(str);
     }
 
     final String serialize(final T input) {
index b77db19fc09cad92ccb92c337c10f0486d4636bc..13182f0645e6b29d8207ba18a26c5e2ea89ee91c 100644 (file)
@@ -19,14 +19,8 @@ final class BooleanJSONCodec extends AbstractJSONCodec<Boolean> {
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value
-     */
     @Override
-    public void serializeToWriter(final JsonWriter writer, final Boolean value) throws IOException {
-        writer.value(value);
+    public void writeValue(final JsonWriter ctx, final Boolean value) throws IOException {
+        ctx.value(value);
     }
 }
index 8ed23b050d5d27a3157e196e86eaa6058e1635a4..2e2e5f9dab0d9d4de74f9690c947296df46894a0 100644 (file)
@@ -20,19 +20,19 @@ final class EmptyJSONCodec implements JSONCodec<Void> {
     }
 
     @Override
-    public Void deserializeString(final String input) {
-        return null;
+    public Class<Void> getDataType() {
+        return Void.class;
     }
 
     @Override
-    public void serializeToWriter(final JsonWriter writer, final Void value) throws IOException {
-        writer.beginArray();
-        writer.value((String) null);
-        writer.endArray();
+    public Void parseValue(final Object ctx, final String input) {
+        return null;
     }
 
     @Override
-    public Class<Void> getDataClass() {
-        return Void.class;
+    public void writeValue(final JsonWriter ctx, final Void value) throws IOException {
+        ctx.beginArray();
+        ctx.value((String) null);
+        ctx.endArray();
     }
 }
index 32d10e7572fd3dd28a1a703b0592174ae79ad176..e32f10846ccf24356807a8b6d4478133ff0998ba 100644 (file)
@@ -9,30 +9,14 @@ package org.opendaylight.yangtools.yang.data.codec.gson;
 
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
+import org.opendaylight.yangtools.yang.data.util.codec.TypeAwareCodec;
 
-interface JSONCodec<T> {
+interface JSONCodec<T> extends TypeAwareCodec<T, Object, JsonWriter> {
     /**
-     * Deserialize (parse) a String representation into its native format.
+     * {@inheritDoc}
      *
-     * @param value String representation
-     * @return Value in native format
-     * @throws IllegalArgumentException if the value does not parse or pass type validation
-     */
-    T deserializeString(String value);
-
-    /**
-     * Serialize specified value with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value Value in native format
      * @throws IOException if the write fails
      */
-    void serializeToWriter(JsonWriter writer, T value) throws IOException;
-
-    /**
-     * Return the internal representation class.
-     *
-     * @return Data representation class.
-     */
-    Class<T> getDataClass();
+    @Override
+    void writeValue(JsonWriter ctx, T value) throws IOException;
 }
index 0d73512b7adc1e2b9b473566bd141808bf7ca50e..c1b9c7181a6e96a1a585bf6b07ccc572a198d317 100644 (file)
@@ -12,6 +12,7 @@ import static org.w3c.dom.Node.ELEMENT_NODE;
 import static org.w3c.dom.Node.TEXT_NODE;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
 import java.net.URI;
@@ -220,9 +221,17 @@ public final class JSONNormalizedNodeStreamWriter implements NormalizedNodeStrea
         }
     }
 
+    @SuppressWarnings("unchecked")
     private void writeValue(final Object value, final JSONCodec<?> codec)
             throws IOException {
-        ((JSONCodec<Object>) codec).serializeToWriter(writer, value);
+        try {
+            ((JSONCodec<Object>) codec).writeValue(writer, value);
+        } catch (IOException e) {
+            throw e;
+        } catch (Exception e) {
+            Throwables.propagateIfPossible(e);
+            throw new RuntimeException(e);
+        }
     }
 
     private void writeAnyXmlValue(final DOMSource anyXmlValue) throws IOException {
index e7de0aa3019cd0a77aac72aebc96e093935fd52c..c8ecc9e34e7d9dfdcc87b22fd48e0a2cf4fb1785 100644 (file)
@@ -32,23 +32,17 @@ final class JSONStringIdentityrefCodec extends ModuleStringIdentityrefCodec impl
     }
 
     @Override
-    public Class<QName> getDataClass() {
+    public Class<QName> getDataType() {
         return QName.class;
     }
 
     @Override
-    public QName deserializeString(final String value) {
-        return deserialize(value);
+    public QName parseValue(final Object ctx, final String str) {
+        return deserialize(str);
     }
 
-    /**
-     * Serialize QName with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value QName
-     */
     @Override
-    public void serializeToWriter(final JsonWriter writer, final QName value) throws IOException {
-        writer.value(serialize(value));
+    public void writeValue(final JsonWriter ctx, final QName value) throws IOException {
+        ctx.value(serialize(value));
     }
 }
index 11362ffdd2a3a35854c951bdfa900d07169e8093..98f0ec602c7fd0fbd155d188847734554e9b4774 100644 (file)
@@ -54,27 +54,21 @@ final class JSONStringInstanceIdentifierCodec extends AbstractModuleStringInstan
         Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
         Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
         final JSONCodec<?> objectJSONCodec = codecFactory.codecFor((LeafSchemaNode) schemaNode);
-        return objectJSONCodec.deserializeString(value);
+        return objectJSONCodec.parseValue(null, value);
     }
 
     @Override
-    public Class<YangInstanceIdentifier> getDataClass() {
+    public Class<YangInstanceIdentifier> getDataType() {
         return YangInstanceIdentifier.class;
     }
 
     @Override
-    public YangInstanceIdentifier deserializeString(final String value) {
-        return deserialize(value);
+    public YangInstanceIdentifier parseValue(final Object ctx, final String str) {
+        return deserialize(str);
     }
 
-    /**
-     * Serialize YangInstanceIdentifier with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value YangInstanceIdentifier
-     */
     @Override
-    public void serializeToWriter(final JsonWriter writer, final YangInstanceIdentifier value) throws IOException {
-        writer.value(serialize(value));
+    public void writeValue(final JsonWriter ctx, final YangInstanceIdentifier value) throws IOException {
+        ctx.value(serialize(value));
     }
 }
index b326574a7dc3a70e91c3526cef7b3a8b42dda26e..a05fb34c1961904dc1019eedf7b47d86e81ef4db 100644 (file)
@@ -279,7 +279,7 @@ public final class JsonParserStream implements Closeable, Flushable {
 
     private Object translateValueByType(final String value, final DataSchemaNode node) {
         Preconditions.checkArgument(node instanceof TypedSchemaNode);
-        return codecs.codecFor((TypedSchemaNode) node).deserializeString(value);
+        return codecs.codecFor((TypedSchemaNode) node).parseValue(null, value);
     }
 
     private void removeNamespace() {
index 40c8557ba04da4b3b161360a4991dde5b543e8ce..79861b3babc78fa39a3a2944dcdce7d44f759f05 100644 (file)
@@ -21,19 +21,19 @@ final class NullJSONCodec implements JSONCodec<Object> {
     }
 
     @Override
-    public Class<Object> getDataClass() {
+    public Class<Object> getDataType() {
         return Object.class;
     }
 
     @Override
-    public Object deserializeString(final String value) {
+    public Object parseValue(final Object ctx, final String str) {
         LOG.warn("Call of the deserializeString method on null codec. No operation performed.");
         return null;
     }
 
     @Override
-    public void serializeToWriter(final JsonWriter writer, final Object value) throws IOException {
-        // NOOP since codec is unkwown.
+    public void writeValue(final JsonWriter ctx, final Object value) throws IOException {
+        // NOOP since codec is unknown.
         LOG.warn("Call of the serializeToWriter method on null codec. No operation performed.");
     }
 }
index 154dcabd9306e5680aa44be393c09f39472abe37..1e7235201283e1aa8a805160604e6d12a7516c66 100644 (file)
@@ -21,14 +21,8 @@ final class NumberJSONCodec<T extends Number> extends AbstractJSONCodec<T > {
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value
-     */
     @Override
-    public void serializeToWriter(final JsonWriter writer, final T value) throws IOException {
-        writer.value(value);
+    public void writeValue(final JsonWriter ctx, final T value) throws IOException {
+        ctx.value(value);
     }
 }
\ No newline at end of file
index 356b43798df5924daf61e30fb8aa0508bf9f48a8..6d3a107fd06d0f43a70616770bd0468db44f2479 100644 (file)
@@ -21,14 +21,8 @@ final class QuotedJSONCodec<T> extends AbstractJSONCodec<T> {
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified JsonWriter.
-     *
-     * @param writer JsonWriter
-     * @param value
-     */
     @Override
-    public void serializeToWriter(final JsonWriter writer, final T value) throws IOException {
-        writer.value(serialize(value));
+    public void writeValue(final JsonWriter ctx, final T value) throws IOException {
+        ctx.value(serialize(value));
     }
 }
\ No newline at end of file
index 0ef7cda1925406c6863456a3db8d1717bd34f371..741db997ee82ef229260696f79027853e1e2a2d5 100644 (file)
@@ -32,7 +32,7 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
         }
 
         @Override
-        public Class<Object> getDataClass() {
+        public Class<Object> getDataType() {
             return Object.class;
         }
     }
@@ -46,7 +46,7 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
         }
 
         @Override
-        public Class<T> getDataClass() {
+        public Class<T> getDataType() {
             return dataClass;
         }
     }
@@ -63,9 +63,9 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
         final Iterator<JSONCodec<?>> it = codecs.iterator();
         Verify.verify(it.hasNext(), "Union %s has no subtypes", type);
 
-        Class<?> dataClass = it.next().getDataClass();
+        Class<?> dataClass = it.next().getDataType();
         while (it.hasNext()) {
-            final Class<?> next = it.next().getDataClass();
+            final Class<?> next = it.next().getDataType();
             if (!dataClass.equals(next)) {
                 LOG.debug("Type {} has diverse data classes: {} and {}", type, dataClass, next);
                 return new Diverse(codecs);
@@ -77,26 +77,26 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
     }
 
     @Override
-    public final T deserializeString(final String input) {
+    public final T parseValue(final Object ctx, final String str) {
         for (JSONCodec<?> codec : codecs) {
             final Object ret;
             try {
-                ret = codec.deserializeString(input);
+                ret = codec.parseValue(ctx, str);
             } catch (RuntimeException e) {
-                LOG.debug("Codec {} did not accept input '{}'", codec, input, e);
+                LOG.debug("Codec {} did not accept input '{}'", codec, str, e);
                 continue;
             }
 
-            return getDataClass().cast(ret);
+            return getDataType().cast(ret);
         }
 
-        throw new IllegalArgumentException("Invalid value \"" + input + "\" for union type.");
+        throw new IllegalArgumentException("Invalid value \"" + str + "\" for union type.");
     }
 
     @Override
-    public final void serializeToWriter(final JsonWriter writer, final T value) throws IOException {
+    public final void writeValue(final JsonWriter ctx, final T value) throws IOException {
         for (JSONCodec<?> codec : codecs) {
-            if (!codec.getDataClass().isInstance(value)) {
+            if (!codec.getDataType().isInstance(value)) {
                 LOG.debug("Codec {} cannot accept input {}, skipping it", codec, value);
                 continue;
             }
@@ -104,7 +104,7 @@ abstract class UnionJSONCodec<T> implements JSONCodec<T> {
             @SuppressWarnings("unchecked")
             final JSONCodec<Object> objCodec = (JSONCodec<Object>) codec;
             try {
-                objCodec.serializeToWriter(writer, value);
+                objCodec.writeValue(ctx, value);
                 return;
             } catch (RuntimeException e) {
                 LOG.debug("Codec {} failed to serialize {}", codec, value, e);
index 78e30d679c782988bf13a2f71a8e26a6eb5d48fe..e85628c5da62d69801e53caf22897bc67f97019b 100644 (file)
@@ -27,13 +27,13 @@ abstract class AbstractXmlCodec<T> implements XmlCodec<T> {
     }
 
     @Override
-    public final Class<T> getDataClass() {
+    public final Class<T> getDataType() {
         return codec.getInputClass();
     }
 
     @Override
-    public final T deserializeFromString(final NamespaceContext namespaceContext, final String value) {
-        return codec.deserialize(value);
+    public final T parseValue(final NamespaceContext namespaceContext, final String str) {
+        return codec.deserialize(str);
     }
 
     final String serialize(final T input) {
index 14b1404be6370c82b66e2385b08437680bc371e0..59e152cb8524a3931c2a4ac42ecce9c1b67dc27c 100644 (file)
@@ -18,7 +18,7 @@ final class BooleanXmlCodec extends AbstractXmlCodec<Boolean> {
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final Boolean value) throws XMLStreamException {
-        writer.writeCharacters(String.valueOf(value));
+    public void writeValue(final XMLStreamWriter ctx, final Boolean value) throws XMLStreamException {
+        ctx.writeCharacters(String.valueOf(value));
     }
 }
index 626626a4e8e0c324eee498b639afa1d82afd8bb0..c55a14f2715ee71d6fd4597c46a679ab2870095d 100644 (file)
@@ -21,17 +21,17 @@ final class EmptyXmlCodec implements XmlCodec<Void> {
     }
 
     @Override
-    public Class<Void> getDataClass() {
+    public Class<Void> getDataType() {
         return Void.class;
     }
 
     @Override
-    public Void deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+    public Void parseValue(final NamespaceContext ctx, final String str) {
         return null;
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final Void value) throws XMLStreamException {
-        writer.writeCharacters("");
+    public void writeValue(final XMLStreamWriter ctx, final Void value) throws XMLStreamException {
+        ctx.writeCharacters("");
     }
 }
index 21df404f24ab513faea1dfae0796fb7ea526d3a6..fbd99587cdef94a1452d29c85a73e2fac0f613e5 100644 (file)
@@ -40,32 +40,26 @@ final class IdentityrefXmlCodec extends ModuleStringIdentityrefCodec implements
     }
 
     @Override
-    public Class<QName> getDataClass() {
+    public Class<QName> getDataType() {
         return QName.class;
     }
 
-    /**
-     * Serialize QName with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value QName
-     */
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final QName value) throws XMLStreamException {
-        // FIXME: this does not work correctly, as we need to populate entries into the namespace context
-        writer.writeCharacters(serialize(value));
-    }
-
-    @Override
-    public QName deserializeFromString(final NamespaceContext namespaceContext, final String value) {
-        pushNamespaceContext(namespaceContext);
+    public QName parseValue(final NamespaceContext ctx, final String str) {
+        pushNamespaceContext(ctx);
         try {
-            return deserialize(value);
+            return deserialize(str);
         } finally {
             popNamespaceContext();
         }
     }
 
+    @Override
+    public void writeValue(final XMLStreamWriter ctx, final QName value) throws XMLStreamException {
+        // FIXME: this does not work correctly, as we need to populate entries into the namespace context
+        ctx.writeCharacters(serialize(value));
+    }
+
     private static NamespaceContext getNamespaceContext() {
         return TL_NSCONTEXT.get().getFirst();
     }
index 5abad0bd01a571d23d838e957a6dd7a978edb5c9..69a7fd503c460db0ff25fbd964249db752ae8ebe 100644 (file)
@@ -22,20 +22,19 @@ final class NullXmlCodec implements XmlCodec<Object> {
     }
 
     @Override
-    public Class<Object> getDataClass() {
+    public Class<Object> getDataType() {
         return Object.class;
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
-        // NOOP since codec is unkwown.
-        LOG.warn("Call of the serializeToWriter method on null codec. No operation performed.");
-    }
-
-    @Override
-    public Object deserializeFromString(final NamespaceContext namespaceContext, final String value) {
+    public Object parseValue(final NamespaceContext ctx, final String str) {
         LOG.warn("Call of the deserializeString method on null codec. No operation performed.");
         return null;
     }
 
+    @Override
+    public void writeValue(final XMLStreamWriter ctx, final Object value) throws XMLStreamException {
+        // NOOP since codec is unkwown.
+        LOG.warn("Call of the serializeToWriter method on null codec. No operation performed.");
+    }
 }
index 161ae8afecbd396b570e01760a631da7a23c2555..6035bb927a68f7a1e557a80d86d81bce75a67020 100644 (file)
@@ -18,7 +18,7 @@ final class NumberXmlCodec<T extends Number> extends AbstractXmlCodec<T> {
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final T value) throws XMLStreamException {
-        writer.writeCharacters(String.valueOf(value));
+    public void writeValue(final XMLStreamWriter ctx, final T value) throws XMLStreamException {
+        ctx.writeCharacters(String.valueOf(value));
     }
 }
index 3d1002661bd6a0b47d4103ccade6ef398a8eff8b..720728bb4fc147e323fb17a52d1b88b31ec0af41 100644 (file)
@@ -17,14 +17,8 @@ final class QuotedXmlCodec<T> extends AbstractXmlCodec<T> {
         super(codec);
     }
 
-    /**
-     * Serialize specified value with specified XMLStreamWriter.
-     *
-     * @param writer XMLStreamWriter
-     * @param value value which will be serialized to the writer
-     */
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final T value) throws XMLStreamException {
-        writer.writeCharacters(serialize(value));
+    public void writeValue(final XMLStreamWriter ctx, final T value) throws XMLStreamException {
+        ctx.writeCharacters(serialize(value));
     }
 }
index e244617faeffc687c400540716913e10dc25d6e7..ec20542160ba268cfcdf0df8555163f320ad5dac 100644 (file)
@@ -27,7 +27,7 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
         }
 
         @Override
-        public Class<Object> getDataClass() {
+        public Class<Object> getDataType() {
             return Object.class;
         }
     }
@@ -41,7 +41,7 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
         }
 
         @Override
-        public Class<T> getDataClass() {
+        public Class<T> getDataType() {
             return dataClass;
         }
     }
@@ -58,9 +58,9 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
         final Iterator<XmlCodec<?>> it = codecs.iterator();
         Verify.verify(it.hasNext(), "Union %s has no subtypes", type);
 
-        Class<?> dataClass = it.next().getDataClass();
+        Class<?> dataClass = it.next().getDataType();
         while (it.hasNext()) {
-            final Class<?> next = it.next().getDataClass();
+            final Class<?> next = it.next().getDataType();
             if (!dataClass.equals(next)) {
                 LOG.debug("Type {} has diverse data classes: {} and {}", type, dataClass, next);
                 return new Diverse(codecs);
@@ -72,26 +72,26 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
     }
 
     @Override
-    public final T deserializeFromString(final NamespaceContext namespaceContext, final String input) {
+    public final T parseValue(final NamespaceContext ctx, final String str) {
         for (XmlCodec<?> codec : codecs) {
             final Object ret;
             try {
-                ret = codec.deserializeFromString(namespaceContext, input);
+                ret = codec.parseValue(ctx, str);
             } catch (RuntimeException e) {
-                LOG.debug("Codec {} did not accept input '{}'", codec, input, e);
+                LOG.debug("Codec {} did not accept input '{}'", codec, str, e);
                 continue;
             }
 
-            return getDataClass().cast(ret);
+            return getDataType().cast(ret);
         }
 
-        throw new IllegalArgumentException("Invalid value \"" + input + "\" for union type.");
+        throw new IllegalArgumentException("Invalid value \"" + str + "\" for union type.");
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final Object value) throws XMLStreamException {
+    public void writeValue(final XMLStreamWriter ctx, final Object value) throws XMLStreamException {
         for (XmlCodec<?> codec : codecs) {
-            if (!codec.getDataClass().isInstance(value)) {
+            if (!codec.getDataType().isInstance(value)) {
                 LOG.debug("Codec {} cannot accept input {}, skipping it", codec, value);
                 continue;
             }
@@ -99,7 +99,7 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
             @SuppressWarnings("unchecked")
             final XmlCodec<Object> objCodec = (XmlCodec<Object>) codec;
             try {
-                objCodec.serializeToWriter(writer, value);
+                objCodec.writeValue(ctx, value);
                 return;
             } catch (RuntimeException e) {
                 LOG.debug("Codec {} failed to serialize {}", codec, value, e);
index 93ee13e782d6eaf7427cdfa371de223343a01fc1..bebb5ca979e685601129781657da8490d740bcdf 100644 (file)
@@ -11,18 +11,14 @@ package org.opendaylight.yangtools.yang.data.codec.xml;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
+import org.opendaylight.yangtools.yang.data.util.codec.TypeAwareCodec;
 
-interface XmlCodec<T> {
-    Class<T> getDataClass();
-
-    T deserializeFromString(NamespaceContext namespaceContext, String value);
-
+interface XmlCodec<T> extends TypeAwareCodec<T, NamespaceContext, XMLStreamWriter> {
     /**
-     * Serialize specified value with specified XMLStreamWriter.
+     * {@inheritDoc}
      *
-     * @param writer XMLStreamWriter
-     * @param value value which will be serialized to the writer
      * @throws XMLStreamException from {@link XMLStreamWriter}
      */
-    void serializeToWriter(XMLStreamWriter writer, T value) throws XMLStreamException;
+    @Override
+    void writeValue(XMLStreamWriter ctx, T value) throws XMLStreamException;
 }
index c6d11a1ce1c43266c52ca661e17b93c4bb930b9a..f6baedecabf35a64112c38f59eae10a3ac5bd435 100644 (file)
@@ -261,7 +261,7 @@ public final class XmlParserStream implements Closeable, Flushable {
         }
 
         Preconditions.checkArgument(node instanceof TypedSchemaNode);
-        return codecs.codecFor((TypedSchemaNode) node).deserializeFromString(namespaceCtx, value);
+        return codecs.codecFor((TypedSchemaNode) node).parseValue(namespaceCtx, value);
     }
 
     private static AbstractNodeDataWithSchema newEntryNode(final AbstractNodeDataWithSchema parent) {
index 292078f4588cf1117b650e7fdb54afa69ce72de9..044a550addb6e7292c7f794008d0cfdb81762bdf 100644 (file)
@@ -62,28 +62,28 @@ final class XmlStringInstanceIdentifierCodec  extends AbstractModuleStringInstan
         Preconditions.checkNotNull(schemaNode, "schemaNode cannot be null");
         Preconditions.checkArgument(schemaNode instanceof LeafSchemaNode, "schemaNode must be of type LeafSchemaNode");
         final XmlCodec<?> objectXmlCodec = codecFactory.codecFor((LeafSchemaNode) schemaNode);
-        return objectXmlCodec.deserializeFromString(getNamespaceContext(), value);
+        return objectXmlCodec.parseValue(getNamespaceContext(), value);
     }
 
     @Override
-    public Class<YangInstanceIdentifier> getDataClass() {
+    public Class<YangInstanceIdentifier> getDataType() {
         return YangInstanceIdentifier.class;
     }
 
     @Override
-    public YangInstanceIdentifier deserializeFromString(final NamespaceContext namespaceContext, final String value) {
-        pushNamespaceContext(namespaceContext);
+    public YangInstanceIdentifier parseValue(final NamespaceContext ctx, final String str) {
+        pushNamespaceContext(ctx);
         try {
-            return deserialize(value);
+            return deserialize(str);
         } finally {
             popNamespaceContext();
         }
     }
 
     @Override
-    public void serializeToWriter(final XMLStreamWriter writer, final YangInstanceIdentifier value)
+    public void writeValue(final XMLStreamWriter ctx, final YangInstanceIdentifier value)
             throws XMLStreamException {
-        writer.writeCharacters(serialize(value));
+        ctx.writeCharacters(serialize(value));
     }
 
     private static NamespaceContext getNamespaceContext() {
index fa65a7f87171b3c8351c8c902663ad5e6fcd9701..a1caa6b3b0a6023308cffbe6b70c18bbd0aaa3fe 100644 (file)
@@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory;
  * @param <T> Codec type
  */
 @ThreadSafe
-public abstract class AbstractCodecFactory<T> {
+public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractCodecFactory.class);
 
     private final CodecCache<T> cache;
diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/TypeAwareCodec.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/TypeAwareCodec.java
new file mode 100644 (file)
index 0000000..d72b42b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies, s.r.o. 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.yangtools.yang.data.util.codec;
+
+import com.google.common.annotations.Beta;
+
+/**
+  * A codec, which knows what the native representation for a particular data type is. It knows how to convert a native
+  * value to and from string representation based on some additional input or output context.
+  *
+  * @author Robert Varga
+  *
+  * @param <T> Data value type
+  * @param <I> Input context type
+  * @param <O> Output context type
+  */
+@Beta
+public interface TypeAwareCodec<T, I, O> {
+    /**
+     * Return the data type class.
+     *
+     * @return Data type class
+     */
+    Class<T> getDataType();
+
+    /**
+     * Parse a String representation into its native format.
+     *
+     * @param ctx Parse context
+     * @param str String representation
+     * @return Value in native format
+     * @throws IllegalArgumentException if the value does not parse or pass type validation
+     */
+    T parseValue(I ctx, String str);
+
+    /**
+     * Serialize specified value with specified JsonWriter.
+     *
+     * @param ctx Write context
+     * @param value Value in native format
+     * @throws Exception if the write fails
+     */
+    void writeValue(O ctx, T value) throws Exception;
+}