2 * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. 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.netvirt.vpnmanager;
10 import com.google.common.base.Preconditions;
11 import java.util.Collections;
14 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
15 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
22 * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for
23 * VPN related Data Objects.
25 public abstract class AbstractDataChangeListener<T extends DataObject> implements DataChangeListener {
27 protected final Class<T> clazz;
29 private static final Logger LOG = LoggerFactory.getLogger(AbstractDataChangeListener.class);
32 * Creates an instance.
34 * @param clazz The class for which the data change event is received.
36 public AbstractDataChangeListener(Class<T> clazz) {
37 this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
41 // TODO Clean up the exception handling
42 @SuppressWarnings("checkstyle:IllegalCatch")
43 public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
45 Preconditions.checkNotNull(changeEvent, "Async ChangeEvent can not be null!");
47 /* All DataObjects for create */
48 final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null
49 ? changeEvent.getCreatedData() : Collections.emptyMap();
50 /* All DataObjects for remove */
51 final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null
52 ? changeEvent.getRemovedPaths() : Collections.emptySet();
53 /* All DataObjects for updates */
54 final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null
55 ? changeEvent.getUpdatedData() : Collections.emptyMap();
56 /* All Original DataObjects */
57 final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null
58 ? changeEvent.getOriginalData() : Collections.emptyMap();
60 this.createData(createdData);
61 this.updateData(updateData, originalData);
62 this.removeData(removeData, originalData);
63 } catch (Throwable e) {
64 LOG.error("failed to handle dcn ", e);
68 @SuppressWarnings("unchecked")
69 private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
70 for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : createdData.entrySet()) {
71 InstanceIdentifier<?> key = entry.getKey();
72 if (clazz.equals(key.getTargetType())) {
73 DataObject value = entry.getValue();
75 this.add(key.firstIdentifierOf(clazz), (T) value);
81 @SuppressWarnings("unchecked")
82 private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
83 final Map<InstanceIdentifier<?>, DataObject> originalData) {
84 for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : updateData.entrySet()) {
85 InstanceIdentifier<?> key = entry.getKey();
86 if (clazz.equals(key.getTargetType())) {
87 InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
88 final DataObject value = entry.getValue();
89 final DataObject original = originalData.get(key);
90 if (value != null && original != null) {
91 this.update(updateKeyIdent, (T) original, (T) value);
97 @SuppressWarnings("unchecked")
98 private void removeData(final Set<InstanceIdentifier<?>> removeData,
99 final Map<InstanceIdentifier<?>, DataObject> originalData) {
101 for (InstanceIdentifier<?> key : removeData) {
102 if (clazz.equals(key.getTargetType())) {
103 final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
104 final DataObject removeValue = originalData.get(key);
105 this.remove(ident, (T) removeValue);
110 protected abstract void remove(InstanceIdentifier<T> identifier, T del);
112 protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);
114 protected abstract void add(InstanceIdentifier<T> identifier, T add);