Add InstanceNotification(Publish)ServiceAdapter
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / PublisherAdapter.java
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/PublisherAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/PublisherAdapter.java
new file mode 100644 (file)
index 0000000..dd862f6
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.mdsal.binding.dom.adapter;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.InstanceNotificationPublishService.Publisher;
+import org.opendaylight.mdsal.binding.api.InstanceNotificationSpec;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMInstanceNotificationPublishService;
+import org.opendaylight.mdsal.dom.api.DOMNotification;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceNotification;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+
+/**
+ * An implementation of {@link Publisher} backed by a {@link DOMInstanceNotificationPublishService}.
+ */
+final class PublisherAdapter<N extends InstanceNotification<N, P>, P extends DataObject>
+        extends AbstractBindingAdapter<DOMInstanceNotificationPublishService> implements Publisher<N, P> {
+    private final @NonNull Absolute notificationPath;
+
+    PublisherAdapter(final AdapterContext adapterContext, final DOMInstanceNotificationPublishService domPublishService,
+            final InstanceNotificationSpec<?, ?> spec) {
+        super(adapterContext, domPublishService);
+        notificationPath = currentSerializer().getNotificationPath(spec);
+    }
+
+    @Override
+    public void putNotification(final InstanceIdentifier<P> path, final N notification) throws InterruptedException {
+        final var serializer = currentSerializer();
+        getDelegate().putNotification(toDomPath(serializer, path), toDomNotification(serializer, notification));
+    }
+
+    @Override
+    public ListenableFuture<? extends Object> offerNotification(final InstanceIdentifier<P> path,
+            final N notification) {
+        final var serializer = currentSerializer();
+        return toBindingResult(getDelegate().offerNotification(toDomPath(serializer, path),
+            toDomNotification(serializer, notification)));
+    }
+
+    @Override
+    public ListenableFuture<? extends Object> offerNotification(final InstanceIdentifier<P> path, final N notification,
+            final long timeout,  final TimeUnit unit) throws InterruptedException {
+        final var serializer = currentSerializer();
+        return toBindingResult(getDelegate().offerNotification(toDomPath(serializer, path),
+            toDomNotification(serializer, notification), timeout, unit));
+    }
+
+    private static @NonNull ListenableFuture<? extends Object> toBindingResult(
+            final @NonNull ListenableFuture<? extends Object> domResult) {
+        return DOMInstanceNotificationPublishService.REJECTED.equals(domResult) ? REJECTED : domResult;
+    }
+
+    private static @NonNull DOMDataTreeIdentifier toDomPath(final CurrentAdapterSerializer serializer,
+            final InstanceIdentifier<?> path) {
+        return new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, serializer.toYangInstanceIdentifier(path));
+    }
+
+    private @NonNull DOMNotification toDomNotification(final CurrentAdapterSerializer serializer,
+            final InstanceNotification<?, ?> notification) {
+        return new LazySerializedInstanceNotification(serializer, notificationPath, notification);
+    }
+}