X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fforwardingrules-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ffrm%2FAbstractTransaction.xtend;fp=opendaylight%2Fmd-sal%2Fforwardingrules-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ffrm%2FAbstractTransaction.xtend;h=9f45a11d2dac994f166239a6f7420572e2ff6b78;hp=0000000000000000000000000000000000000000;hb=71df6f6d7770d1c4fda8dd4989ca251860fca853;hpb=03abf047ba966c53f4901d36ae5198156d66dc05 diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/AbstractTransaction.xtend b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/AbstractTransaction.xtend new file mode 100644 index 0000000000..9f45a11d2d --- /dev/null +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/AbstractTransaction.xtend @@ -0,0 +1,99 @@ +package org.opendaylight.controller.frm + +import java.util.Collections +import java.util.HashSet +import java.util.Map.Entry +import java.util.Set +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction +import org.opendaylight.controller.md.sal.common.api.data.DataModification +import org.opendaylight.controller.sal.common.util.Rpcs +import org.opendaylight.yangtools.yang.binding.DataObject +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier +import org.opendaylight.yangtools.yang.common.RpcError + +abstract class AbstractTransaction implements DataCommitTransaction, DataObject> { + + @Property + val DataModification, DataObject> modification; + + new(DataModification, DataObject> modification) { + _modification = modification; + } + + def void validate() throws IllegalStateException + + override finish() throws IllegalStateException { + validate() + callRpcs(); + return Rpcs.getRpcResult(true, null, Collections.emptySet()); + } + + override getModification() { + return _modification; + } + + override rollback() throws IllegalStateException { + rollbackRpcs(); + return Rpcs.getRpcResult(true, null, Collections.emptySet()); + } + + def private callRpcs() { + val Set, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet(); + + /* + * This little dance is because updatedEntries contains both created and modified entries + * The reason I created a new HashSet is because the collections we are returned are immutable. + */ + val Set, DataObject>> updatedEntries = new HashSet, DataObject>>(); + updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet()); + updatedEntries.removeAll(createdEntries); + + val Set> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData(); + for (Entry, DataObject> entry : createdEntries) { + add(entry.key,entry.value); + } + for (Entry, DataObject> entry : updatedEntries) { + val originalFlow = _modification.originalConfigurationData.get(entry.key); + val updatedFlow = entry.value + update(entry.key, originalFlow ,updatedFlow); + } + + for (InstanceIdentifier instanceId : removeEntriesInstanceIdentifiers ) { + val removeValue = _modification.getOriginalConfigurationData.get(instanceId); + remove(instanceId,removeValue); + } + } + + def void remove(InstanceIdentifier identifier, DataObject remove) + + def void update(InstanceIdentifier identifier, DataObject original, DataObject update) + + def void add(InstanceIdentifier identifier, DataObject add) + + def private rollbackRpcs() { + val Set, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet(); + + /* + * This little dance is because updatedEntries contains both created and modified entries + * The reason I created a new HashSet is because the collections we are returned are immutable. + */ + val Set, DataObject>> updatedEntries = new HashSet, DataObject>>(); + updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet()); + updatedEntries.removeAll(createdEntries); + + val Set> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData(); + for (Entry, DataObject> entry : createdEntries) { + remove(entry.key,entry.value); // because we are rolling back, remove what we would have added. + } + for (Entry, DataObject> entry : updatedEntries) { + val originalFlow = _modification.originalConfigurationData.get(entry.key); + val updatedFlow = entry.value + update(entry.key, updatedFlow ,originalFlow);// because we are rolling back, replace the updated with the original + } + + for (InstanceIdentifier instanceId : removeEntriesInstanceIdentifiers ) { + val removeValue = _modification.getOriginalConfigurationData.get(instanceId); + add(instanceId,removeValue);// because we are rolling back, add what we would have removed. + } + } +} \ No newline at end of file