From 2304852dd4e9fd10aba78078c4d413bd6ec8e76f Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 23 Nov 2021 13:45:27 +0100 Subject: [PATCH] Defer mutatesEffectiveCtxPath() hookOnto() When we are resolving statements along schema tree axis we may end up hitting a statement which is already resolved as unsupported. In that case we would end up derefencing a known-null action. Defer initialization until the action is set. JIRA: YANGTOOLS-1370 Change-Id: I5dbc7c047cbbb78b015c4d09c8b271bb218fef4b Signed-off-by: Robert Varga (cherry picked from commit 02d8511d8b1e4277a7069d1cf105269d2305f432) --- .../yang/parser/stmt/reactor/ModifierImpl.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java index d8e74317d1..d3c398996a 100644 --- a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java +++ b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java @@ -16,8 +16,10 @@ import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPha import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.function.Function; import org.eclipse.jdt.annotation.NonNull; @@ -39,13 +41,13 @@ import org.slf4j.LoggerFactory; final class ModifierImpl implements ModelActionBuilder { private static final Logger LOG = LoggerFactory.getLogger(ModifierImpl.class); - private final InferenceContext ctx = new InferenceContext() { }; - private final Set> unsatisfied = new HashSet<>(1); private final Set> mutations = new HashSet<>(1); + private final InferenceContext ctx = new InferenceContext() { }; + private List bootstraps; private InferenceAction action; - private boolean actionApplied = false; + private boolean actionApplied; private AbstractPrerequisite addReq(final AbstractPrerequisite prereq) { LOG.trace("Modifier {} adding prerequisite {}", this, prereq); @@ -250,7 +252,10 @@ final class ModifierImpl implements ModelActionBuilder { addReq(ret); addMutation(ret); - ret.hookOnto(context, namespace); + if (bootstraps == null) { + bootstraps = new ArrayList<>(1); + } + bootstraps.add(() -> ret.hookOnto(context, namespace)); return ret; } @@ -259,6 +264,10 @@ final class ModifierImpl implements ModelActionBuilder { public void apply(final InferenceAction action) { checkState(this.action == null, "Action already defined to %s", this.action); this.action = requireNonNull(action); + if (bootstraps != null) { + bootstraps.forEach(Runnable::run); + bootstraps = null; + } } private abstract class AbstractPrerequisite implements Prerequisite { -- 2.36.6