Make DOMDataTreeIdentifier implement Comparable 34/15634/3
authorRobert Varga <rovarga@cisco.com>
Mon, 23 Feb 2015 21:45:52 +0000 (22:45 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 24 Feb 2015 07:04:52 +0000 (08:04 +0100)
We can easily define total ordering on this class, which is useful for
maintaining order so that we can find the longest-prefix match easily by
iterating over the keys in the natural ordering.

Change-Id: Ie2f83ea494fe278df4acc1cb6059dae440ef8f37
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataTreeIdentifier.java

index 7370ebee7fe1ae3c0ac3b60ddd4337ffad53e66f..f404c0637f4cfe5ac49fb4fa5001ad1c71aa563d 100644 (file)
@@ -8,17 +8,19 @@ package org.opendaylight.controller.md.sal.dom.api;
 
 import com.google.common.base.Preconditions;
 import java.io.Serializable;
+import java.util.Iterator;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.concepts.Path;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 
 /**
  * A unique identifier for a particular subtree. It is composed of the logical
  * data store type and the instance identifier of the root node.
  */
-public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeIdentifier>, Serializable {
+public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeIdentifier>, Serializable, Comparable<DOMDataTreeIdentifier> {
     private static final long serialVersionUID = 1L;
     private final YangInstanceIdentifier rootIdentifier;
     private final LogicalDatastoreType datastoreType;
@@ -74,4 +76,30 @@ public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeI
         }
         return rootIdentifier.equals(other.rootIdentifier);
     }
+
+    @Override
+    public int compareTo(final DOMDataTreeIdentifier o) {
+        int i = datastoreType.compareTo(o.datastoreType);
+        if (i != 0) {
+            return i;
+        }
+
+        final Iterator<PathArgument> mi = rootIdentifier.getPathArguments().iterator();
+        final Iterator<PathArgument> oi = o.rootIdentifier.getPathArguments().iterator();
+
+        while (mi.hasNext()) {
+            if (!oi.hasNext()) {
+                return 1;
+            }
+
+            final PathArgument ma = mi.next();
+            final PathArgument oa = oi.next();
+            i = ma.compareTo(oa);
+            if (i != 0) {
+                return i;
+            }
+        }
+
+        return oi.hasNext() ? -1 : 0;
+    }
 }