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=986d97de12da78222ec11abab7fd4f7d0423f35b;hb=88aeb1cd912d37fcadf671b622fece9a01297e90;hp=522f5dce541bae8a7d9d9e854cb7dfbb5f46ced2;hpb=66eebf76b15eebd461acf118a59205a0ff468b06;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 522f5dce54..986d97de12 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,25 @@ */ 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 java.util.stream.Stream; 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.EffectiveStmtCtx.Current; 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 +33,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 +42,9 @@ public final class ExtensionStatementSupport .addOptional(YangStmtMapping.STATUS) .build(); private static final ExtensionStatementSupport INSTANCE = new ExtensionStatementSupport(); + // FIXME: YANGTOOLS-1185: use EffectiveStmtCtx.Current as key + private static final ThreadLocal, ExtensionEffectiveStatementImpl>> TL_BUILDERS = + new ThreadLocal<>(); private ExtensionStatementSupport() { super(YangStmtMapping.EXTENSION); @@ -43,26 +56,15 @@ public final class ExtensionStatementSupport @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); - } - - @Override - public EffectiveStatement createEffective( - final StmtContext> ctx) { - return ExtensionEffectiveStatementImpl.create(ctx); + 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(); } @@ -75,13 +77,66 @@ 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 Current stmt, + final Stream> declaredSubstatements, + final Stream> effectiveSubstatements) { + Map, ExtensionEffectiveStatementImpl> tl = TL_BUILDERS.get(); + if (tl == null) { + tl = new IdentityHashMap<>(); + TL_BUILDERS.set(tl); + } + + final StmtContext ctx = stmt.caerbannog(); + final ExtensionEffectiveStatementImpl existing = tl.get(ctx); + if (existing != null) { + // Implies non-empty map, no cleanup necessary + return existing; + } + + try { + final ExtensionEffectiveStatementImpl created = new ExtensionEffectiveStatementImpl(stmt.declared(), + stmt.getSchemaPath()); + verify(tl.put(ctx, created) == null); + try { + return super.createEffective(stmt, declaredSubstatements, effectiveSubstatements); + } finally { + verify(tl.remove(ctx) == created); + } + } finally { + if (tl.isEmpty()) { + TL_BUILDERS.remove(); + } + } + } + + @Override + protected ExtensionEffectiveStatement createEffective(final Current stmt, + final ImmutableList> substatements) { + final ExtensionEffectiveStatementImpl ret = verifyNotNull(verifyNotNull(TL_BUILDERS.get(), + "Statement build state not initialized").get(stmt.caerbannog()), "No build state found for %s", stmt); + ret.setSubstatements(substatements); + return ret; + } } \ No newline at end of file