From 9f4a6257aceb0b81b037984da83189a6055b797f Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 28 Mar 2019 17:21:53 +0100 Subject: [PATCH] Create YangInstanceIdentifier serialized form 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 --- .../yangtools/yang/data/api/AIv1.java | 58 +++++++++++++++++ .../yangtools/yang/data/api/NIPv1.java | 52 ++++++++++++++++ .../yangtools/yang/data/api/NIVv1.java | 50 +++++++++++++++ .../yangtools/yang/data/api/NIv1.java | 49 +++++++++++++++ .../yangtools/yang/data/api/YIDv1.java | 62 +++++++++++++++++++ .../yang/data/api/YangInstanceIdentifier.java | 37 +++++++++-- 6 files changed, 304 insertions(+), 4 deletions(-) create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AIv1.java create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIPv1.java create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIVv1.java create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIv1.java create mode 100644 yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YIDv1.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 index 0000000000..939599cd41 --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/AIv1.java @@ -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 index 0000000000..93bf41823f --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIPv1.java @@ -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) 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 index 0000000000..a79adee339 --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIVv1.java @@ -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 index 0000000000..bc587881db --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/NIv1.java @@ -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 index 0000000000..58d914d419 --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YIDv1.java @@ -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 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 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; + } +} diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java index ead969fffc..75a8208f74 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java @@ -385,6 +385,10 @@ public abstract class YangInstanceIdentifier implements Path keyValues; + // Exposed for NIPv1 + NodeIdentifierWithPredicates(final Map 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 keyValues) { - super(node); - this.keyValues = requireNonNull(keyValues); + this(keyValues, node); } public NodeIdentifierWithPredicates(final QName node, final SharedSingletonMap 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