38530a71eba10c6ac5230100eb6c16cc6489647b
[vpnservice.git] / vpnmanager-impl / src / main / java / org / opendaylight / vpnservice / AbstractDataChangeListener.java
1 /*\r
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.vpnservice;\r
9 \r
10 import com.google.common.base.Optional;\r
11 import com.google.common.base.Preconditions;\r
12 \r
13 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
14 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
15 import org.opendaylight.yangtools.yang.binding.DataObject;\r
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
17 \r
18 import java.util.Collections;\r
19 import java.util.Map;\r
20 import java.util.Set;\r
21 \r
22 /**\r
23  * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for\r
24  * VPN related Data Objects.\r
25  */\r
26 public abstract class AbstractDataChangeListener <T extends DataObject> implements DataChangeListener {\r
27 \r
28     protected final Class<T> clazz;\r
29 \r
30     public AbstractDataChangeListener(Class<T> clazz) {\r
31         this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");\r
32     }\r
33 \r
34     @Override\r
35     public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {\r
36         Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");\r
37 \r
38         /* All DataObjects for create */\r
39         final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null\r
40                 ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();\r
41         /* All DataObjects for remove */\r
42         final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null\r
43                 ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>> emptySet();\r
44         /* All DataObjects for updates */\r
45         final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null\r
46                 ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();\r
47         /* All Original DataObjects */\r
48         final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null\r
49                 ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();\r
50 \r
51         this.createData(createdData);\r
52         this.updateData(updateData, originalData);\r
53         this.removeData(removeData, originalData);\r
54     }\r
55 \r
56     @SuppressWarnings("unchecked")\r
57     private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {\r
58         final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null\r
59                 ? createdData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();\r
60         for (InstanceIdentifier<?> key : keys) {\r
61             if (clazz.equals(key.getTargetType())) {\r
62                  InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);\r
63                  final Optional<DataObject> value = Optional.of(createdData.get(key));\r
64                  if (value.isPresent()) {\r
65                      this.add(createKeyIdent, (T)value.get());\r
66                  }\r
67             }\r
68         }\r
69     }\r
70 \r
71     @SuppressWarnings("unchecked")\r
72     private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,\r
73             final Map<InstanceIdentifier<?>, DataObject> originalData) {\r
74 \r
75         final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null\r
76                 ? updateData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();\r
77         for (InstanceIdentifier<?> key : keys) {\r
78           if (clazz.equals(key.getTargetType())) {\r
79               InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);\r
80               final Optional<DataObject> value = Optional.of(updateData.get(key));\r
81               final Optional<DataObject> original = Optional.of(originalData.get(key));\r
82               if (value.isPresent() && original.isPresent()) {\r
83                 this.update(updateKeyIdent, (T)original.get(), (T)value.get());\r
84               }\r
85           }\r
86         }\r
87     }\r
88 \r
89     @SuppressWarnings("unchecked")\r
90     private void removeData(final Set<InstanceIdentifier<?>> removeData,\r
91             final Map<InstanceIdentifier<?>, DataObject> originalData) {\r
92 \r
93         for (InstanceIdentifier<?> key : removeData) {\r
94             if (clazz.equals(key.getTargetType())) {\r
95                    final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);\r
96                     final DataObject removeValue = originalData.get(key);\r
97                     this.remove(ident, (T)removeValue);\r
98             }\r
99         }\r
100     }\r
101 \r
102     protected abstract void remove(InstanceIdentifier<T> identifier, T del);\r
103 \r
104     protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);\r
105 \r
106     protected abstract void add(InstanceIdentifier<T> identifier, T add);\r
107 \r
108 }\r
109 \r
110 \r