1 package org.opendaylight.controller.frm
3 import java.util.Collections
4 import java.util.HashSet
5 import java.util.Map.Entry
7 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction
8 import org.opendaylight.controller.md.sal.common.api.data.DataModification
9 import org.opendaylight.controller.sal.common.util.Rpcs
10 import org.opendaylight.yangtools.yang.binding.DataObject
11 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
12 import org.opendaylight.yangtools.yang.common.RpcError
14 abstract class AbstractTransaction implements DataCommitTransaction<InstanceIdentifier<?extends DataObject>, DataObject> {
17 val DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
19 new(DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
20 _modification = modification;
23 def void validate() throws IllegalStateException
25 override finish() throws IllegalStateException {
28 return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
31 override getModification() {
35 override rollback() throws IllegalStateException {
37 return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
40 def private callRpcs() {
41 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet();
44 * This little dance is because updatedEntries contains both created and modified entries
45 * The reason I created a new HashSet is because the collections we are returned are immutable.
47 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
48 updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet());
49 updatedEntries.removeAll(createdEntries);
51 val Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData();
52 for (Entry<InstanceIdentifier<? extends DataObject >, DataObject> entry : createdEntries) {
53 add(entry.key,entry.value);
55 for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
56 val originalFlow = _modification.originalConfigurationData.get(entry.key);
57 val updatedFlow = entry.value
58 update(entry.key, originalFlow ,updatedFlow);
61 for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
62 val removeValue = _modification.getOriginalConfigurationData.get(instanceId);
63 remove(instanceId,removeValue);
67 def void remove(InstanceIdentifier<?> identifier, DataObject remove)
69 def void update(InstanceIdentifier<?> identifier, DataObject original, DataObject update)
71 def void add(InstanceIdentifier<?> identifier, DataObject add)
73 def private rollbackRpcs() {
74 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet();
77 * This little dance is because updatedEntries contains both created and modified entries
78 * The reason I created a new HashSet is because the collections we are returned are immutable.
80 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
81 updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet());
82 updatedEntries.removeAll(createdEntries);
84 val Set<InstanceIdentifier<? >> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData();
85 for (Entry<InstanceIdentifier<?>, DataObject> entry : createdEntries) {
86 remove(entry.key,entry.value); // because we are rolling back, remove what we would have added.
88 for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
89 val originalFlow = _modification.originalConfigurationData.get(entry.key);
90 val updatedFlow = entry.value
91 update(entry.key, updatedFlow ,originalFlow);// because we are rolling back, replace the updated with the original
94 for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
95 val removeValue = _modification.getOriginalConfigurationData.get(instanceId);
96 add(instanceId,removeValue);// because we are rolling back, add what we would have removed.