2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.adapter;
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;
25 * An implementation of {@link Publisher} backed by a {@link DOMInstanceNotificationPublishService}.
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;
31 PublisherAdapter(final AdapterContext adapterContext, final DOMInstanceNotificationPublishService domPublishService,
32 final InstanceNotificationSpec<?, ?> spec) {
33 super(adapterContext, domPublishService);
34 notificationPath = currentSerializer().getNotificationPath(spec);
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));
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)));
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));
59 private static @NonNull ListenableFuture<? extends Object> toBindingResult(
60 final @NonNull ListenableFuture<? extends Object> domResult) {
61 return DOMInstanceNotificationPublishService.REJECTED.equals(domResult) ? REJECTED : domResult;
64 private static @NonNull DOMDataTreeIdentifier toDomPath(final CurrentAdapterSerializer serializer,
65 final InstanceIdentifier<?> path) {
66 return new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, serializer.toYangInstanceIdentifier(path));
69 private @NonNull DOMNotification toDomNotification(final CurrentAdapterSerializer serializer,
70 final InstanceNotification<?, ?> notification) {
71 return new LazySerializedInstanceNotification(serializer, notificationPath, notification);