Add QNameAwareData{Input,Output} 12/94912/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 31 Jan 2021 20:48:18 +0000 (21:48 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 31 Jan 2021 20:50:14 +0000 (21:50 +0100)
These interfaces codify what the binfmt codec exposes in a way
more consumable by general audiences. This results in better
(and incompatible) enconding of QName-over-binfmt when the driver
is QName.writeTo().

JIRA: YANGTOOLS-1217
Change-Id: Ic3bee51538df1d51b4dd7663316ce6056590c45c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java
yang/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeDataInput.java
yang/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeDataOutput.java

index f70a736217a554bb2271dbcf4b2f507c07746473..41672ca7e1ee09e18d27036e69dbc594803570c0 100644 (file)
@@ -47,6 +47,31 @@ import org.eclipse.jdt.annotation.Nullable;
  * </ul>
  */
 public final class QName extends AbstractQName implements Comparable<QName> {
+    /**
+     * A {@link DataInput} which has an understanding of {@link QName}'s semantics.
+     */
+    @Beta
+    public interface QNameAwareDataInput extends DataInput {
+        /**
+         * Read a {@link QName} from the stream.
+         *
+         * @return A QName
+         * @throws IOException if an I/O error occurs.
+         */
+        @NonNull QName readQName() throws IOException;
+    }
+
+    @Beta
+    public interface QNameAwareDataOutput extends DataOutput {
+        /**
+         * Write a {@link QName} into the stream.
+         *
+         * @param qname A QName
+         * @throws  IOException if an I/O error occurs.
+         */
+        void writeQName(@NonNull QName qname) throws IOException;
+    }
+
     private static final Interner<QName> INTERNER = Interners.newWeakInterner();
     // Note: 5398411242927766414L is used for versions < 3.0.0 without writeReplace
     private static final long serialVersionUID = 1L;
@@ -204,6 +229,10 @@ public final class QName extends AbstractQName implements Comparable<QName> {
      * @throws IOException if I/O error occurs
      */
     public static @NonNull QName readFrom(final DataInput in) throws IOException {
+        if (in instanceof QNameAwareDataInput) {
+            return ((QNameAwareDataInput) in).readQName();
+        }
+
         final QNameModule module = QNameModule.readFrom(in);
         return new QName(module, checkLocalName(in.readUTF()));
     }
@@ -371,8 +400,12 @@ public final class QName extends AbstractQName implements Comparable<QName> {
 
     @Override
     public void writeTo(final DataOutput out) throws IOException {
-        module.writeTo(out);
-        out.writeUTF(getLocalName());
+        if (out instanceof QNameAwareDataOutput) {
+            ((QNameAwareDataOutput) out).writeQName(this);
+        } else {
+            module.writeTo(out);
+            out.writeUTF(getLocalName());
+        }
     }
 
     @Override
index c7c73793f0fe754715157a55dbe7d7c14389f47f..19c447166e31cd9ece12deaf8be4d4ee5eb226d3 100644 (file)
@@ -12,7 +12,7 @@ import java.io.DataInput;
 import java.io.IOException;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QName.QNameAwareDataInput;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -27,7 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
  * and {@link SchemaPath}s.
  */
 @Beta
-public interface NormalizedNodeDataInput extends DataInput {
+public interface NormalizedNodeDataInput extends QNameAwareDataInput {
     /**
      * Interpret current stream position as a NormalizedNode, stream its events into a NormalizedNodeStreamWriter.
      *
@@ -68,8 +68,6 @@ public interface NormalizedNodeDataInput extends DataInput {
 
     YangInstanceIdentifier readYangInstanceIdentifier() throws IOException;
 
-    @NonNull QName readQName() throws IOException;
-
     PathArgument readPathArgument() throws IOException;
 
     @Deprecated(forRemoval = true)
index 30fc0244006f0b199f7532991e20e81b8aa23c04..fb2b68a2b664c73bdecd8ff5140e6a9d2acafc8f 100644 (file)
@@ -8,11 +8,10 @@
 package org.opendaylight.yangtools.yang.data.codec.binfmt;
 
 import com.google.common.annotations.Beta;
-import java.io.DataOutput;
 import java.io.IOException;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QName.QNameAwareDataOutput;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -25,8 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
  */
 @Beta
 @NonNullByDefault
-public interface NormalizedNodeDataOutput extends AutoCloseable, DataOutput {
-    void writeQName(QName qname) throws IOException;
+public interface NormalizedNodeDataOutput extends AutoCloseable, QNameAwareDataOutput {
 
     void writeNormalizedNode(NormalizedNode normalizedNode) throws IOException;