Fix EffectiveStatement namespace access 36/84836/4
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Oct 2019 09:05:48 +0000 (11:05 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Oct 2019 09:42:52 +0000 (11:42 +0200)
We really want to use empty maps and optionals in this interface
contract -- do that now.

Change-Id: Ibfc72d29ff24c592e2a81ad894bb0b9f8f683f6d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
12 files changed:
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ForwardingEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DataTreeAwareEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/SchemaTreeAwareEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/compat/ActionNodeContainerCompat.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/compat/NotificationNodeContainerCompat.java
yang/yang-model-api/src/test/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatementTest.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementBase.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/config/EmptyConfigEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/mandatory/EmptyMandatoryEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/typedef/TypedefEffectiveStatementImpl.java

index e002c41f99259ad2222d3a987e64707351fced2a..415a2960aa1ac0693e3fa9eb6928700dc60ad3c0 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.model.api.meta;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableMap;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Optional;
@@ -42,11 +41,11 @@ public interface EffectiveStatement<A, D extends DeclaredStatement<A>> extends M
      * @param <N> Namespace identifier type
      * @param namespace Namespace type
      * @param identifier Identifier of element.
-     * @return Value if present, null otherwise.
+     * @return Value if present
      */
     //<K, V, N extends IdentifierNamespace<? super K, ? extends V>> V
-    // FIXME: 4.0.0: make this return an Optional, not a nullable
-    <K, V, N extends IdentifierNamespace<K, V>> @Nullable V get(@NonNull Class<N> namespace, @NonNull K identifier);
+    <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(@NonNull Class<N> namespace,
+            @NonNull K identifier);
 
     /**
      * Returns all local values from supplied namespace.
@@ -55,10 +54,10 @@ public interface EffectiveStatement<A, D extends DeclaredStatement<A>> extends M
      * @param <V> Value type
      * @param <N> Namespace identifier type
      * @param namespace Namespace type
-     * @return Value if present, null otherwise.
+     * @return Key-value mappings, empty if the namespace does not exist.
+     * @throws NullPointerException if namespace is null
      */
-    // FIXME: 4.0.0: make this contract return empty maps on non-presence
-    <K, V, N extends IdentifierNamespace<K, V>> @Nullable Map<K, V> getAll(@NonNull Class<N> namespace);
+    <K, V, N extends IdentifierNamespace<K, V>> @NonNull Map<K, V> getAll(@NonNull Class<N> namespace);
 
     /**
      * Returns all local values from supplied namespace.
@@ -68,11 +67,12 @@ public interface EffectiveStatement<A, D extends DeclaredStatement<A>> extends M
      * @param <N> Namespace identifier type
      * @param namespace Namespace type
      * @return Key-value mappings, empty if the namespace does not exist.
+     * @throws NullPointerException if namespace is null
+     * @deprecated Use {@link #getAll(Class)} instead
      */
-    // FIXME: 4.0.0: remove this in favor of fixed getAll()
+    @Deprecated(forRemoval = true)
     default <K, V, N extends IdentifierNamespace<K, V>> @NonNull Map<K, V> findAll(final @NonNull Class<N> namespace) {
-        final Map<K, V> map = getAll(requireNonNull(namespace));
-        return map == null ? ImmutableMap.of() : map;
+        return getAll(requireNonNull(namespace));
     }
 
     /**
index c373146cf830fa7a0cbd2bfcaf8ded36a289e9d7..e4ce07f4026d26252758e4fcf0b2c6bd49bfdc1c 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.collect.ForwardingObject;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * Utility forwarding implementation of {@link EffectiveStatement} contract. This class is useful for implementing
@@ -36,7 +37,8 @@ public abstract class ForwardingEffectiveStatement<A, D extends DeclaredStatemen
     }
 
     @Override
-    public <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
+    public <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+            final K identifier) {
         return delegate().get(namespace, identifier);
     }
 
index 2315f8ff474cab00cfa6e57599f429afe257b844..782db09acac77493121d673dc3d4fe7816286698 100644 (file)
@@ -54,8 +54,6 @@ public interface DataTreeAwareEffectiveStatement<A, D extends DeclaredStatement<
      */
     default <E extends DataTreeEffectiveStatement<?>> @NonNull Optional<E> findDataTreeNode(
             final @NonNull QName qname) {
-        @SuppressWarnings("unchecked")
-        final E result = (E) get(Namespace.class, requireNonNull(qname));
-        return Optional.ofNullable(result);
+        return get(Namespace.class, requireNonNull(qname));
     }
 }
index 8ad271ba3df8c88d8388490bf918a6f6acc39720..58a09a504263a2cb96e1c35713b9ea133b682a49 100644 (file)
@@ -50,8 +50,6 @@ public interface SchemaTreeAwareEffectiveStatement<A, D extends DeclaredStatemen
      */
     default <E extends SchemaTreeEffectiveStatement<?>> @NonNull Optional<E> findSchemaTreeNode(
             final @NonNull QName qname) {
-        @SuppressWarnings("unchecked")
-        final E result = (E) get(Namespace.class, requireNonNull(qname));
-        return Optional.ofNullable(result);
+        return get(Namespace.class, requireNonNull(qname));
     }
 }
index 2b425168174068e0787d21250465f51a43f5be64..1f0ced6239d785925a52642681aa22a0c0c02911 100644 (file)
@@ -27,7 +27,7 @@ public interface ActionNodeContainerCompat<A, D extends DeclaredStatement<A>>
     default Optional<ActionDefinition> findAction(final QName qname) {
         // 'action' identifier must never collide with another element, hence if we look it up and it ends up being
         // an ActionDefinition, we have found a match.
-        final Object child = get(Namespace.class, qname);
-        return child instanceof ActionDefinition ? Optional.of((ActionDefinition) child) : Optional.empty();
+        return get(Namespace.class, qname)
+                .flatMap(child -> child instanceof ActionDefinition ? Optional.of(child) : Optional.empty());
     }
 }
index 69dc677b664a70eff203efc2ddcb4a472eef8c3e..37a64bfb4faa0203603bcd496515697457b2d272 100644 (file)
@@ -27,7 +27,7 @@ public interface NotificationNodeContainerCompat<A, D extends DeclaredStatement<
     default Optional<NotificationDefinition> findNotification(final QName qname) {
         // 'notification' identifier must never collide with another element, hence if we look it up and it ends up
         // being an NotificationDefinition, we have found a match.
-        final Object child = get(Namespace.class, qname);
-        return child instanceof NotificationDefinition ? Optional.of((NotificationDefinition) child) : Optional.empty();
+        return get(Namespace.class, qname)
+                .flatMap(child -> child instanceof NotificationDefinition ? Optional.of(child) : Optional.empty());
     }
 }
index d711e83f40586e94aed5a4fbeaf74db42bfae5bd..dbcf36fb0f937b3f368cacdf604e6320787d9f96 100644 (file)
@@ -8,13 +8,11 @@
 package org.opendaylight.yangtools.yang.model.api.meta;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -43,7 +41,6 @@ public class EffectiveStatementTest {
         doCallRealMethod().when(stmt).findFirstEffectiveSubstatement(any());
         doCallRealMethod().when(stmt).findFirstEffectiveSubstatementArgument(any());
         doCallRealMethod().when(stmt).streamEffectiveSubstatements(any());
-        doCallRealMethod().when(stmt).findAll(any());
     }
 
     @Test
@@ -65,16 +62,4 @@ public class EffectiveStatementTest {
         assertEquals(ImmutableList.of(stmt2), stmt.streamEffectiveSubstatements(Effectivestatement2.class)
             .collect(Collectors.toList()));
     }
-
-    @Test
-    public void testFindAll() {
-        doReturn(mockNamespace).when(stmt).getAll(any());
-        assertSame(mockNamespace, stmt.findAll(IdentifierNamespace.class));
-    }
-
-    @Test
-    public void testFindAllNone() {
-        doReturn(null).when(stmt).getAll(any());
-        assertEquals(ImmutableMap.of(), stmt.findAll(IdentifierNamespace.class));
-    }
 }
index a0c12a569258f2500b56a9a939e45e24419921b7..2ae9957b8ac3e43f8e838fcf5d9e2c37afe69e74 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
@@ -76,13 +77,15 @@ public abstract class EffectiveStatementBase<A, D extends DeclaredStatement<A>>
     }
 
     @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
-        return findAll(namespace).get(requireNonNull(identifier));
+    public final <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+            final K identifier) {
+        return Optional.ofNullable(getAll(namespace).get(requireNonNull(identifier)));
     }
 
     @Override
     public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(final Class<N> namespace) {
-        return getNamespaceContents(requireNonNull(namespace)).orElse(null);
+        final Optional<? extends Map<K, V>> ret = getNamespaceContents(requireNonNull(namespace));
+        return ret.isPresent() ? ret.get() : ImmutableMap.of();
     }
 
     /**
index 1874e6a0305dec88314ae01beae82b076d1838da..4d74b79270b92b981bdd1d5f93c7b7739fcb9b66 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.config;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
@@ -53,7 +54,8 @@ abstract class EmptyConfigEffectiveStatement implements ConfigEffectiveStatement
     }
 
     @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
+    public final <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+            final K identifier) {
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
index 66d8ddc21700b65c7dbb68044e5c0b9cb9f045cd..448c96ca539e0e93d1d2c489da211b28b6ca5809 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.mandatory;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
@@ -49,7 +50,8 @@ abstract class EmptyMandatoryEffectiveStatement implements MandatoryEffectiveSta
     }
 
     @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
+    public final <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+            final K identifier) {
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
index b0f933b0cdbde29fab294a4813c82430e6519c39..c8d4386a4bc43b7cb7a7a008a9871e080f3777c2 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
@@ -58,15 +60,16 @@ enum BuiltinEffectiveStatement implements TypeEffectiveStatement<TypeStatement>
     }
 
     @Override
-    public final <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
-        // TODO Auto-generated method stub
-        return null;
+    public final <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+            final K identifier) {
+        // FIXME: 5.0.0: implement this
+        return Optional.empty();
     }
 
     @Override
     public final <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(final Class<N> namespace) {
-        // TODO Auto-generated method stub
-        return null;
+        // FIXME: 5.0.0: implement this
+        return ImmutableMap.of();
     }
 
     @Override
index 07d3cf9f4483926c15d04a458072155b4e57c3fe..8ab0ae3ad4149d707671d758273e186c35706c0e 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.typedef;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -109,7 +110,8 @@ final class TypedefEffectiveStatementImpl extends AbstractEffectiveSchemaNode<Ty
         }
 
         @Override
-        public <K, V, N extends IdentifierNamespace<K, V>> V get(final Class<N> namespace, final K identifier) {
+        public <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
+                final K identifier) {
             return TypedefEffectiveStatementImpl.this.get(namespace, identifier);
         }