Fix transaction manager closing.
[openflowplugin.git] / applications / topology-manager / src / main / java / org / opendaylight / openflowplugin / applications / topology / manager / NodeChangeListenerImpl.java
index b0ed434bb4d5449c1c02f69396c4edd390845fbb..a2809dfc69b855521eff5ac0193363dacfdcf522 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -7,12 +7,10 @@
  */
 package org.opendaylight.openflowplugin.applications.topology.manager;
 
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+import java.util.Collection;
+import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
@@ -22,69 +20,55 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NodeChangeListenerImpl extends DataChangeListenerImpl {
+public class NodeChangeListenerImpl extends DataTreeChangeListenerImpl<FlowCapableNode> {
     private static final Logger LOG = LoggerFactory.getLogger(NodeChangeListenerImpl.class);
 
     public NodeChangeListenerImpl(final DataBroker dataBroker, final OperationProcessor operationProcessor) {
-        // TODO: listener on FlowCapableNode. what if node id in Node.class is changed (it won't be caught by this
-        // listener)
+        // TODO: listener on FlowCapableNode. what if node id in Node.class is changed (it won't be caught by this listener)
         super(operationProcessor, dataBroker, InstanceIdentifier.builder(Nodes.class).child(Node.class)
                 .augmentation(FlowCapableNode.class).build());
     }
 
     @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        processAddedNode(change.getCreatedData());
-        // processUpdatedNode(change.getUpdatedData());
-        processRemovedNode(change.getRemovedPaths());
-    }
-
-    /**
-     * @param removedNodes
-     */
-    private void processRemovedNode(final Set<InstanceIdentifier<?>> removedNodes) {
-        for (InstanceIdentifier<?> removedNode : removedNodes) {
-            final NodeId nodeId = provideTopologyNodeId(removedNode);
-            final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> iiToTopologyRemovedNode = provideIIToTopologyNode(nodeId);
-            if (iiToTopologyRemovedNode != null) {
-                operationProcessor.enqueueOperation(new TopologyOperation() {
-
-                    @Override
-                    public void applyOperation(final ReadWriteTransaction transaction) {
-                        transaction.delete(LogicalDatastoreType.OPERATIONAL, iiToTopologyRemovedNode);
-                        TopologyManagerUtil.removeAffectedLinks(nodeId, transaction, II_TO_TOPOLOGY);
-                    }
-                });
-            } else {
-                LOG.debug("Instance identifier to inventory wasn't translated to topology while deleting node.");
+    public void onDataTreeChanged(@Nonnull final Collection<DataTreeModification<FlowCapableNode>> modifications) {
+        for (DataTreeModification modification : modifications) {
+            switch (modification.getRootNode().getModificationType()) {
+                case WRITE:
+                    processAddedNode(modification);
+                    break;
+                case SUBTREE_MODIFIED:
+                    // NOOP
+                    break;
+                case DELETE:
+                    processRemovedNode(modification);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unhandled modification type: {}" +
+                            modification.getRootNode().getModificationType());
             }
         }
     }
 
-//    /**
-//     * @param updatedData
-//     */
-//     private void processUpdatedNode(Map<InstanceIdentifier<?>, DataObject> updatedData) {
-//         //TODO: only node id is used from incoming data object.
-//         //if it is changed what should happen? Listener is on FlowCapableNode so change
-//         //of node id (only data which are used) isn't caught.
-//     }
-
-    /**
-     * @param addedDatas
-     */
-    private void processAddedNode(final Map<InstanceIdentifier<?>, DataObject> addedDatas) {
-        for (Entry<InstanceIdentifier<?>, DataObject> addedData : addedDatas.entrySet()) {
-            createData(addedData.getKey());
+    private void processRemovedNode(final DataTreeModification<FlowCapableNode> modification) {
+        final InstanceIdentifier<FlowCapableNode> iiToNodeInInventory = modification.getRootPath().getRootIdentifier();
+        final NodeId nodeId = provideTopologyNodeId(iiToNodeInInventory);
+        final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> iiToTopologyRemovedNode = provideIIToTopologyNode(nodeId);
+        if (iiToTopologyRemovedNode != null) {
+            operationProcessor.enqueueOperation(manager -> {
+                manager.addDeleteOperationTotTxChain(LogicalDatastoreType.OPERATIONAL, iiToTopologyRemovedNode);
+                TopologyManagerUtil.removeAffectedLinks(nodeId, manager, II_TO_TOPOLOGY);
+            });
+        } else {
+            LOG.debug("Instance identifier to inventory wasn't translated to topology while deleting node.");
         }
     }
 
-    protected void createData(final InstanceIdentifier<?> iiToNodeInInventory) {
+    private void processAddedNode(final DataTreeModification<FlowCapableNode> modification) {
+        final InstanceIdentifier<FlowCapableNode> iiToNodeInInventory = modification.getRootPath().getRootIdentifier();
         final NodeId nodeIdInTopology = provideTopologyNodeId(iiToNodeInInventory);
         if (nodeIdInTopology != null) {
             final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node> iiToTopologyNode = provideIIToTopologyNode(nodeIdInTopology);
@@ -94,15 +78,11 @@ public class NodeChangeListenerImpl extends DataChangeListenerImpl {
         }
     }
 
-    /**
-     * @param nodeIdInTopology
-     * @param iiToNodeInInventory
-     * @return Node
-     */
-    private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node prepareTopologyNode(final NodeId nodeIdInTopology, final InstanceIdentifier<?> iiToNodeInInventory) {
+    private static org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node
+    prepareTopologyNode(final NodeId nodeIdInTopology, final InstanceIdentifier<FlowCapableNode> iiToNodeInInventory) {
         final InventoryNode inventoryNode = new InventoryNodeBuilder()
-        .setInventoryNodeRef(new NodeRef(iiToNodeInInventory.firstIdentifierOf(Node.class)))
-        .build();
+            .setInventoryNodeRef(new NodeRef(iiToNodeInInventory.firstIdentifierOf(Node.class)))
+            .build();
 
         final NodeBuilder topologyNodeBuilder = new NodeBuilder();
         topologyNodeBuilder.setNodeId(nodeIdInTopology);
@@ -110,4 +90,5 @@ public class NodeChangeListenerImpl extends DataChangeListenerImpl {
 
         return topologyNodeBuilder.build();
     }
+
 }
\ No newline at end of file