2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.frm;
10 import java.util.HashSet;
13 import java.util.Map.Entry;
14 import java.util.concurrent.atomic.AtomicLong;
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;
23 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
26 public abstract class AbstractChangeListener implements DataChangeListener {
28 private final AtomicLong txNum = new AtomicLong();
29 private String transactionId;
32 public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
33 this.transactionId = this.newTransactionIdentifier().toString();
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>>();
40 Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updateConfigEntrySet =
41 changeEvent.getUpdatedConfigurationData().entrySet();
42 updatedEntries.addAll(updateConfigEntrySet);
43 updatedEntries.removeAll(createdEntries);
45 final Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers =
46 changeEvent.getRemovedConfigurationData();
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);
54 for (final Entry<InstanceIdentifier<?>, DataObject> updatedEntrie : updatedEntries) {
55 Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
56 changeEvent.getOriginalConfigurationData();
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);
64 for (final InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers) {
65 Map<InstanceIdentifier<? extends DataObject>, DataObject> origConfigData =
66 changeEvent.getOriginalConfigurationData();
68 final DataObject removeValue = origConfigData.get(instanceId);
69 this.remove(instanceId, removeValue);
73 public String getTransactionId() {
74 return this.transactionId;
77 private Object newTransactionIdentifier() {
78 return "DOM-" + txNum.getAndIncrement();
81 protected abstract void validate() throws IllegalStateException;
83 protected abstract void remove(
84 final InstanceIdentifier<? extends DataObject> identifier,
85 final DataObject remove);
87 protected abstract void update(
88 final InstanceIdentifier<? extends DataObject> identifier,
89 final DataObject original, final DataObject update);
91 protected abstract void add(
92 final InstanceIdentifier<? extends DataObject> identifier,
93 final DataObject add);