Require full declaration during path traversal 45/104845/12
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 13 Mar 2023 15:32:33 +0000 (16:32 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 3 Jun 2023 07:51:31 +0000 (09:51 +0200)
Establishing whether a particular statement is supported by features
requires it to be fully declared. Add an explicit an intermediate
OnPhaseCompleted in which we evaluate things.

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

index 2afe1b9927642f5710cd67dad2cd6793e49fa824..a2f1f77d17a5a8cbb47e52c64459efbda236676d 100644 (file)
@@ -333,26 +333,24 @@ final class ModifierImpl implements ModelActionBuilder {
                 final ParserNamespace<?, ?> namespace, final Object key, final Object value) {
             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);
-                modifier.action.prerequisiteUnavailable(this);
-                return;
-            }
-
-            nextStep(context, target);
-
-            if (!it.hasNext()) {
-                // Last step: we are done
-                if (resolvePrereq((C) value)) {
-                    modifier.tryApply();
+            contextImpl(value).addPhaseCompletedListener(FULL_DECLARATION, (target, ignored) -> {
+                if (target.isSupportedByFeatures()) {
+                    nextStep(context, target);
+
+                    if (it.hasNext()) {
+                        // Make sure target's storage notifies us when the next step becomes available.
+                        hookOnto(target, namespace, it.next());
+                    } else if (resolvePrereq((C) target)) {
+                        modifier.tryApply();
+                    }
+                } else {
+                    LOG.debug("Key {} in {} is not supported", key, keys);
+                    resolvePrereq(null);
+                    modifier.action.prerequisiteUnavailable(this);
                 }
-                return;
-            }
 
-            // Make sure target's storage notifies us when the next step becomes available.
-            hookOnto(target, namespace, it.next());
+                return true;
+            });
         }
 
         abstract void nextStep(StatementContextBase<?, ?, ?> current, StatementContextBase<?, ?, ?> next);