Rename DOMDataTreeChangeService
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMDataTreeChangeServiceAdapter.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.dom.adapter;
9
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.DOMDataBroker.DataTreeChangeExtension;
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;
22
23 /**
24  * Adapter exposing Binding {@link DataTreeChangeService} and wrapping a {@link DataTreeChangeExtension} and is
25  * responsible for translation and instantiation of {@link BindingDOMDataTreeChangeListenerAdapter} adapters.
26  *
27  * <p>
28  * Each registered {@link DataTreeChangeListener} is wrapped using adapter and registered directly to DOM service.
29  */
30 final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapter<DataTreeChangeExtension>
31         implements DataTreeChangeService {
32     BindingDOMDataTreeChangeServiceAdapter(final AdapterContext adapterContext,
33             final DataTreeChangeExtension dataTreeChangeExtension) {
34         super(adapterContext, dataTreeChangeExtension);
35     }
36
37     @Override
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;
44
45         final var domListener = listener instanceof ClusteredDataTreeChangeListener
46             ? new BindingClusteredDOMDataTreeChangeListenerAdapter<>(adapterContext(),
47                 (ClusteredDataTreeChangeListener<T>) listener, storeType, augment)
48                 : new BindingDOMDataTreeChangeListenerAdapter<>(adapterContext(), listener, storeType, augment);
49
50         return getDelegate().registerDataTreeChangeListener(domIdentifier, domListener);
51     }
52
53     @Override
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));
58     }
59
60     @Override
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));
65     }
66
67     private @NonNull DOMDataTreeIdentifier toDomTreeIdentifier(final DataTreeIdentifier<?> treeId) {
68         return DOMDataTreeIdentifier.of(treeId.datastore(),
69             currentSerializer().toYangInstanceIdentifier(treeId.path()));
70     }
71
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);
76         }
77         return toDomTreeIdentifier(treeId);
78     }
79 }