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.Collections
11 import java.util.HashSet
12 import java.util.Map.Entry
14 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction
15 import org.opendaylight.controller.md.sal.common.api.data.DataModification
16 import org.opendaylight.controller.sal.common.util.Rpcs
17 import org.opendaylight.yangtools.yang.binding.DataObject
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
19 import org.opendaylight.yangtools.yang.common.RpcError
21 abstract class AbstractTransaction implements DataCommitTransaction<InstanceIdentifier<?extends DataObject>, DataObject> {
24 val DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
26 new(DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
27 _modification = modification;
30 def void validate() throws IllegalStateException
32 override finish() throws IllegalStateException {
35 return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
38 override getModification() {
42 override rollback() throws IllegalStateException {
44 return Rpcs.getRpcResult(true, null, Collections.<RpcError>emptySet());
47 def private callRpcs() {
48 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet();
51 * This little dance is because updatedEntries contains both created and modified entries
52 * The reason I created a new HashSet is because the collections we are returned are immutable.
54 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
55 updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet());
56 updatedEntries.removeAll(createdEntries);
58 val Set<InstanceIdentifier<? extends DataObject>> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData();
59 for (Entry<InstanceIdentifier<? extends DataObject >, DataObject> entry : createdEntries) {
60 add(entry.key,entry.value);
62 for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
63 val originalFlow = _modification.originalConfigurationData.get(entry.key);
64 val updatedFlow = entry.value
65 update(entry.key, originalFlow ,updatedFlow);
68 for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
69 val removeValue = _modification.getOriginalConfigurationData.get(instanceId);
70 remove(instanceId,removeValue);
74 def void remove(InstanceIdentifier<?> identifier, DataObject remove)
76 def void update(InstanceIdentifier<?> identifier, DataObject original, DataObject update)
78 def void add(InstanceIdentifier<?> identifier, DataObject add)
80 def private rollbackRpcs() {
81 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> createdEntries = _modification.getCreatedConfigurationData().entrySet();
84 * This little dance is because updatedEntries contains both created and modified entries
85 * The reason I created a new HashSet is because the collections we are returned are immutable.
87 val Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updatedEntries = new HashSet<Entry<InstanceIdentifier<? extends DataObject>, DataObject>>();
88 updatedEntries.addAll(_modification.getUpdatedConfigurationData().entrySet());
89 updatedEntries.removeAll(createdEntries);
91 val Set<InstanceIdentifier<? >> removeEntriesInstanceIdentifiers = _modification.getRemovedConfigurationData();
92 for (Entry<InstanceIdentifier<?>, DataObject> entry : createdEntries) {
93 remove(entry.key,entry.value); // because we are rolling back, remove what we would have added.
95 for (Entry<InstanceIdentifier<?>, DataObject> entry : updatedEntries) {
96 val originalFlow = _modification.originalConfigurationData.get(entry.key);
97 val updatedFlow = entry.value
98 update(entry.key, updatedFlow ,originalFlow);// because we are rolling back, replace the updated with the original
101 for (InstanceIdentifier<?> instanceId : removeEntriesInstanceIdentifiers ) {
102 val removeValue = _modification.getOriginalConfigurationData.get(instanceId);
103 add(instanceId,removeValue);// because we are rolling back, add what we would have removed.