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.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 {
+@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 AdapterContext adapterContext,
- final DataTreeChangeListener<T> listener, final LogicalDatastoreType store) {
+ private boolean initialSyncDone;
+
+ 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 List<DataTreeCandidate> domChanges) {
- listener.onDataTreeChanged(LazyDataTreeModification.from(adapterContext.currentSerializer(), domChanges,
- store));
+ 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();
}
}