Deprecate Clustered(DOM)DataTreeChangeListener
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMDataTreeChangeListenerAdapter.java
index c2b11900df050cedaf2f69b5e9db2c73f943513d..f46529d46673433625c02e431ab5a8f054f8c4c9 100644 (file)
@@ -7,38 +7,60 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import com.google.common.base.Preconditions;
-import java.util.Collection;
+import static java.util.Objects.requireNonNull;
+
+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.
- *
+ * 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;
 
-    BindingDOMDataTreeChangeListenerAdapter(final BindingToNormalizedNodeCodec codec,
-            final DataTreeChangeListener<T> listener, final LogicalDatastoreType store) {
-        this.codec = Preconditions.checkNotNull(codec);
-        this.listener = Preconditions.checkNotNull(listener);
-        this.store = Preconditions.checkNotNull(store);
+    private boolean initialSyncDone;
+
+    BindingDOMDataTreeChangeListenerAdapter(final AdapterContext adapterContext, final DataTreeIdentifier<T> treeId,
+            final DataTreeChangeListener<T> listener) {
+        this.adapterContext = requireNonNull(adapterContext);
+        this.listener = requireNonNull(listener);
+        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 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 onDataTreeChanged(final Collection<DataTreeCandidate> domChanges) {
-        final Collection<DataTreeModification<T>> bindingChanges
-                = LazyDataTreeModification.from(codec, domChanges, store);
-        listener.onDataTreeChanged(bindingChanges);
+    public void onInitialData() {
+        initialSyncDone = true;
+        listener.onInitialData();
     }
 }