Add prerequisiteUnavailable() 09/74809/10
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Aug 2018 18:37:30 +0000 (20:37 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 28 Jun 2019 06:52:21 +0000 (06:52 +0000)
This method should be invoked when we know the prerequisite is
not available. This adds the very basic notion and hooks for that.

Change-Id: Ibdb7a04737292be1f3a091057601af7db8325a38
JIRA: YANGTOOLS-859
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java

index 6a1080ab37cc654d99988850f0957397617b12e0..664ad74a546256600329707f0bf833c148892ae3 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.reactor;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.EFFECTIVE_MODEL;
 import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.FULL_DECLARATION;
@@ -266,7 +267,7 @@ final class ModifierImpl implements ModelActionBuilder {
         public final T resolve(final InferenceContext ctx) {
             checkState(done);
             checkArgument(ctx == ModifierImpl.this.ctx);
-            return value;
+            return verifyNotNull(value, "Attempted to access unavailable prerequisite %s", this);
         }
 
         final boolean isDone() {
@@ -399,6 +400,13 @@ final class ModifierImpl implements ModelActionBuilder {
             LOG.debug("Action for {} got key {}", keys, key);
 
             final StatementContextBase<?, ?, ?> target = contextImpl(value);
+            if (!target.isSupportedByFeatures()) {
+                LOG.debug("Key {} in {} is not supported", key, keys);
+                resolvePrereq(null);
+                action.prerequisiteUnavailable(this);
+                return;
+            }
+
             if (!it.hasNext()) {
                 target.addMutation(modPhase, this);
                 resolvePrereq((C) value);
index c93ff44a1c24e80a74afe8e777c0a2b4aa9b9e60..011b991a67b078717915d7f3b0d6130ce326d003 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.yangtools.yang.parser.spi.meta;
 
 import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.EFFECTIVE_MODEL;
 
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
@@ -122,6 +124,21 @@ public interface ModelActionBuilder {
          *                            the issue in sources.
          */
         void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed);
+
+        /**
+         * Invoked once the prerequisite is deemed unavailable due to conformance reasons. This typically happens when
+         * a feature-dependent prerequisite does not have the appropriate feature activated.
+         *
+         * <p>
+         * The default implementation invokes {@link #prerequisiteFailed(Collection)}, implementations should override
+         * this method if they wish, for example, to ignore the missing prerequisite.
+         *
+         * @param unavail Unavailable prerequisite
+         */
+        @Beta
+        default void prerequisiteUnavailable(final Prerequisite<?> unavail) {
+            prerequisiteFailed(ImmutableList.of(unavail));
+        }
     }
 
     /**