From 450b2d9f09611f3c8313ca2c64b4d1c34610bb5b Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 12 Jul 2018 11:14:45 +0200 Subject: [PATCH] Add support for incremental Prerequisites We really need a method which would allow us to follow a path, hooking incrementally to each of the elements as they appear. This patch adds the mechanics to support that lookup, rendering SchemaNodeIdentifierBuildNamespace largely superfluous, as we can perform equivalent lookups on ChildSchemaNodeNamespace. JIRA: YANGTOOLS-859 Change-Id: I7dae9559555ee6ddc95faf1f874cebac9f915c1b Signed-off-by: Robert Varga --- .../parser/stmt/reactor/ModifierImpl.java | 52 +++++++++++++++++-- .../parser/spi/meta/ModelActionBuilder.java | 6 +++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java index bf77d86805..3b7972b26f 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/ModifierImpl.java @@ -128,9 +128,7 @@ final class ModifierImpl implements ModelActionBuilder { final K key, final ModelProcessingPhase phase) { checkNotRegistered(); - PhaseModificationInNamespace mod = new PhaseModificationInNamespace<>(phase); - addReq(mod); - addMutation(mod); + PhaseModificationInNamespace mod = createModification(phase); contextImpl(context).onNamespaceItemAddedAction((Class) namespace, key, mod); return mod; } @@ -246,6 +244,54 @@ final class ModifierImpl implements ModelActionBuilder { return mutatesCtxImpl(context, namespace, key, EFFECTIVE_MODEL); } + @Nonnull + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + public , N extends IdentifierNamespace>> + AbstractPrerequisite> mutatesEffectiveCtxPath(final StmtContext context, + final Class namespace, final Iterable keys) { + final Iterator it = keys.iterator(); + Preconditions.checkArgument(it.hasNext(), "Namespace %s keys may not be empty", namespace); + checkNotRegistered(); + + final PhaseModificationInNamespace> ret = createModification(EFFECTIVE_MODEL); + contextImpl(context).onNamespaceItemAddedAction((Class) namespace, it.next(), + (parent, ns, foundKey, foundValue) -> { + checkResult((Mutable)foundValue, namespace, it, ret); + }); + return ret; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private , N extends IdentifierNamespace>> + void mutateNextKey(final StmtContext context, final Class namespace, + final Iterator it, final AbstractPrerequisite result) { + final PhaseModificationInNamespace mod = createModification(EFFECTIVE_MODEL); + contextImpl(context).onNamespaceItemAddedAction((Class) namespace, it.next(), + (parent, ns, foundKey, foundValue) -> { + checkResult((C) foundValue, namespace, it, result); + mod.resolvePrereq((C) foundValue); + }); + } + + private > PhaseModificationInNamespace createModification( + final ModelProcessingPhase phase) { + final PhaseModificationInNamespace ret = new PhaseModificationInNamespace<>(EFFECTIVE_MODEL); + addReq(ret); + addMutation(ret); + return ret; + } + + private , N extends IdentifierNamespace>> + void checkResult(final C context, final Class namespace, final Iterator it, + final AbstractPrerequisite result) { + if (it.hasNext()) { + mutateNextKey(context, namespace, it, result); + } else { + result.resolvePrereq(context); + } + } + @Override @SuppressWarnings("checkstyle:hiddenField") public void apply(final InferenceAction action) { diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java index 08d01cb9f1..2e674d02ef 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/ModelActionBuilder.java @@ -174,6 +174,12 @@ public interface ModelActionBuilder { @Nonnull , N extends IdentifierNamespace>> Prerequisite> mutatesEffectiveCtx(StmtContext context, Class namespace, K key); + default @Nonnull , + N extends IdentifierNamespace>> Prerequisite> + mutatesEffectiveCtxPath(StmtContext context, Class namespace, Iterable keys) { + throw new UnsupportedOperationException(getClass() + " does not implement mutatesEffectiveCtxPath()"); + } + /** * Action mutates the specified statement in the specified phase. Target statement cannot complete specified * phase before this action is applier. -- 2.36.6