Add InstanceNotification(Publish)ServiceAdapter
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / PublisherAdapter.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.mdsal.binding.dom.adapter;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.concurrent.TimeUnit;
12 import org.eclipse.jdt.annotation.NonNull;
13 import org.opendaylight.mdsal.binding.api.InstanceNotificationPublishService.Publisher;
14 import org.opendaylight.mdsal.binding.api.InstanceNotificationSpec;
15 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
16 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
17 import org.opendaylight.mdsal.dom.api.DOMInstanceNotificationPublishService;
18 import org.opendaylight.mdsal.dom.api.DOMNotification;
19 import org.opendaylight.yangtools.yang.binding.DataObject;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21 import org.opendaylight.yangtools.yang.binding.InstanceNotification;
22 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
23
24 /**
25  * An implementation of {@link Publisher} backed by a {@link DOMInstanceNotificationPublishService}.
26  */
27 final class PublisherAdapter<N extends InstanceNotification<N, P>, P extends DataObject>
28         extends AbstractBindingAdapter<DOMInstanceNotificationPublishService> implements Publisher<N, P> {
29     private final @NonNull Absolute notificationPath;
30
31     PublisherAdapter(final AdapterContext adapterContext, final DOMInstanceNotificationPublishService domPublishService,
32             final InstanceNotificationSpec<?, ?> spec) {
33         super(adapterContext, domPublishService);
34         notificationPath = currentSerializer().getNotificationPath(spec);
35     }
36
37     @Override
38     public void putNotification(final InstanceIdentifier<P> path, final N notification) throws InterruptedException {
39         final var serializer = currentSerializer();
40         getDelegate().putNotification(toDomPath(serializer, path), toDomNotification(serializer, notification));
41     }
42
43     @Override
44     public ListenableFuture<? extends Object> offerNotification(final InstanceIdentifier<P> path,
45             final N notification) {
46         final var serializer = currentSerializer();
47         return toBindingResult(getDelegate().offerNotification(toDomPath(serializer, path),
48             toDomNotification(serializer, notification)));
49     }
50
51     @Override
52     public ListenableFuture<? extends Object> offerNotification(final InstanceIdentifier<P> path, final N notification,
53             final long timeout,  final TimeUnit unit) throws InterruptedException {
54         final var serializer = currentSerializer();
55         return toBindingResult(getDelegate().offerNotification(toDomPath(serializer, path),
56             toDomNotification(serializer, notification), timeout, unit));
57     }
58
59     private static @NonNull ListenableFuture<? extends Object> toBindingResult(
60             final @NonNull ListenableFuture<? extends Object> domResult) {
61         return DOMInstanceNotificationPublishService.REJECTED.equals(domResult) ? REJECTED : domResult;
62     }
63
64     private static @NonNull DOMDataTreeIdentifier toDomPath(final CurrentAdapterSerializer serializer,
65             final InstanceIdentifier<?> path) {
66         return new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, serializer.toYangInstanceIdentifier(path));
67     }
68
69     private @NonNull DOMNotification toDomNotification(final CurrentAdapterSerializer serializer,
70             final InstanceNotification<?, ?> notification) {
71         return new LazySerializedInstanceNotification(serializer, notificationPath, notification);
72     }
73 }