Deprecate Clustered(DOM)DataTreeChangeListener
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMDataTreeChangeListenerAdapter.java
index 046536511f67b5bbb51e4fcc6f4c748a01f87a44..f46529d46673433625c02e431ab5a8f054f8c4c9 100644 (file)
@@ -9,40 +9,58 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static java.util.Objects.requireNonNull;
 
-import java.util.Collection;
+import java.util.List;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
 
 /**
  * Adapter wrapping Binding {@link DataTreeChangeListener} and exposing it as {@link DOMDataTreeChangeListener}
  * and translated DOM events to their Binding equivalent.
  */
-class BindingDOMDataTreeChangeListenerAdapter<T extends DataObject> implements DOMDataTreeChangeListener {
-
-    private final BindingToNormalizedNodeCodec codec;
+@NonNullByDefault
+final class BindingDOMDataTreeChangeListenerAdapter<T extends DataObject> implements DOMDataTreeChangeListener {
+    private final AdapterContext adapterContext;
     private final DataTreeChangeListener<T> listener;
     private final LogicalDatastoreType store;
+    private final @Nullable Class<? extends Augmentation<?>> augment;
+
+    private boolean initialSyncDone;
 
-    BindingDOMDataTreeChangeListenerAdapter(final BindingToNormalizedNodeCodec codec,
-            final DataTreeChangeListener<T> listener, final LogicalDatastoreType store) {
-        this.codec = requireNonNull(codec);
+    BindingDOMDataTreeChangeListenerAdapter(final AdapterContext adapterContext, final DataTreeIdentifier<T> treeId,
+            final DataTreeChangeListener<T> listener) {
+        this.adapterContext = requireNonNull(adapterContext);
         this.listener = requireNonNull(listener);
-        this.store = requireNonNull(store);
+        store = treeId.datastore();
+        augment = extractAugment(treeId.path().getTargetType());
+    }
+
+    @SuppressWarnings("unchecked")
+    private static @Nullable Class<? extends Augmentation<?>> extractAugment(final Class<?> target) {
+        return Augmentation.class.isAssignableFrom(target)
+            ? (Class<? extends Augmentation<?>>) target.asSubclass(Augmentation.class) : null;
     }
 
     @Override
-    public void onDataTreeChanged(final Collection<DataTreeCandidate> domChanges) {
-        final Collection<DataTreeModification<T>> bindingChanges = LazyDataTreeModification.from(codec, domChanges,
-            store);
-        listener.onDataTreeChanged(bindingChanges);
+    public void onDataTreeChanged(final List<DataTreeCandidate> domChanges) {
+        final var changes = LazyDataTreeModification.<T>from(adapterContext.currentSerializer(), domChanges, store,
+            augment);
+        if (!changes.isEmpty()) {
+            listener.onDataTreeChanged(changes);
+        } else if (!initialSyncDone) {
+            onInitialData();
+        }
     }
 
     @Override
     public void onInitialData() {
+        initialSyncDone = true;
         listener.onInitialData();
     }
 }