Bulk merge of l2gw changes
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / ha / commands / MergeCommand.java
index ed31c25e4d04dfadbab28e6fedd7ef95a7140540..7e62e27deead559de2adff1b0a761765d91c5639 100644 (file)
@@ -7,27 +7,29 @@
  */
 package org.opendaylight.netvirt.elan.l2gw.ha.commands;
 
-import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
 import static org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil.isEmptyList;
 
 import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -41,18 +43,14 @@ public abstract class MergeCommand<T extends DataObject, Y extends Builder, Z ex
 
     private static final Logger LOG = LoggerFactory.getLogger(MergeCommand.class);
 
+    Class<? extends Identifiable> classType = getType();
+
     public List<T> transformOpData(List<T> existingData, List<T> src, InstanceIdentifier<Node> nodePath) {
-        if (isEmptyList(src)) {
-            return new ArrayList<>();
-        }
         List<T> added = diffOf(src, existingData);//do not add existing data again
         return transform(nodePath, added);
     }
 
     public List<T> transformConfigData(List<T> updatedSrc, InstanceIdentifier<Node> nodePath) {
-        if (isEmptyList(updatedSrc)) {
-            return new ArrayList<>();//what difference returning null makes ?
-        }
         return transform(nodePath, updatedSrc);
     }
 
@@ -81,51 +79,14 @@ public abstract class MergeCommand<T extends DataObject, Y extends Builder, Z ex
         return result;
     }
 
-    //TODO validate the perf of the following against direct setting of the data in dst node
-    public void transformUpdate(List<T> existing,
-                                List<T> updated,
-                                List<T> orig,
-                                InstanceIdentifier<Node> nodePath,
-                                LogicalDatastoreType datastoreType,
-                                ReadWriteTransaction tx) {
-
-        if (updated == null) {
-            updated = new ArrayList<>();
-        }
-        if (orig == null) {
-            orig = new ArrayList<>();
-        }
-        List<T> added   = new ArrayList<>(updated);
-
-        added.removeAll(orig);
-        added = diffOf(added, existing);//do not add the existing data again
-        if (added.size() > 0) {
-            for (T addedItem : added) {
-                InstanceIdentifier<T> transformedId = generateId(nodePath, addedItem);
-                T transformedItem = transform(nodePath, addedItem);
-                String nodeId = transformedId.firstKeyOf(Node.class).getNodeId().getValue();
-                LOG.trace("adding {} {} {}", getDescription(), nodeId, getKey(transformedItem));
-                tx.mergeParentStructurePut(datastoreType, transformedId, transformedItem);
-            }
-        }
-        List<T> removed = new ArrayList<>(orig);
-        removed = diffByKey(removed, updated);
+    Class<? extends Identifiable> getType() {
+        Type type = getClass().getGenericSuperclass();
+        return (Class<? extends Identifiable>)((ParameterizedType) type).getActualTypeArguments()[0];
 
-        List<T> removedTransformed  = new ArrayList<>();
-        for (T ele : removed) {
-            removedTransformed.add(transform(nodePath, ele));
-        }
+    }
 
-        List<T> skip = diffByKey(removedTransformed, existing);//skip the ones which are not present in cfg ds
-        removedTransformed = diffByKey(removedTransformed, skip);
-        if (removedTransformed.size() > 0) {
-            for (T removedItem : removedTransformed) {
-                InstanceIdentifier<T> transformedId = generateId(nodePath, removedItem);
-                String nodeId = transformedId.firstKeyOf(Node.class).getNodeId().getValue();
-                LOG.trace("removing {} {} {}",getDescription(), nodeId, getKey(removedItem));
-                tx.delete(datastoreType, transformedId);
-            }
-        }
+    <T extends DataObject> boolean isDataUpdated(Optional<T> existingDataOptional, T newData) {
+        return !existingDataOptional.isPresent() || !Objects.equals(existingDataOptional.get(), newData);
     }
 
     public List<T> transform(InstanceIdentifier<Node> nodePath, List<T> list) {
@@ -156,6 +117,9 @@ public abstract class MergeCommand<T extends DataObject, Y extends Builder, Z ex
         List<T> origDstData = getDataSafe(existingData);
         List<T> srcData = getDataSafe(src);
         List<T> data = transformOpData(origDstData, srcData, nodePath);
+        if (classType == RemoteUcastMacs.class) {
+            return;
+        }
         setData(dst, data);
         if (!isEmptyList(data)) {
             String nodeId = nodePath.firstKeyOf(Node.class).getNodeId().getValue();
@@ -176,19 +140,7 @@ public abstract class MergeCommand<T extends DataObject, Y extends Builder, Z ex
         }
     }
 
-    @Override
-    public void mergeOpUpdate(Z origDst,
-                              Z updatedSrc,
-                              Z origSrc,
-                              InstanceIdentifier<Node> nodePath,
-                              ReadWriteTransaction tx) {
-        List<T> updatedData     = getData(updatedSrc);
-        List<T> origData        = getData(origSrc);
-        List<T> existingData    = getData(origDst);
-        transformUpdate(existingData, updatedData, origData, nodePath, OPERATIONAL, tx);
-    }
-
-    boolean areSameSize(@Nullable List objA, @Nullable List objB) {
+    boolean areSameSize(@Nullable List objA,@Nullable List objB) {
         if (HwvtepHAUtil.isEmptyList(objA) && HwvtepHAUtil.isEmptyList(objB)) {
             return true;
         }