From 715442142530f0a6af457ec8a206b644567ab419 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 26 Mar 2017 20:06:21 +0200 Subject: [PATCH] BUG-7983: unify JSONCodec and XmlCodec methods 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 --- .../data/codec/gson/AbstractJSONCodec.java | 6 +-- .../data/codec/gson/BooleanJSONCodec.java | 10 +--- .../yang/data/codec/gson/EmptyJSONCodec.java | 16 +++--- .../yang/data/codec/gson/JSONCodec.java | 26 ++-------- .../gson/JSONNormalizedNodeStreamWriter.java | 11 ++++- .../gson/JSONStringIdentityrefCodec.java | 16 ++---- .../JSONStringInstanceIdentifierCodec.java | 18 +++---- .../data/codec/gson/JsonParserStream.java | 2 +- .../yang/data/codec/gson/NullJSONCodec.java | 8 +-- .../yang/data/codec/gson/NumberJSONCodec.java | 10 +--- .../yang/data/codec/gson/QuotedJSONCodec.java | 10 +--- .../yang/data/codec/gson/UnionJSONCodec.java | 24 ++++----- .../yang/data/codec/xml/AbstractXmlCodec.java | 6 +-- .../yang/data/codec/xml/BooleanXmlCodec.java | 4 +- .../yang/data/codec/xml/EmptyXmlCodec.java | 8 +-- .../data/codec/xml/IdentityrefXmlCodec.java | 26 ++++------ .../yang/data/codec/xml/NullXmlCodec.java | 15 +++--- .../yang/data/codec/xml/NumberXmlCodec.java | 4 +- .../yang/data/codec/xml/QuotedXmlCodec.java | 10 +--- .../yang/data/codec/xml/UnionXmlCodec.java | 24 ++++----- .../yang/data/codec/xml/XmlCodec.java | 14 ++---- .../yang/data/codec/xml/XmlParserStream.java | 2 +- .../xml/XmlStringInstanceIdentifierCodec.java | 14 +++--- .../data/util/codec/AbstractCodecFactory.java | 2 +- .../yang/data/util/codec/TypeAwareCodec.java | 49 +++++++++++++++++++ 25 files changed, 165 insertions(+), 170 deletions(-) create mode 100644 yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/TypeAwareCodec.java diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/AbstractJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/AbstractJSONCodec.java index 2b1ddd8428..74715cef77 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/AbstractJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/AbstractJSONCodec.java @@ -24,13 +24,13 @@ abstract class AbstractJSONCodec implements JSONCodec { } @Override - public final Class getDataClass() { + public final Class 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) { diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/BooleanJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/BooleanJSONCodec.java index b77db19fc0..13182f0645 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/BooleanJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/BooleanJSONCodec.java @@ -19,14 +19,8 @@ final class BooleanJSONCodec extends AbstractJSONCodec { 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); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/EmptyJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/EmptyJSONCodec.java index 8ed23b050d..2e2e5f9dab 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/EmptyJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/EmptyJSONCodec.java @@ -20,19 +20,19 @@ final class EmptyJSONCodec implements JSONCodec { } @Override - public Void deserializeString(final String input) { - return null; + public Class 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 getDataClass() { - return Void.class; + public void writeValue(final JsonWriter ctx, final Void value) throws IOException { + ctx.beginArray(); + ctx.value((String) null); + ctx.endArray(); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodec.java index 32d10e7572..e32f10846c 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodec.java @@ -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 { +interface JSONCodec extends TypeAwareCodec { /** - * 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 getDataClass(); + @Override + void writeValue(JsonWriter ctx, T value) throws IOException; } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index 0d73512b7a..c1b9c7181a 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -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) codec).serializeToWriter(writer, value); + try { + ((JSONCodec) 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 { diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java index e7de0aa301..c8ecc9e34e 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java @@ -32,23 +32,17 @@ final class JSONStringIdentityrefCodec extends ModuleStringIdentityrefCodec impl } @Override - public Class getDataClass() { + public Class 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)); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java index 11362ffdd2..98f0ec602c 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringInstanceIdentifierCodec.java @@ -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 getDataClass() { + public Class 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)); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java index b326574a7d..a05fb34c19 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java @@ -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() { diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NullJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NullJSONCodec.java index 40c8557ba0..79861b3bab 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NullJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NullJSONCodec.java @@ -21,19 +21,19 @@ final class NullJSONCodec implements JSONCodec { } @Override - public Class getDataClass() { + public Class 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."); } } diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NumberJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NumberJSONCodec.java index 154dcabd93..1e72352012 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NumberJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/NumberJSONCodec.java @@ -21,14 +21,8 @@ final class NumberJSONCodec extends AbstractJSONCodec { 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 diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/QuotedJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/QuotedJSONCodec.java index 356b43798d..6d3a107fd0 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/QuotedJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/QuotedJSONCodec.java @@ -21,14 +21,8 @@ final class QuotedJSONCodec extends AbstractJSONCodec { 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 diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java index 0ef7cda192..741db997ee 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/UnionJSONCodec.java @@ -32,7 +32,7 @@ abstract class UnionJSONCodec implements JSONCodec { } @Override - public Class getDataClass() { + public Class getDataType() { return Object.class; } } @@ -46,7 +46,7 @@ abstract class UnionJSONCodec implements JSONCodec { } @Override - public Class getDataClass() { + public Class getDataType() { return dataClass; } } @@ -63,9 +63,9 @@ abstract class UnionJSONCodec implements JSONCodec { final Iterator> 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 implements JSONCodec { } @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 implements JSONCodec { @SuppressWarnings("unchecked") final JSONCodec objCodec = (JSONCodec) codec; try { - objCodec.serializeToWriter(writer, value); + objCodec.writeValue(ctx, value); return; } catch (RuntimeException e) { LOG.debug("Codec {} failed to serialize {}", codec, value, e); diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java index 78e30d679c..e85628c5da 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/AbstractXmlCodec.java @@ -27,13 +27,13 @@ abstract class AbstractXmlCodec implements XmlCodec { } @Override - public final Class getDataClass() { + public final Class 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) { diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java index 14b1404be6..59e152cb85 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/BooleanXmlCodec.java @@ -18,7 +18,7 @@ final class BooleanXmlCodec extends AbstractXmlCodec { } @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)); } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java index 626626a4e8..c55a14f271 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/EmptyXmlCodec.java @@ -21,17 +21,17 @@ final class EmptyXmlCodec implements XmlCodec { } @Override - public Class getDataClass() { + public Class 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(""); } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java index 21df404f24..fbd99587cd 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/IdentityrefXmlCodec.java @@ -40,32 +40,26 @@ final class IdentityrefXmlCodec extends ModuleStringIdentityrefCodec implements } @Override - public Class getDataClass() { + public Class 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(); } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java index 5abad0bd01..69a7fd503c 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NullXmlCodec.java @@ -22,20 +22,19 @@ final class NullXmlCodec implements XmlCodec { } @Override - public Class getDataClass() { + public Class 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."); + } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java index 161ae8afec..6035bb927a 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/NumberXmlCodec.java @@ -18,7 +18,7 @@ final class NumberXmlCodec extends AbstractXmlCodec { } @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)); } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java index 3d1002661b..720728bb4f 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/QuotedXmlCodec.java @@ -17,14 +17,8 @@ final class QuotedXmlCodec extends AbstractXmlCodec { 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)); } } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java index e244617fae..ec20542160 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java @@ -27,7 +27,7 @@ abstract class UnionXmlCodec implements XmlCodec { } @Override - public Class getDataClass() { + public Class getDataType() { return Object.class; } } @@ -41,7 +41,7 @@ abstract class UnionXmlCodec implements XmlCodec { } @Override - public Class getDataClass() { + public Class getDataType() { return dataClass; } } @@ -58,9 +58,9 @@ abstract class UnionXmlCodec implements XmlCodec { final Iterator> 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 implements XmlCodec { } @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 implements XmlCodec { @SuppressWarnings("unchecked") final XmlCodec objCodec = (XmlCodec) codec; try { - objCodec.serializeToWriter(writer, value); + objCodec.writeValue(ctx, value); return; } catch (RuntimeException e) { LOG.debug("Codec {} failed to serialize {}", codec, value, e); diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java index 93ee13e782..bebb5ca979 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlCodec.java @@ -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 { - Class getDataClass(); - - T deserializeFromString(NamespaceContext namespaceContext, String value); - +interface XmlCodec extends TypeAwareCodec { /** - * 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; } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java index c6d11a1ce1..f6baedecab 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java @@ -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) { diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java index 292078f458..044a550add 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStringInstanceIdentifierCodec.java @@ -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 getDataClass() { + public Class 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() { diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java index fa65a7f871..a1caa6b3b0 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/AbstractCodecFactory.java @@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory; * @param Codec type */ @ThreadSafe -public abstract class AbstractCodecFactory { +public abstract class AbstractCodecFactory> { private static final Logger LOG = LoggerFactory.getLogger(AbstractCodecFactory.class); private final CodecCache 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 index 0000000000..d72b42b6f4 --- /dev/null +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/codec/TypeAwareCodec.java @@ -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 Data value type + * @param Input context type + * @param Output context type + */ +@Beta +public interface TypeAwareCodec { + /** + * Return the data type class. + * + * @return Data type class + */ + Class 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; +} -- 2.36.6