DOMQueryEvaluator is @NonNullByDefault
[mdsal.git] / dom / mdsal-dom-spi / src / main / java / org / opendaylight / mdsal / dom / spi / DOMDataTreePrefixTableEntry.java
index 52aaf4a788b11400c9d42739a733444dafe4cc1f..27bcb6b18c46e75f41ea984b8077222c0a4e6e54 100644 (file)
@@ -7,21 +7,25 @@
  */
 package org.opendaylight.mdsal.dom.spi;
 
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import javax.annotation.concurrent.NotThreadSafe;
 import org.opendaylight.yangtools.concepts.Identifiable;
+import org.opendaylight.yangtools.concepts.Mutable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * An entry in DOMDataTreePrefixTable. This class is not thread-safe.
+ */
 @Beta
-@NotThreadSafe
-public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathArgument> {
+public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathArgument>, Mutable {
     private static final Logger LOG = LoggerFactory.getLogger(DOMDataTreePrefixTableEntry.class);
     // FIXME: We do probably want to adapt map
     private final Map<PathArgument, DOMDataTreePrefixTableEntry<V>> children = new HashMap<>();
@@ -33,7 +37,7 @@ public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathAr
     }
 
     DOMDataTreePrefixTableEntry(final PathArgument identifier) {
-        this.identifier = Preconditions.checkNotNull(identifier);
+        this.identifier = requireNonNull(identifier);
     }
 
     @Override
@@ -48,6 +52,7 @@ public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathAr
     DOMDataTreePrefixTableEntry<V> lookup(final YangInstanceIdentifier id) {
         final Iterator<PathArgument> it = id.getPathArguments().iterator();
         DOMDataTreePrefixTableEntry<V> entry = this;
+        DOMDataTreePrefixTableEntry<V> lastPresentEntry = entry.getValue() != null ? entry : null;
 
         while (it.hasNext()) {
             final PathArgument a = it.next();
@@ -58,9 +63,13 @@ public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathAr
             }
 
             entry = child;
+
+            if (child.getValue() != null) {
+                lastPresentEntry = child;
+            }
         }
 
-        return entry;
+        return lastPresentEntry;
     }
 
     void store(final YangInstanceIdentifier id, final V reg) {
@@ -78,7 +87,7 @@ public final class DOMDataTreePrefixTableEntry<V> implements Identifiable<PathAr
             entry = child;
         }
 
-        Preconditions.checkState(entry.value == null);
+        checkState(entry.value == null);
         entry.value = reg;
     }