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.flow;
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;
36 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
39 public class FlowChangeListener extends AbstractChangeListener {
41 private final static Logger LOG = LoggerFactory.getLogger(FlowChangeListener.class);
43 private final SalFlowService salFlowService;
45 public SalFlowService getSalFlowService() {
46 return this.salFlowService;
49 public FlowChangeListener(final SalFlowService manager) {
50 this.salFlowService = manager;
54 protected void validate() throws IllegalStateException {
55 FlowTransactionValidator.validate(this);
59 protected void remove(InstanceIdentifier<? extends DataObject> identifier, DataObject removeDataObj) {
60 if ((removeDataObj instanceof Flow)) {
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);
67 builder.setFlowRef(new FlowRef(identifier));
68 builder.setNode(new NodeRef(nodeInstanceId));
69 builder.setFlowTable(new FlowTableRef(tableInstanceId));
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});
79 protected void update(InstanceIdentifier<? extends DataObject> identifier, DataObject original, DataObject update) {
80 if (original instanceof Flow && update instanceof Flow) {
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();
87 builder.setNode(new NodeRef(nodeInstanceId));
88 builder.setFlowRef(new FlowRef(identifier));
90 Uri uri = new Uri(this.getTransactionId());
91 builder.setTransactionUri(uri);
93 builder.setUpdatedFlow((UpdatedFlow) (new UpdatedFlowBuilder(updatedFlow)).build());
94 builder.setOriginalFlow((OriginalFlow) (new OriginalFlowBuilder(originalFlow)).build());
96 this.salFlowService.updateFlow((UpdateFlowInput) builder.build());
97 LOG.debug("Transaction {} - Update Flow has updated flow {} with {}", new Object[]{uri, original, update});
102 protected void add(InstanceIdentifier<? extends DataObject> identifier, DataObject addDataObj) {
103 if ((addDataObj instanceof Flow)) {
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);
110 builder.setNode(new NodeRef(nodeInstanceId));
111 builder.setFlowRef(new FlowRef(identifier));
112 builder.setFlowTable(new FlowTableRef(tableInstanceId));
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});