BUG-2615: Change project/package names of migrated FRM
[openflowplugin.git] / applications / forwardingrules-manager / src / main / java / org / opendaylight / openflowplugin / applications / frm / impl / AbstractListeningCommiter.java
1 /**
2  * Copyright (c) 2014 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.openflowplugin.applications.frm.impl;
9
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12
13 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
14 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesCommiter;
15 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
17 import org.opendaylight.yangtools.yang.binding.DataObject;
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
19
20 import java.util.Collections;
21 import java.util.Map;
22 import java.util.Set;
23
24 /**
25  * AbstractChangeListner implemented basic {@link AsyncDataChangeEvent} processing for
26  * flow node subDataObject (flows, groups and meters).
27  *
28  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
29  *
30  */
31 public abstract class AbstractListeningCommiter <T extends DataObject> implements ForwardingRulesCommiter<T> {
32
33     protected ForwardingRulesManager provider;
34
35     protected final Class<T> clazz;
36
37     public AbstractListeningCommiter (ForwardingRulesManager provider, Class<T> clazz) {
38         this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
39         this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
40     }
41
42     @Override
43     public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
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
64     /**
65      * Method return wildCardPath for Listener registration
66      * and for identify the correct KeyInstanceIdentifier from data;
67      */
68     protected abstract InstanceIdentifier<T> getWildCardPath();
69
70
71
72     @SuppressWarnings("unchecked")
73     private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
74         final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null
75                 ? createdData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
76         for (InstanceIdentifier<?> key : keys) {
77             if (clazz.equals(key.getTargetType())) {
78                 final InstanceIdentifier<FlowCapableNode> nodeIdent =
79                         key.firstIdentifierOf(FlowCapableNode.class);
80                 if (preConfigurationCheck(nodeIdent)) {
81                     InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);
82                     final Optional<DataObject> value = Optional.of(createdData.get(key));
83                     if (value.isPresent()) {
84                         this.add(createKeyIdent, (T)value.get(), nodeIdent);
85                     }
86                 }
87             }
88         }
89     }
90
91     @SuppressWarnings("unchecked")
92     private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
93             final Map<InstanceIdentifier<?>, DataObject> originalData) {
94
95         final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null
96                 ? updateData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
97         for (InstanceIdentifier<?> key : keys) {
98             if (clazz.equals(key.getTargetType())) {
99                 final InstanceIdentifier<FlowCapableNode> nodeIdent =
100                         key.firstIdentifierOf(FlowCapableNode.class);
101                 if (preConfigurationCheck(nodeIdent)) {
102                     InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
103                     final Optional<DataObject> value = Optional.of(updateData.get(key));
104                     final Optional<DataObject> original = Optional.of(originalData.get(key));
105                     if (value.isPresent() && original.isPresent()) {
106                         this.update(updateKeyIdent, (T)original.get(), (T)value.get(), nodeIdent);
107                     }
108                 }
109             }
110         }
111     }
112
113     @SuppressWarnings("unchecked")
114     private void removeData(final Set<InstanceIdentifier<?>> removeData,
115             final Map<InstanceIdentifier<?>, DataObject> originalData) {
116
117         for (InstanceIdentifier<?> key : removeData) {
118             if (clazz.equals(key.getTargetType())) {
119                 final InstanceIdentifier<FlowCapableNode> nodeIdent =
120                         key.firstIdentifierOf(FlowCapableNode.class);
121                 if (preConfigurationCheck(nodeIdent)) {
122                     final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
123                     final DataObject removeValue = originalData.get(key);
124                     this.remove(ident, (T)removeValue, nodeIdent);
125                 }
126             }
127         }
128     }
129
130     private boolean preConfigurationCheck(final InstanceIdentifier<FlowCapableNode> nodeIdent) {
131         Preconditions.checkNotNull(nodeIdent, "FlowCapableNode ident can not be null!");
132         return provider.isNodeActive(nodeIdent);
133     }
134 }
135