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=144b7f1cdd87973dc236de76e0351517a9ba1311;hpb=7bb6ae1269659c12efc127b97cc750ed81ecaac6;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 144b7f1cdd..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) @@ -32,6 +41,8 @@ public final class ExtensionStatementSupport .addOptional(YangStmtMapping.STATUS) .build(); private static final ExtensionStatementSupport INSTANCE = new ExtensionStatementSupport(); + private static final ThreadLocal, ExtensionEffectiveStatementImpl>> TL_BUILDERS = + new ThreadLocal<>(); private ExtensionStatementSupport() { super(YangStmtMapping.EXTENSION); @@ -46,17 +57,6 @@ public final class ExtensionStatementSupport return StmtContextUtils.parseIdentifier(ctx, value); } - @Override - public ExtensionStatement createDeclared(final StmtContext ctx) { - return new ExtensionStatementImpl(ctx); - } - - @Override - public ExtensionEffectiveStatement createEffective( - final StmtContext ctx) { - return ExtensionEffectiveStatementImpl.create(ctx); - } - @Override public void onStatementDefinitionDeclared( final Mutable stmt) { @@ -75,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()))); + 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