Merge "BUG-614: migrate RuntimeGeneratedInvoker"
[controller.git] / opendaylight / md-sal / forwardingrules-manager / src / main / java / org / opendaylight / controller / frm / AbstractChangeListener.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.controller.frm;
9
10 import java.util.HashSet;
11 import java.util.Map;
12 import java.util.Set;
13 import java.util.Map.Entry;
14 import java.util.concurrent.atomic.AtomicLong;
15
16 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
17 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20
21 /**
22  *
23  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
24  *
25  */
26 public abstract class AbstractChangeListener implements DataChangeListener {
27
28     private final AtomicLong txNum = new AtomicLong();
29     private String transactionId;
30
31     @Override
32     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
33         this.transactionId = this.newTransactionIdentifier().toString();
34
35         final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries =
36                 changeEvent.getCreatedConfigurationData().entrySet();
37         final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries =
38                 new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
39
40         Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updateConfigEntrySet =
41                 changeEvent.getUpdatedConfigurationData().entrySet();
42         updatedEntries.addAll(updateConfigEntrySet);
43         updatedEntries.removeAll(createdEntries);
44
45         final Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers =
46                 changeEvent.getRemovedConfigurationData();
47
48         for (final Entry<InstanceIdentifier<? extends DataObject>, DataObject> createdEntry : createdEntries) {
49             InstanceIdentifier<? extends DataObject> c_key = createdEntry.getKey();
50             DataObject c_value = createdEntry.getValue();
51             this.add(c_key, c_value);
52         }
53
54         for (final Entry<InstanceIdentifier<?>, DataObject> updatedEntrie : updatedEntries) {
55             Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
56                     changeEvent.getOriginalConfigurationData();
57
58             InstanceIdentifier<? extends Object> u_key = updatedEntrie.getKey();
59             final DataObject originalFlow = origConfigData.get(u_key);
60             final DataObject updatedFlow = updatedEntrie.getValue();
61             this.update(u_key, originalFlow, updatedFlow);
62         }
63
64         for (final InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers) {
65             Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
66                     changeEvent.getOriginalConfigurationData();
67
68             final DataObject removeValue = origConfigData.get(instanceId);
69             this.remove(instanceId, removeValue);
70         }
71     }
72
73     public String getTransactionId() {
74         return this.transactionId;
75     }
76
77     private Object newTransactionIdentifier() {
78         return "DOM-" + txNum.getAndIncrement();
79     }
80
81     protected abstract void validate() throws IllegalStateException;
82
83     protected abstract void remove(
84             final InstanceIdentifier<? extends DataObject> identifier,
85             final DataObject remove);
86
87     protected abstract void update(
88             final InstanceIdentifier<? extends DataObject> identifier,
89             final DataObject original, final DataObject update);
90
91     protected abstract void add(
92             final InstanceIdentifier<? extends DataObject> identifier,
93             final DataObject add);
94 }