2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.mdsal.binding.dom.codec.api;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableSet;
15 import java.time.Instant;
16 import java.util.Map.Entry;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
20 import org.opendaylight.yangtools.yang.binding.Action;
21 import org.opendaylight.yangtools.yang.binding.Augmentation;
22 import org.opendaylight.yangtools.yang.binding.BaseNotification;
23 import org.opendaylight.yangtools.yang.binding.DataContainer;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.opendaylight.yangtools.yang.binding.Notification;
27 import org.opendaylight.yangtools.yang.binding.RpcInput;
28 import org.opendaylight.yangtools.yang.binding.RpcOutput;
29 import org.opendaylight.yangtools.yang.common.YangConstants;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
31 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
32 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
34 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
38 * Serialization service, which provides two-way serialization between Java Binding Data representation and
39 * NormalizedNode representation.
41 public interface BindingNormalizedNodeSerializer {
43 * Result of a {@link BindingNormalizedNodeSerializer#toNormalizedNode(InstanceIdentifier, DataObject)}. Since the
44 * Binding {@link Augmentation} does not have an exact equivalent, there are two specializations of this class:
45 * {@link NodeResult} and {@link AugmentationResult}.
47 sealed interface NormalizedResult {
49 * Return the {@link YangInstanceIdentifier} path of this result.
51 * @return A {@link YangInstanceIdentifier}
53 @NonNull YangInstanceIdentifier path();
57 * A {@link NormalizedResult} for an {@link Augmentation}.
59 * @param path A YangInstanceIdentifier identifying the parent of this augmentation
60 * @param possibleChildren {@link NodeIdentifier}s of each possible child
61 * @param children Augmentation children
63 record AugmentationResult(
64 @NonNull YangInstanceIdentifier path,
65 @NonNull ImmutableSet<NodeIdentifier> possibleChildren,
66 @NonNull ImmutableList<DataContainerChild> children) implements NormalizedResult {
67 public AugmentationResult {
69 requireNonNull(possibleChildren);
70 requireNonNull(children);
74 record NodeResult(@NonNull YangInstanceIdentifier path, @NonNull NormalizedNode node) implements NormalizedResult {
82 * Translates supplied Binding Instance Identifier into NormalizedNode instance identifier.
84 * @param binding Binding Instance Identifier
85 * @return DOM Instance Identifier
86 * @throws IllegalArgumentException If supplied Instance Identifier is not valid.
88 // FIXME: MDSAL-525: reconcile this with BindingInstanceIdentifierCodec
89 @NonNull YangInstanceIdentifier toYangInstanceIdentifier(@NonNull InstanceIdentifier<?> binding);
92 * Translates supplied YANG Instance Identifier into Binding instance identifier.
94 * @param dom YANG Instance Identifier
95 * @return Binding Instance Identifier, or null if the instance identifier is not representable.
97 // FIXME: MDSAL-525: reconcile this with BindingInstanceIdentifierCodec
98 <T extends DataObject> @Nullable InstanceIdentifier<T> fromYangInstanceIdentifier(
99 @NonNull YangInstanceIdentifier dom);
102 * Translates supplied Binding Instance Identifier and data into NormalizedNode representation.
104 * @param path Binding Instance Identifier pointing to data
105 * @param data Data object representing data
106 * @return {@link NormalizedResult} representation
107 * @throws IllegalArgumentException If supplied Instance Identifier is not valid.
109 <T extends DataObject> @NonNull NormalizedResult toNormalizedNode(InstanceIdentifier<T> path, T data);
112 * Translates supplied Binding Instance Identifier and data into NormalizedNode representation.
114 * @param path Binding Instance Identifier pointing to data
115 * @param data Data object representing data
116 * @return {@link NormalizedResult} representation
117 * @throws IllegalArgumentException If supplied Instance Identifier is not valid.
119 <A extends Augmentation<?>> @NonNull AugmentationResult toNormalizedAugmentation(InstanceIdentifier<A> path,
123 * Translates supplied Binding Instance Identifier and data into NormalizedNode representation.
125 * @param path Binding Instance Identifier pointing to data
126 * @param data Data object representing data
127 * @return {@link NormalizedResult} representation
128 * @throws IllegalArgumentException If supplied Instance Identifier is not valid.
130 <T extends DataObject> @NonNull NodeResult toNormalizedDataObject(InstanceIdentifier<T> path, T data);
133 * Translates supplied YANG Instance Identifier and NormalizedNode into Binding data.
135 * @param path Binding Instance Identifier
136 * @param data NormalizedNode representing data
137 * @return DOM Instance Identifier
139 @Nullable Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(@NonNull YangInstanceIdentifier path,
140 NormalizedNode data);
143 * Translates supplied NormalizedNode Notification into Binding data.
145 * @param path Schema Path of Notification, schema path is absolute, and consists of Notification QName.
146 * @param data NormalizedNode representing data
147 * @return Binding representation of Notification
149 @NonNull BaseNotification fromNormalizedNodeNotification(@NonNull Absolute path, @NonNull ContainerNode data);
152 * Translates supplied NormalizedNode Notification into Binding data, optionally taking an instant
153 * when the notification was generated.
155 * @param path Schema Path of Notification, schema path is absolute, and consists of Notification QName.
156 * @param data NormalizedNode representing data
157 * @param eventInstant optional instant when the event was generated
158 * @return Binding representation of Notification
161 @NonNull BaseNotification fromNormalizedNodeNotification(@NonNull Absolute path, @NonNull ContainerNode data,
162 @Nullable Instant eventInstant);
165 * Translates supplied NormalizedNode RPC input or output into Binding data.
167 * @param containerPath Container path (RPC type + input/output)
168 * @param data NormalizedNode representing data
169 * @return Binding representation of RPC data
171 @Nullable DataObject fromNormalizedNodeRpcData(@NonNull Absolute containerPath, @NonNull ContainerNode data);
174 * Translates supplied ContainerNode action input.
176 * @param action Binding action class
177 * @param input ContainerNode representing data
178 * @return Binding representation of action input
179 * @throws NullPointerException if any of the arguments is null
182 <T extends RpcInput> @NonNull T fromNormalizedNodeActionInput(
183 @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull ContainerNode input);
186 * Translates supplied ContainerNode action output.
188 * @param action Binding action class
189 * @param output ContainerNode representing data
190 * @return Binding representation of action output
191 * @throws NullPointerException if any of the arguments is null
194 <T extends RpcOutput> @NonNull T fromNormalizedNodeActionOutput(
195 @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull ContainerNode output);
198 * Translates supplied Binding Notification or output into NormalizedNode notification.
200 * @param data {@link Notification} representing notification data
201 * @return NormalizedNode representation of notification
203 @NonNull ContainerNode toNormalizedNodeNotification(@NonNull Notification<?> data);
206 * Translates supplied Binding Notification or output into NormalizedNode notification.
208 * @param path schema node identifier of the notification
209 * @param data {@link BaseNotification} representing notification data
210 * @return NormalizedNode representation of notification
212 @NonNull ContainerNode toNormalizedNodeNotification(@NonNull Absolute path, @NonNull BaseNotification data);
215 * Translates supplied Binding RPC input or output into NormalizedNode data.
217 * @param data NormalizedNode representing rpc data
218 * @return NormalizedNode representation of rpc data
220 @NonNull ContainerNode toNormalizedNodeRpcData(@NonNull DataContainer data);
223 * Lazily translates supplied Binding action input into NormalizedNode data.
225 * @param action Binding action class
226 * @param input Binding action input
227 * @return NormalizedNode representation of action input
228 * @throws NullPointerException if any of the arguments is null
231 @NonNull BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
232 @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull NodeIdentifier identifier,
233 @NonNull RpcInput input);
236 * Lazily translates supplied Binding action input into NormalizedNode data.
238 * @param action Binding action class
239 * @param input Binding action input
240 * @return NormalizedNode representation of action input
241 * @throws NullPointerException if any of the arguments is null
243 @Beta default @NonNull BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
244 @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcInput input) {
245 return toLazyNormalizedNodeActionInput(action,
246 new NodeIdentifier(YangConstants.operationInputQName(BindingReflections.getQNameModule(action))), input);
250 * Translates supplied Binding action input into NormalizedNode data.
252 * @param action Binding action class
253 * @param input Binding action input
254 * @return NormalizedNode representation of action input
255 * @throws NullPointerException if any of the arguments is null
257 @Beta default @NonNull ContainerNode toNormalizedNodeActionInput(
258 @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcInput input) {
259 return toLazyNormalizedNodeActionInput(action,
260 new NodeIdentifier(YangConstants.operationInputQName(BindingReflections.getQNameModule(action))), input)
265 * Lazily translates supplied Binding action output into NormalizedNode data.
267 * @param action Binding action class
268 * @param output Binding action output
269 * @return NormalizedNode representation of action output
272 @NonNull BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
273 @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull NodeIdentifier identifier,
274 @NonNull RpcOutput output);
277 * Lazily translates supplied Binding action output into NormalizedNode data.
279 * @param action Binding action class
280 * @param output Binding action output
281 * @return NormalizedNode representation of action output
283 @Beta default @NonNull BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
284 @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcOutput output) {
285 return toLazyNormalizedNodeActionOutput(action,
286 new NodeIdentifier(YangConstants.operationOutputQName(BindingReflections.getQNameModule(action))), output);
290 * Translates supplied Binding action output into NormalizedNode data.
292 * @param output Binding action output
293 * @return NormalizedNode representation of action output
295 @Beta default @NonNull ContainerNode toNormalizedNodeActionOutput(
296 @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcOutput output) {
297 return toLazyNormalizedNodeActionOutput(action,
298 new NodeIdentifier(YangConstants.operationOutputQName(BindingReflections.getQNameModule(action))), output)