Use yang-data-codec-binfmt
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / stream / SerializationUtils.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.datastore.node.utils.stream;
9
10 import static org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion.MAGNESIUM;
11
12 import java.io.DataInput;
13 import java.io.DataOutput;
14 import java.io.IOException;
15 import java.util.Optional;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
20 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataInput;
21 import org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeDataOutput;
22
23 /**
24  * Provides various utility methods for serialization and de-serialization.
25  *
26  * @author Thomas Pantelis
27  */
28 public final class SerializationUtils {
29     private SerializationUtils() {
30
31     }
32
33     @FunctionalInterface
34     public interface Applier<T> {
35         void apply(T instance, YangInstanceIdentifier path, NormalizedNode<?, ?> node);
36     }
37
38     public static Optional<NormalizedNode<?, ?>> readNormalizedNode(final DataInput in) throws IOException {
39         if (!in.readBoolean()) {
40             return Optional.empty();
41         }
42         return Optional.of(NormalizedNodeDataInput.newDataInput(in).readNormalizedNode());
43     }
44
45     public static void writeNormalizedNode(final DataOutput out, final @Nullable NormalizedNode<?, ?> node)
46             throws IOException {
47         writeNormalizedNode(out, MAGNESIUM, node);
48     }
49
50     public static void writeNormalizedNode(final DataOutput out,
51             final org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion version,
52             final @Nullable NormalizedNode<?, ?> node) throws IOException {
53         if (node != null) {
54             out.writeBoolean(true);
55
56             try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) {
57                 stream.writeNormalizedNode(node);
58             }
59         } else {
60             out.writeBoolean(false);
61         }
62     }
63
64     @Deprecated(forRemoval = true)
65     public static void writeNormalizedNode(final DataOutput out, final NormalizedNodeStreamVersion version,
66             final @Nullable NormalizedNode<?, ?> node) throws IOException {
67         writeNormalizedNode(out, version.toYangtools(), node);
68     }
69
70     public static YangInstanceIdentifier readPath(final DataInput in) throws IOException {
71         return NormalizedNodeDataInput.newDataInput(in).readYangInstanceIdentifier();
72     }
73
74     public static void writePath(final DataOutput out, final @NonNull YangInstanceIdentifier path)
75             throws IOException {
76         writePath(out, MAGNESIUM, path);
77     }
78
79     public static void writePath(final DataOutput out,
80             final org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion version,
81             final @NonNull YangInstanceIdentifier path) throws IOException {
82         try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) {
83             stream.writeYangInstanceIdentifier(path);
84         }
85     }
86
87     @Deprecated(forRemoval = true)
88     public static void writePath(final DataOutput out, final NormalizedNodeStreamVersion version,
89             final @NonNull YangInstanceIdentifier path) throws IOException {
90         writePath(out, version.toYangtools(), path);
91     }
92
93     public static <T> void readNodeAndPath(final DataInput in, final T instance, final Applier<T> applier)
94             throws IOException {
95         final NormalizedNodeDataInput stream = NormalizedNodeDataInput.newDataInput(in);
96         NormalizedNode<?, ?> node = stream.readNormalizedNode();
97         YangInstanceIdentifier path = stream.readYangInstanceIdentifier();
98         applier.apply(instance, path, node);
99     }
100
101     public static void writeNodeAndPath(final DataOutput out,
102             final org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion version,
103             final YangInstanceIdentifier path, final NormalizedNode<?, ?> node) throws IOException {
104         try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) {
105             stream.writeNormalizedNode(node);
106             stream.writeYangInstanceIdentifier(path);
107         }
108     }
109
110     public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path,
111             final NormalizedNode<?, ?> node) throws IOException {
112         writeNodeAndPath(out, MAGNESIUM, path, node);
113     }
114
115     public static <T> void readPathAndNode(final DataInput in, final T instance, final Applier<T> applier)
116             throws IOException {
117         final NormalizedNodeDataInput stream = NormalizedNodeDataInput.newDataInput(in);
118         YangInstanceIdentifier path = stream.readYangInstanceIdentifier();
119         NormalizedNode<?, ?> node = stream.readNormalizedNode();
120         applier.apply(instance, path, node);
121     }
122
123     public static void writePathAndNode(final DataOutput out,
124             final org.opendaylight.yangtools.yang.data.codec.binfmt.NormalizedNodeStreamVersion version,
125             final YangInstanceIdentifier path, final NormalizedNode<?, ?> node) throws IOException {
126         try (NormalizedNodeDataOutput stream = version.newDataOutput(out)) {
127             stream.writeYangInstanceIdentifier(path);
128             stream.writeNormalizedNode(node);
129         }
130     }
131
132     public static void writePathAndNode(final DataOutput out, final YangInstanceIdentifier path,
133             final NormalizedNode<?, ?> node) throws IOException {
134         writePathAndNode(out, MAGNESIUM, path, node);
135     }
136 }