BUG-868: use a single version of ClassLoaderUtils
[controller.git] / opendaylight / md-sal / forwardingrules-manager / src / main / java / org / opendaylight / controller / frm / flow / FlowChangeListener.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.frm.flow;
9
10 import org.opendaylight.controller.frm.AbstractChangeListener;
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlow;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * 
36  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
37  *
38  */
39 public class FlowChangeListener extends AbstractChangeListener {
40
41     private final static Logger LOG = LoggerFactory.getLogger(FlowChangeListener.class);
42
43     private final SalFlowService salFlowService;
44
45     public SalFlowService getSalFlowService() {
46         return this.salFlowService;
47     }
48     
49     public FlowChangeListener(final SalFlowService manager) {
50         this.salFlowService = manager;
51     }
52
53     @Override
54     protected void validate() throws IllegalStateException {
55         FlowTransactionValidator.validate(this);
56     }
57
58     @Override
59     protected void remove(InstanceIdentifier<? extends DataObject> identifier, DataObject removeDataObj) {
60         if ((removeDataObj instanceof Flow)) {
61             
62             final Flow flow = ((Flow) removeDataObj);
63             final InstanceIdentifier<Table> tableInstanceId = identifier.<Table> firstIdentifierOf(Table.class);
64             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
65             final RemoveFlowInputBuilder builder = new RemoveFlowInputBuilder(flow);
66             
67             builder.setFlowRef(new FlowRef(identifier));
68             builder.setNode(new NodeRef(nodeInstanceId));
69             builder.setFlowTable(new FlowTableRef(tableInstanceId));
70             
71             Uri uri = new Uri(this.getTransactionId());
72             builder.setTransactionUri(uri);
73             this.salFlowService.removeFlow((RemoveFlowInput) builder.build());
74             LOG.debug("Transaction {} - Removed Flow has removed flow: {}", new Object[]{uri, removeDataObj});
75         }
76     }
77
78     @Override
79     protected void update(InstanceIdentifier<? extends DataObject> identifier, DataObject original, DataObject update) {
80         if (original instanceof Flow && update instanceof Flow) {
81             
82             final Flow originalFlow = ((Flow) original);
83             final Flow updatedFlow = ((Flow) update);
84             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node>firstIdentifierOf(Node.class);
85             final UpdateFlowInputBuilder builder = new UpdateFlowInputBuilder();
86             
87             builder.setNode(new NodeRef(nodeInstanceId));
88             builder.setFlowRef(new FlowRef(identifier));
89             
90             Uri uri = new Uri(this.getTransactionId());
91             builder.setTransactionUri(uri);
92             
93             builder.setUpdatedFlow((UpdatedFlow) (new UpdatedFlowBuilder(updatedFlow)).build());
94             builder.setOriginalFlow((OriginalFlow) (new OriginalFlowBuilder(originalFlow)).build());
95             
96             this.salFlowService.updateFlow((UpdateFlowInput) builder.build());
97             LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update});
98       }
99     }
100
101     @Override
102     protected void add(InstanceIdentifier<? extends DataObject> identifier, DataObject addDataObj) {
103         if ((addDataObj instanceof Flow)) {
104             
105             final Flow flow = ((Flow) addDataObj);
106             final InstanceIdentifier<Table> tableInstanceId = identifier.<Table> firstIdentifierOf(Table.class);
107             final InstanceIdentifier<Node> nodeInstanceId = identifier.<Node> firstIdentifierOf(Node.class);
108             final AddFlowInputBuilder builder = new AddFlowInputBuilder(flow);
109             
110             builder.setNode(new NodeRef(nodeInstanceId));
111             builder.setFlowRef(new FlowRef(identifier));
112             builder.setFlowTable(new FlowTableRef(tableInstanceId));
113             
114             Uri uri = new Uri(this.getTransactionId());
115             builder.setTransactionUri(uri);
116             this.salFlowService.addFlow((AddFlowInput) builder.build());
117             LOG.debug("Transaction {} - Add Flow has added flow: {}", new Object[]{uri, addDataObj});
118         }
119     }
120 }