Extra route fixes
[vpnservice.git] / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / vpnservice / AbstractDataChangeListener.java
1 /*
2  * Copyright (c) 2015 - 2016 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 package org.opendaylight.vpnservice;
9
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
14 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
15 import org.opendaylight.yangtools.yang.binding.DataObject;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
17 import org.slf4j.Logger;
18 import org.slf4j.LoggerFactory;
19
20 import java.util.Collections;
21 import java.util.Map;
22 import java.util.Set;
23
24 /**
25  * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for
26  * VPN related Data Objects.
27  */
28 public abstract class AbstractDataChangeListener<T extends DataObject> implements DataChangeListener {
29
30     protected final Class<T> clazz;
31
32     private static final Logger LOG = LoggerFactory.getLogger(AbstractDataChangeListener.class);
33     /**
34      * 
35      * @param clazz - for which the data change event is received
36      */
37     public AbstractDataChangeListener(Class<T> clazz) {
38         this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
39     }
40
41     @Override
42     public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
43         try {
44         Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");
45
46         /* All DataObjects for create */
47         final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null
48                 ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
49         /* All DataObjects for remove */
50         final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null
51                 ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>>emptySet();
52         /* All DataObjects for updates */
53         final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null
54                 ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
55         /* All Original DataObjects */
56         final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null
57                 ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject>emptyMap();
58
59         this.createData(createdData);
60         this.updateData(updateData, originalData);
61         this.removeData(removeData, originalData);
62         
63         } catch (Throwable e) {
64             if (LOG.isTraceEnabled()) {
65                 LOG.trace("failed to handle dcn ", e);
66             }
67         }
68     }
69
70     @SuppressWarnings("unchecked")
71     private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
72         final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null
73                 ? createdData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();
74         for (InstanceIdentifier<?> key : keys) {
75             if (clazz.equals(key.getTargetType())) {
76                 InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);
77                 final Optional<DataObject> value = Optional.of(createdData.get(key));
78                 if (value.isPresent()) {
79                     this.add(createKeyIdent, (T)value.get());
80                 }
81             }
82         }
83     }
84
85     @SuppressWarnings("unchecked")
86     private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
87             final Map<InstanceIdentifier<?>, DataObject> originalData) {
88
89         final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null
90                 ? updateData.keySet() : Collections.<InstanceIdentifier<?>>emptySet();
91         for (InstanceIdentifier<?> key : keys) {
92             if (clazz.equals(key.getTargetType())) {
93                 InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
94                 final Optional<DataObject> value = Optional.of(updateData.get(key));
95                 final Optional<DataObject> original = Optional.of(originalData.get(key));
96                 if (value.isPresent() && original.isPresent()) {
97                     this.update(updateKeyIdent, (T)original.get(), (T)value.get());
98                 }
99             }
100         }
101     }
102
103     @SuppressWarnings("unchecked")
104     private void removeData(final Set<InstanceIdentifier<?>> removeData,
105             final Map<InstanceIdentifier<?>, DataObject> originalData) {
106
107         for (InstanceIdentifier<?> key : removeData) {
108             if (clazz.equals(key.getTargetType())) {
109                 final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
110                 final DataObject removeValue = originalData.get(key);
111                 this.remove(ident, (T)removeValue);
112             }
113         }
114     }
115
116     protected abstract void remove(InstanceIdentifier<T> identifier, T del);
117
118     protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);
119
120     protected abstract void add(InstanceIdentifier<T> identifier, T add);
121
122 }
123
124