X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Fextension%2FExtensionStatementSupport.java;h=32cb7031607788eaa97480489623f20e15e0a3a3;hb=223f7753e408b981b0f077d14ede44b8037425c8;hp=0eb741f0f5bc925c977c9f286cf2b891db4cd0ae;hpb=1cc6359e5bae1459582e9262a24ca56f23bcc70f;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java index 0eb741f0f5..32cb703160 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ExtensionStatementSupport.java @@ -7,15 +7,24 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension; +import static com.google.common.base.Verify.verify; +import static com.google.common.base.Verify.verifyNotNull; + +import com.google.common.collect.ImmutableList; +import java.util.IdentityHashMap; +import java.util.Map; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementDefinitionNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; @@ -23,7 +32,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; public final class ExtensionStatementSupport - extends AbstractQNameStatementSupport> { + extends BaseQNameStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .EXTENSION) .addOptional(YangStmtMapping.ARGUMENT) @@ -31,33 +40,29 @@ public final class ExtensionStatementSupport .addOptional(YangStmtMapping.REFERENCE) .addOptional(YangStmtMapping.STATUS) .build(); + private static final ExtensionStatementSupport INSTANCE = new ExtensionStatementSupport(); + private static final ThreadLocal, ExtensionEffectiveStatementImpl>> TL_BUILDERS = + new ThreadLocal<>(); - public ExtensionStatementSupport() { + private ExtensionStatementSupport() { super(YangStmtMapping.EXTENSION); } - @Override - public QName parseArgumentValue(final StmtContext ctx, final String value) { - return StmtContextUtils.qnameFromArgument(ctx, value); - } - - @Override - public ExtensionStatement createDeclared(final StmtContext ctx) { - return new ExtensionStatementImpl(ctx); + public static ExtensionStatementSupport getInstance() { + return INSTANCE; } @Override - public EffectiveStatement createEffective( - final StmtContext> ctx) { - return ExtensionEffectiveStatementImpl.create(ctx); + public QName parseArgumentValue(final StmtContext ctx, final String value) { + return StmtContextUtils.parseIdentifier(ctx, value); } @Override public void onStatementDefinitionDeclared( - final Mutable> stmt) { + final Mutable stmt) { super.onStatementDefinitionDeclared(stmt); - QName stmtName = stmt.getStatementArgument(); + QName stmtName = stmt.coerceStatementArgument(); if (OpenConfigStatements.OPENCONFIG_VERSION.getStatementName().isEqualWithoutRevision(stmtName)) { stmtName = stmtName.withoutRevision(); } @@ -70,13 +75,79 @@ public final class ExtensionStatementSupport YinElementStatement.class); stmt.addToNs(StatementDefinitionNamespace.class, stmt.getStatementArgument(), - new ModelDefinedStatementSupport(new ModelDefinedStatementDefinition(stmt.getStatementArgument(), + new ModelDefinedStatementSupport(new ModelDefinedStatementDefinition(stmt.coerceStatementArgument(), argument != null ? argument.getStatementArgument() : null, - yinElement != null ? yinElement.getStatementArgument() : false))); + yinElement != null && yinElement.coerceStatementArgument()))); } @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } + + @Override + protected ExtensionStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularExtensionStatement(ctx.coerceStatementArgument(), substatements); + } + + @Override + protected ExtensionStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyExtensionStatement(ctx.coerceStatementArgument()); + } + + @Override + public ExtensionEffectiveStatement createEffective( + final StmtContext ctx) { + Map, ExtensionEffectiveStatementImpl> tl = TL_BUILDERS.get(); + if (tl == null) { + tl = new IdentityHashMap<>(); + TL_BUILDERS.set(tl); + } + + final ExtensionEffectiveStatementImpl existing = tl.get(ctx); + if (existing != null) { + // Implies non-empty map, no cleanup necessary + return existing; + } + + try { + final ExtensionEffectiveStatementImpl created = new ExtensionEffectiveStatementImpl(ctx.buildDeclared(), + ctx.getSchemaPath().get()); + verify(tl.put(ctx, created) == null); + try { + return super.createEffective(ctx); + } finally { + verify(tl.remove(ctx) == created); + + } + } finally { + if (tl.isEmpty()) { + TL_BUILDERS.remove(); + } + } + } + + @Override + protected ExtensionEffectiveStatement createEffective( + final StmtContext ctx, + final ExtensionStatement declared, + final ImmutableList> substatements) { + return finishCreate(ctx, substatements); + } + + @Override + protected ExtensionEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final ExtensionStatement declared) { + return finishCreate(ctx, ImmutableList.of()); + } + + private static @NonNull ExtensionEffectiveStatement finishCreate(final StmtContext ctx, + final ImmutableList> substatements) { + final ExtensionEffectiveStatementImpl ret = verifyNotNull(verifyNotNull(TL_BUILDERS.get(), + "Statement build state not initialized").get(ctx), "No build state found for %s", ctx); + ret.setSubstatements(substatements); + return ret; + } } \ No newline at end of file