2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.dom.adapter;
10 import org.eclipse.jdt.annotation.NonNull;
11 import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
12 import org.opendaylight.mdsal.binding.api.DataChangeListener;
13 import org.opendaylight.mdsal.binding.api.DataListener;
14 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
15 import org.opendaylight.mdsal.binding.api.DataTreeChangeService;
16 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
17 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
18 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
19 import org.opendaylight.yangtools.concepts.Registration;
20 import org.opendaylight.yangtools.yang.binding.Augmentation;
21 import org.opendaylight.yangtools.yang.binding.DataObject;
24 * Adapter exposing Binding {@link DataTreeChangeService} and wrapping a {@link DOMDataTreeChangeService} and is
25 * responsible for translation and instantiation of {@link BindingDOMDataTreeChangeListenerAdapter} adapters.
28 * Each registered {@link DataTreeChangeListener} is wrapped using adapter and registered directly to DOM service.
30 final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapter<DOMDataTreeChangeService>
31 implements DataTreeChangeService {
32 BindingDOMDataTreeChangeServiceAdapter(final AdapterContext adapterContext,
33 final DOMDataTreeChangeService dataTreeChangeService) {
34 super(adapterContext, dataTreeChangeService);
38 public <T extends DataObject> Registration registerDataTreeChangeListener(final DataTreeIdentifier<T> treeId,
39 final DataTreeChangeListener<T> listener) {
40 final var domIdentifier = toDomTreeIdentifier(treeId);
41 final var storeType = treeId.datastore();
42 final var target = treeId.path().getTargetType();
43 final var augment = Augmentation.class.isAssignableFrom(target) ? target : null;
45 final var domListener = listener instanceof ClusteredDataTreeChangeListener
46 ? new BindingClusteredDOMDataTreeChangeListenerAdapter<>(adapterContext(),
47 (ClusteredDataTreeChangeListener<T>) listener, storeType, augment)
48 : new BindingDOMDataTreeChangeListenerAdapter<>(adapterContext(), listener, storeType, augment);
50 return getDelegate().registerDataTreeChangeListener(domIdentifier, domListener);
54 public <T extends DataObject> Registration registerDataListener(final DataTreeIdentifier<T> treeId,
55 final DataListener<T> listener) {
56 return getDelegate().registerDataTreeChangeListener(toDomTreeInstance(treeId),
57 new BindingDOMDataListenerAdapter<>(adapterContext(), listener));
61 public <T extends DataObject> Registration registerDataChangeListener(final DataTreeIdentifier<T> treeId,
62 final DataChangeListener<T> listener) {
63 return getDelegate().registerDataTreeChangeListener(toDomTreeInstance(treeId),
64 new BindingDOMDataChangeListenerAdapter<>(adapterContext(), listener));
67 private @NonNull DOMDataTreeIdentifier toDomTreeIdentifier(final DataTreeIdentifier<?> treeId) {
68 return DOMDataTreeIdentifier.of(treeId.datastore(),
69 currentSerializer().toYangInstanceIdentifier(treeId.path()));
72 private @NonNull DOMDataTreeIdentifier toDomTreeInstance(final DataTreeIdentifier<?> treeId) {
73 final var instanceIdentifier = treeId.path();
74 if (instanceIdentifier.isWildcarded()) {
75 throw new IllegalArgumentException("Cannot register listener for wildcard " + instanceIdentifier);
77 return toDomTreeIdentifier(treeId);