bf0050d6c0eaa7b289d8013408b0e54e1b9ae53d
[controller.git] / opendaylight / md-sal / compatibility / flow-management-compatibility / src / main / java / org / opendaylight / controller / md / frm / compatibility / FlowCommitTransaction.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.md.frm.compatibility;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map.Entry;
15 import java.util.Set;
16
17 import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
18 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
21 import org.opendaylight.yangtools.yang.binding.DataObject;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
23 import org.opendaylight.yangtools.yang.common.RpcResult;
24
25 public class FlowCommitTransaction implements DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
26
27     private final DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
28     private final HashSet<FlowConfig> toAdd = new HashSet<FlowConfig>();
29     private final FRMRuntimeDataProvider flowManager;
30     private Iterable<FlowConfig> toUpdate;
31     private Iterable<FlowConfig> toRemove;
32
33     public FlowCommitTransaction(
34             final FRMRuntimeDataProvider flowManager,
35             final DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
36         this.flowManager = flowManager;
37         this.modification = modification;
38         this.processModification();
39     }
40
41     @Override
42     public RpcResult<Void> finish() throws IllegalStateException {
43         return this.flowManager.finish(this);
44     }
45
46     @Override
47     public RpcResult<Void> rollback() throws IllegalStateException {
48         return this.flowManager.rollback(this);
49     }
50
51     public void processModification() {
52         final Set<Entry<InstanceIdentifier<? extends DataObject>, DataObject>> updated =
53                 this.modification.getUpdatedConfigurationData().entrySet();
54         final List<FlowConfig> forUpdate = new ArrayList<FlowConfig>(updated.size());
55
56         if (updated != null && !(updated.isEmpty())) {
57             for (Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : updated) {
58                 if (FlowConfigMapping.isFlowPath(entry.getKey())) {
59                     forUpdate.add(FlowConfigMapping.toFlowConfig((Flow) entry.getValue()));
60                 }
61             }
62         }
63         this.toUpdate = Collections.unmodifiableCollection(forUpdate);
64
65         final Set<InstanceIdentifier<? extends DataObject>> removedConfigurationData =
66                 this.modification.getRemovedConfigurationData();
67         final List<FlowConfig> forRemove = new ArrayList<FlowConfig>(removedConfigurationData.size());
68
69         if (removedConfigurationData != null && !(removedConfigurationData.isEmpty())) {
70             for (InstanceIdentifier<? extends DataObject> data : removedConfigurationData) {
71                 if (FlowConfigMapping.isFlowPath(data)) {
72                     forRemove.add(FlowConfigMapping.toFlowConfig(data));
73                 }
74             }
75         }
76         this.toRemove = Collections.unmodifiableCollection(forRemove);
77     }
78
79     @Override
80     public DataModification<InstanceIdentifier<? extends DataObject>, DataObject> getModification() {
81         return this.modification;
82     }
83
84     public FRMRuntimeDataProvider getFlowManager() {
85         return this.flowManager;
86     }
87
88     public HashSet<FlowConfig> getToAdd() {
89         return this.toAdd;
90     }
91
92     public Iterable<FlowConfig> getToUpdate() {
93         return this.toUpdate;
94     }
95
96     public Iterable<FlowConfig> getToRemove() {
97         return this.toRemove;
98     }
99 }