Bump versions by 0.1.0 for next dev cycle
[vpnservice.git] / bgpmanager / bgpmanager-impl / src / main / java / org / opendaylight / bgpmanager / AbstractDataChangeListener.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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
9 package org.opendaylight.bgpmanager;
10
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13
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
19 import java.util.Collections;
20 import java.util.Map;
21 import java.util.Set;
22
23 /**
24  * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for
25  * VPN related Data Objects.
26  */
27 public abstract class AbstractDataChangeListener <T extends DataObject> implements DataChangeListener {
28
29     protected final Class<T> clazz;
30
31     public AbstractDataChangeListener(Class<T> clazz) {
32         this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
33     }
34
35     @Override
36     public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
37         Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");
38
39         /* All DataObjects for create */
40         final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null
41                 ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
42         /* All DataObjects for remove */
43         final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null
44                 ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>> emptySet();
45         /* All DataObjects for updates */
46         final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null
47                 ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
48         /* All Original DataObjects */
49         final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null
50                 ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
51
52         this.createData(createdData);
53         this.updateData(updateData, originalData);
54         this.removeData(removeData, originalData);
55     }
56
57     @SuppressWarnings("unchecked")
58     private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
59         final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null
60                 ? createdData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
61         for (InstanceIdentifier<?> key : keys) {
62             if (clazz.equals(key.getTargetType())) {
63                  InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);
64                  final Optional<DataObject> value = Optional.of(createdData.get(key));
65                  if (value.isPresent()) {
66                      this.add(createKeyIdent, (T)value.get());
67                  }
68             }
69         }
70     }
71
72     @SuppressWarnings("unchecked")
73     private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
74             final Map<InstanceIdentifier<?>, DataObject> originalData) {
75
76         final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null
77                 ? updateData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
78         for (InstanceIdentifier<?> key : keys) {
79           if (clazz.equals(key.getTargetType())) {
80               InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
81               final Optional<DataObject> value = Optional.of(updateData.get(key));
82               final Optional<DataObject> original = Optional.of(originalData.get(key));
83               if (value.isPresent() && original.isPresent()) {
84                 this.update(updateKeyIdent, (T)original.get(), (T)value.get());
85               }
86           }
87         }
88     }
89
90     @SuppressWarnings("unchecked")
91     private void removeData(final Set<InstanceIdentifier<?>> removeData,
92             final Map<InstanceIdentifier<?>, DataObject> originalData) {
93
94         for (InstanceIdentifier<?> key : removeData) {
95             if (clazz.equals(key.getTargetType())) {
96                    final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
97                     final DataObject removeValue = originalData.get(key);
98                     this.remove(ident, (T)removeValue);
99             }
100         }
101     }
102
103     protected abstract void remove(InstanceIdentifier<T> identifier, T del);
104
105     protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);
106
107     protected abstract void add(InstanceIdentifier<T> identifier, T add);
108
109 }
110
111