Create YangInstanceIdentifier serialized form 65/81265/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Mar 2019 16:21:53 +0000 (17:21 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Mar 2019 18:59:18 +0000 (19:59 +0100)
We will need to evolve YangInstanceIdentifier and PathArgument, but
they are bound to their serialized form. Add Externalizable proxies
so we can move them in the future somewhere else.

JIRA: YANGTOOLS-979
Change-Id: I6823c55c2cbd1abe9e05945a4fbb2de411fe0792
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AIv1.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIPv1.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIVv1.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIv1.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YIDv1.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java

diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AIv1.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AIv1.java
new file mode 100644 (file)
index 0000000..939599c
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableSet;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
+
+/**
+ * Externalizable proxy for {@link AugmentationIdentifier}.
+ */
+final class AIv1 implements Externalizable {
+    private static final long serialVersionUID = 1L;
+
+    private AugmentationIdentifier ai;
+
+    @SuppressWarnings("checkstyle:redundantModifier")
+    public AIv1() {
+        // For Externalizable
+    }
+
+    AIv1(final AugmentationIdentifier ai) {
+        this.ai = requireNonNull(ai);
+    }
+
+    @Override
+    public void writeExternal(final ObjectOutput out) throws IOException {
+        out.writeInt(ai.getPossibleChildNames().size());
+        for (QName qname : ai.getPossibleChildNames()) {
+            qname.writeTo(out);
+        }
+    }
+
+    @Override
+    public void readExternal(final ObjectInput in) throws IOException {
+        final int count = in.readInt();
+        final QName[] qnames = new QName[count];
+        for (int i = 0; i < count; ++i) {
+            qnames[i] = QName.readFrom(in);
+        }
+        ai = new AugmentationIdentifier(ImmutableSet.copyOf(qnames));
+    }
+
+    private Object readResolve() {
+        return ai;
+    }
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIPv1.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIPv1.java
new file mode 100644 (file)
index 0000000..93bf418
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+
+/**
+ * Externalizable proxy for {@link NodeIdentifierWithPredicates}.
+ */
+final class NIPv1 implements Externalizable {
+    private static final long serialVersionUID = 1L;
+
+    private NodeIdentifierWithPredicates nip;
+
+    @SuppressWarnings("checkstyle:redundantModifier")
+    public NIPv1() {
+        // For Externalizable
+    }
+
+    NIPv1(final NodeIdentifierWithPredicates nid) {
+        this.nip = requireNonNull(nid);
+    }
+
+    @Override
+    public void writeExternal(final ObjectOutput out) throws IOException {
+        nip.getNodeType().writeTo(out);
+        out.writeObject(nip.getKeyValues());
+    }
+
+    @Override
+    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+        final QName qname = QName.readFrom(in);
+        nip = new NodeIdentifierWithPredicates((Map<QName, Object>) in.readObject(), qname);
+    }
+
+    private Object readResolve() {
+        return nip;
+    }
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIVv1.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIVv1.java
new file mode 100644 (file)
index 0000000..a79adee
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+
+/**
+ * Externalizable proxy for {@link NodeWithValue}.
+ */
+final class NIVv1 implements Externalizable {
+    private static final long serialVersionUID = 1L;
+
+    private NodeWithValue<?> niv;
+
+    @SuppressWarnings("checkstyle:redundantModifier")
+    public NIVv1() {
+        // For Externalizable
+    }
+
+    NIVv1(final NodeWithValue<?> niv) {
+        this.niv = requireNonNull(niv);
+    }
+
+    @Override
+    public void writeExternal(final ObjectOutput out) throws IOException {
+        niv.getNodeType().writeTo(out);
+        out.writeObject(niv.getValue());
+    }
+
+    @Override
+    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+        niv = new NodeWithValue<>(QName.readFrom(in), in.readObject());
+    }
+
+    private Object readResolve() {
+        return niv;
+    }
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIv1.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIv1.java
new file mode 100644 (file)
index 0000000..bc58788
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+
+/**
+ * Externalizable proxy for {@link NodeIdentifier}.
+ */
+final class NIv1 implements Externalizable {
+    private static final long serialVersionUID = 1L;
+
+    private NodeIdentifier nid;
+
+    @SuppressWarnings("checkstyle:redundantModifier")
+    public NIv1() {
+        // For Externalizable
+    }
+
+    NIv1(final NodeIdentifier nid) {
+        this.nid = requireNonNull(nid);
+    }
+
+    @Override
+    public void writeExternal(final ObjectOutput out) throws IOException {
+        nid.getNodeType().writeTo(out);
+    }
+
+    @Override
+    public void readExternal(final ObjectInput in) throws IOException {
+        nid = new NodeIdentifier(QName.readFrom(in));
+    }
+
+    private Object readResolve() {
+        return nid;
+    }
+}
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YIDv1.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YIDv1.java
new file mode 100644 (file)
index 0000000..58d914d
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.List;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+
+/**
+ * Externalizable proxy for {@link YangInstanceIdentifier}.
+ */
+final class YIDv1 implements Externalizable {
+    private static final long serialVersionUID = 1L;
+
+    private YangInstanceIdentifier yid;
+
+    @SuppressWarnings("checkstyle:redundantModifier")
+    public YIDv1() {
+        // For Externalizable
+    }
+
+    YIDv1(final YangInstanceIdentifier yid) {
+        this.yid = requireNonNull(yid);
+    }
+
+    @Override
+    public void writeExternal(final ObjectOutput out) throws IOException {
+        final List<PathArgument> args = yid.getPathArguments();
+        out.writeInt(args.size());
+        for (PathArgument arg : args) {
+            // Unfortunately PathArgument is an interface and we do not have control over all its implementations,
+            // hence we did not bother with making them WritableObjects. This works reasonably well, though.
+            out.writeObject(arg);
+        }
+    }
+
+    @Override
+    public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+        final int size = in.readInt();
+        final Builder<PathArgument> builder = ImmutableList.builderWithExpectedSize(size);
+        for (int i = 0; i < size; ++i) {
+            builder.add((PathArgument) in.readObject());
+        }
+        yid = YangInstanceIdentifier.create(builder.build());
+    }
+
+    private Object readResolve() {
+        return yid;
+    }
+}
index ead969fffc39f093af5e23e390de3694e1cf476d..75a8208f74bad0eb06701d93c14d3e90bd6aad01 100644 (file)
@@ -385,6 +385,10 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         return Objects.hashCode(value);
     }
 
+    final Object writeReplace() {
+        return new YIDv1(this);
+    }
+
     // Static factories & helpers
 
     /**
@@ -527,6 +531,8 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
 
             return getNodeType().toString();
         }
+
+        abstract Object writeReplace();
     }
 
     /**
@@ -557,6 +563,11 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         public static NodeIdentifier create(final QName node) {
             return CACHE.getUnchecked(node);
         }
+
+        @Override
+        Object writeReplace() {
+            return new NIv1(this);
+        }
     }
 
     /**
@@ -568,6 +579,12 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
 
         private final Map<QName, Object> keyValues;
 
+        // Exposed for NIPv1
+        NodeIdentifierWithPredicates(final Map<QName, Object> keyValues, final QName node) {
+            super(node);
+            this.keyValues = requireNonNull(keyValues);
+        }
+
         public NodeIdentifierWithPredicates(final QName node) {
             super(node);
             this.keyValues = ImmutableMap.of();
@@ -580,13 +597,11 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         }
 
         public NodeIdentifierWithPredicates(final QName node, final ImmutableOffsetMap<QName, Object> keyValues) {
-            super(node);
-            this.keyValues = requireNonNull(keyValues);
+            this(keyValues, node);
         }
 
         public NodeIdentifierWithPredicates(final QName node, final SharedSingletonMap<QName, Object> keyValues) {
-            super(node);
-            this.keyValues = requireNonNull(keyValues);
+            this(keyValues, node);
         }
 
         public NodeIdentifierWithPredicates(final QName node, final QName key, final Object value) {
@@ -646,6 +661,11 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         public String toRelativeString(final PathArgument previous) {
             return super.toRelativeString(previous) + '[' + keyValues + ']';
         }
+
+        @Override
+        Object writeReplace() {
+            return new NIPv1(this);
+        }
     }
 
     /**
@@ -693,6 +713,11 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
         public String toRelativeString(final PathArgument previous) {
             return super.toRelativeString(previous) + '[' + value + ']';
         }
+
+        @Override
+        Object writeReplace() {
+            return new NIVv1(this);
+        }
     }
 
     /**
@@ -797,6 +822,10 @@ public abstract class YangInstanceIdentifier implements Path<YangInstanceIdentif
                 return -1;
             }
         }
+
+        private Object writeReplace() {
+            return new AIv1(this);
+        }
     }
 
     /**