From: Tom Pantelis Date: Wed, 26 Oct 2016 19:05:20 +0000 (-0400) Subject: Move SerializationUtils to sal-clustering-commons X-Git-Tag: release/carbon~415 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=0ed60f58d8a8d73544df74f5bb4f93c13cd3ca7d Move SerializationUtils to sal-clustering-commons Moved the SerializationUtils class from saldistributed-datastore to sal-clustering-commons for re-use (will be used in sal-remoterpc-connector). Change-Id: I0f1775152ffd2badd5468c5b6321e3274b319736 Signed-off-by: Tom Pantelis --- diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java new file mode 100644 index 0000000000..fc0497280c --- /dev/null +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2014 Brocade Communications Systems, Inc. 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.controller.cluster.datastore.node.utils.stream; + +import com.google.common.base.Preconditions; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +/** + * Provides various utility methods for serialization and de-serialization. + * + * @author Thomas Pantelis + */ +public final class SerializationUtils { + public static final ThreadLocal REUSABLE_WRITER_TL = new ThreadLocal<>(); + public static final ThreadLocal REUSABLE_READER_TL = new ThreadLocal<>(); + + public interface Applier { + void apply(T instance, YangInstanceIdentifier path, NormalizedNode node); + } + + private static NormalizedNodeDataOutput streamWriter(DataOutput out) throws IOException { + NormalizedNodeDataOutput streamWriter = REUSABLE_WRITER_TL.get(); + if (streamWriter == null) { + streamWriter = NormalizedNodeInputOutput.newDataOutput(out); + } + + return streamWriter; + } + + private static NormalizedNodeDataInput streamReader(DataInput in) throws IOException { + NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get(); + if (streamReader == null) { + streamReader = NormalizedNodeInputOutput.newDataInput(in); + } + + return streamReader; + } + + public static void serializePathAndNode(YangInstanceIdentifier path, NormalizedNode node, + DataOutput out) { + Preconditions.checkNotNull(path); + Preconditions.checkNotNull(node); + try { + NormalizedNodeDataOutput streamWriter = streamWriter(out); + streamWriter.writeNormalizedNode(node); + streamWriter.writeYangInstanceIdentifier(path); + } catch (IOException e) { + throw new IllegalArgumentException(String.format("Error serializing path %s and Node %s", + path, node), e); + } + } + + public static void deserializePathAndNode(DataInput in, T instance, Applier applier) { + try { + NormalizedNodeDataInput streamReader = streamReader(in); + NormalizedNode node = streamReader.readNormalizedNode(); + YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); + applier.apply(instance, path, node); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing path and Node", e); + } + } + + private static NormalizedNode tryDeserializeNormalizedNode(DataInput in) throws IOException { + boolean present = in.readBoolean(); + if (present) { + NormalizedNodeDataInput streamReader = streamReader(in); + return streamReader.readNormalizedNode(); + } + + return null; + } + + public static NormalizedNode deserializeNormalizedNode(DataInput in) { + try { + return tryDeserializeNormalizedNode(in); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + } + } + + public static NormalizedNode deserializeNormalizedNode(byte [] bytes) { + try { + return tryDeserializeNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes))); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing NormalizedNode", e); + } + } + + public static void serializeNormalizedNode(NormalizedNode node, DataOutput out) { + try { + out.writeBoolean(node != null); + if (node != null) { + NormalizedNodeDataOutput streamWriter = streamWriter(out); + streamWriter.writeNormalizedNode(node); + } + } catch (IOException e) { + throw new IllegalArgumentException(String.format("Error serializing NormalizedNode %s", + node), e); + } + } + + public static byte [] serializeNormalizedNode(NormalizedNode node) { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + serializeNormalizedNode(node, new DataOutputStream(bos)); + return bos.toByteArray(); + } + + public static void serializePath(YangInstanceIdentifier path, DataOutput out) { + Preconditions.checkNotNull(path); + try { + NormalizedNodeDataOutput streamWriter = streamWriter(out); + streamWriter.writeYangInstanceIdentifier(path); + } catch (IOException e) { + throw new IllegalArgumentException(String.format("Error serializing path %s", path), e); + } + } + + public static YangInstanceIdentifier deserializePath(DataInput in) { + try { + NormalizedNodeDataInput streamReader = streamReader(in); + return streamReader.readYangInstanceIdentifier(); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing path", e); + } + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java index e73b5af7cd..b2eaa9de54 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java @@ -13,7 +13,7 @@ import com.google.common.util.concurrent.SettableFuture; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java index fad6abb5c1..eda5c26280 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java @@ -11,7 +11,7 @@ package org.opendaylight.controller.cluster.datastore.messages; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class ReadDataReply extends VersionedExternalizableMessage { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java index 1f457780e5..2741ca0b1d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java @@ -13,7 +13,7 @@ import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; /** diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java index a069d6c5c4..d10276b3ea 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java index 163e23d2d1..6372b21bef 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java @@ -18,7 +18,7 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.messages.VersionedExternalizableMessage; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java index cbc25d71c3..62db4bf258 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java @@ -12,8 +12,8 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import org.opendaylight.controller.cluster.datastore.DataStoreVersions; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils.Applier; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils.Applier; import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java index 36a82e543e..985314c4d0 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java @@ -18,7 +18,7 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.Serializable; import java.util.Map; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/PreBoronShardDataTreeSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/PreBoronShardDataTreeSnapshot.java index cd0bd65d7b..3aca7f2314 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/PreBoronShardDataTreeSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/PreBoronShardDataTreeSnapshot.java @@ -10,7 +10,7 @@ package org.opendaylight.controller.cluster.datastore.persisted; import com.google.common.annotations.Beta; import java.util.Optional; import javax.annotation.Nullable; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; /** diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardDataTreeSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardDataTreeSnapshot.java index ef901019a5..6cb047fc37 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardDataTreeSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/ShardDataTreeSnapshot.java @@ -14,7 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Optional; import javax.annotation.Nonnull; -import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java index 9ed9e9a88f..2e3cfd0e3a 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/utils/SerializationUtils.java @@ -18,7 +18,6 @@ import java.io.IOException; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataInput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataOutput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput; -import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -26,7 +25,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; * Provides various utility methods for serialization and de-serialization. * * @author Thomas Pantelis + * @deprecated use {@link org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils} instead */ +@Deprecated public final class SerializationUtils { public static final ThreadLocal REUSABLE_WRITER_TL = new ThreadLocal<>(); public static final ThreadLocal REUSABLE_READER_TL = new ThreadLocal<>(); @@ -47,7 +48,7 @@ public final class SerializationUtils { private static NormalizedNodeDataInput streamReader(DataInput in) throws IOException { NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get(); if (streamReader == null) { - streamReader = new NormalizedNodeInputStreamReader(in); + streamReader = NormalizedNodeInputOutput.newDataInput(in); } return streamReader;