*/
package org.opendaylight.mdsal.binding.dom.adapter;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
+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 com.google.common.base.Preconditions;
-import java.util.Collection;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+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.
*/
+@NonNullByDefault
final class BindingDOMDataTreeChangeListenerAdapter<T extends DataObject> implements DOMDataTreeChangeListener {
-
- private final BindingToNormalizedNodeCodec codec;
+ 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 = Preconditions.checkNotNull(codec);
- this.listener = Preconditions.checkNotNull(listener);
- this.store = Preconditions.checkNotNull(store);
+ 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();
}
}