From db661065bcca7984ffd18177d36b83806bbfd612 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 31 Jul 2018 15:21:19 +0200 Subject: [PATCH] Rework identifier path subscription Rather than creating multiple prerequisites, define the logic inside a dedicated class, which gets reused. JIRA: YANGTOOLS-859 Change-Id: I25259bd4571bc684b0f25d9d058efd5ff1d7798b Signed-off-by: Robert Varga (cherry picked from commit bcd7ebad233e98d1774e861676149af63854bc48) --- .../parser/stmt/reactor/ModifierImpl.java | 114 ++++++++++-------- .../parser/spi/meta/ModelActionBuilder.java | 3 +- 2 files changed, 64 insertions(+), 53 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 3b7972b26f..838db6aade 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 @@ -7,13 +7,14 @@ */ 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 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; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; -import com.google.common.base.Preconditions; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -58,7 +59,7 @@ final class ModifierImpl implements ModelActionBuilder { } private void checkNotRegistered() { - Preconditions.checkState(action == null, "Action was already registered."); + checkState(action == null, "Action was already registered."); } private boolean removeSatisfied() { @@ -85,7 +86,7 @@ final class ModifierImpl implements ModelActionBuilder { } private void applyAction() { - Preconditions.checkState(!actionApplied); + checkState(!actionApplied); action.apply(ctx); actionApplied = true; } @@ -128,19 +129,21 @@ final class ModifierImpl implements ModelActionBuilder { final K key, final ModelProcessingPhase phase) { checkNotRegistered(); - PhaseModificationInNamespace mod = createModification(phase); + final PhaseModificationInNamespace mod = new PhaseModificationInNamespace<>(EFFECTIVE_MODEL); + addReq(mod); + addMutation(mod); contextImpl(context).onNamespaceItemAddedAction((Class) namespace, key, mod); return mod; } private static StatementContextBase contextImpl(final Object value) { - Preconditions.checkArgument(value instanceof StatementContextBase, - "Supplied context %s is not provided by this reactor.", value); + checkArgument(value instanceof StatementContextBase, "Supplied context %s is not provided by this reactor.", + value); return StatementContextBase.class.cast(value); } boolean tryApply() { - Preconditions.checkState(action != null, "Action was not defined yet."); + checkState(action != null, "Action was not defined yet."); if (removeSatisfied()) { applyAction(); @@ -250,53 +253,22 @@ final class ModifierImpl implements ModelActionBuilder { 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); + final PhaseModificationInNamespacePath, K, N> ret = new PhaseModificationInNamespacePath<>( + EFFECTIVE_MODEL, namespace, keys); 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); - } + contextImpl(context).onNamespaceItemAddedAction((Class) namespace, ret.nextKey(), ret); + return ret; } @Override @SuppressWarnings("checkstyle:hiddenField") public void apply(final InferenceAction action) { - Preconditions.checkState(this.action == null, "Action already defined to %s", this.action); - this.action = Preconditions.checkNotNull(action); + checkState(this.action == null, "Action already defined to %s", this.action); + this.action = requireNonNull(action); } private abstract class AbstractPrerequisite implements Prerequisite { @@ -306,8 +278,8 @@ final class ModifierImpl implements ModelActionBuilder { @Override @SuppressWarnings("checkstyle:hiddenField") public final T resolve(final InferenceContext ctx) { - Preconditions.checkState(done); - Preconditions.checkArgument(ctx == ModifierImpl.this.ctx); + checkState(done); + checkArgument(ctx == ModifierImpl.this.ctx); return value; } @@ -336,7 +308,7 @@ final class ModifierImpl implements ModelActionBuilder { } } - private class PhaseMutation extends AbstractPrerequisite implements ContextMutation { + private final class PhaseMutation extends AbstractPrerequisite implements ContextMutation { @SuppressWarnings("unchecked") PhaseMutation(final StatementContextBase context, final ModelProcessingPhase phase) { context.addMutation(phase, this); @@ -349,7 +321,7 @@ final class ModifierImpl implements ModelActionBuilder { } } - private class PhaseFinished> extends AbstractPrerequisite + private final class PhaseFinished> extends AbstractPrerequisite implements OnPhaseFinished { @SuppressWarnings("unchecked") @Override @@ -359,14 +331,14 @@ final class ModifierImpl implements ModelActionBuilder { } } - private class NamespaceMutation> + private final class NamespaceMutation> extends AbstractPrerequisite> { NamespaceMutation(final StatementContextBase ctx, final Class namespace) { resolvePrereq(ctx); } } - private class AddedToNamespace> extends AbstractPrerequisite + private final class AddedToNamespace> extends AbstractPrerequisite implements OnNamespaceItemAdded, OnPhaseFinished { private final ModelProcessingPhase phase; @@ -393,12 +365,12 @@ final class ModifierImpl implements ModelActionBuilder { } } - private class PhaseModificationInNamespace> extends AbstractPrerequisite + private final class PhaseModificationInNamespace> extends AbstractPrerequisite implements OnNamespaceItemAdded, ContextMutation { private final ModelProcessingPhase modPhase; PhaseModificationInNamespace(final ModelProcessingPhase phase) { - Preconditions.checkArgument(phase != null, "Model processing phase must not be null"); + checkArgument(phase != null, "Model processing phase must not be null"); this.modPhase = phase; } @@ -416,4 +388,42 @@ final class ModifierImpl implements ModelActionBuilder { return isApplied(); } } + + private final class PhaseModificationInNamespacePath, K, + N extends IdentifierNamespace>> extends AbstractPrerequisite + implements OnNamespaceItemAdded, ContextMutation { + private final ModelProcessingPhase modPhase; + private final Iterable keys; + private final Iterator it; + + PhaseModificationInNamespacePath(final ModelProcessingPhase phase, final Class namespace, + final Iterable keys) { + this.modPhase = requireNonNull(phase); + this.keys = requireNonNull(keys); + it = keys.iterator(); + checkArgument(it.hasNext(), "Namespace %s keys may not be empty", namespace); + } + + K nextKey() { + return it.next(); + } + + @Override + public boolean isFinished() { + return isApplied(); + } + + @Override + public void namespaceItemAdded(final StatementContextBase context, final Class namespace, + final Object key, final Object value) { + LOG.debug("Action for {} got key {}", keys, key); + if (!it.hasNext()) { + resolvePrereq((C) value); + return; + } + + final K next = nextKey(); + contextImpl(value).onNamespaceItemAddedAction((Class) namespace, next, this); + } + } } 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 2e674d02ef..b50b00924f 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 @@ -176,7 +176,8 @@ public interface ModelActionBuilder { default @Nonnull , N extends IdentifierNamespace>> Prerequisite> - mutatesEffectiveCtxPath(StmtContext context, Class namespace, Iterable keys) { + mutatesEffectiveCtxPath(final StmtContext context, final Class namespace, + final Iterable keys) { throw new UnsupportedOperationException(getClass() + " does not implement mutatesEffectiveCtxPath()"); } -- 2.36.6