X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FExtensionStatementImpl.java;h=f9ec24290d8b117e56292ddeafd2556e0a18be12;hb=07a461a735316f15f9a78455e1c1c3caf91b2a3e;hp=2e9c54ffdd57abdf1be777a57ddc3719311f86c4;hpb=f1c55073f8d7631007c01a401346cc83383e5745;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java index 2e9c54ffdd..f9ec24290d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java @@ -7,47 +7,82 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ExtensionEffectiveStatementImpl; - -import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ExtensionEffectiveStatementImpl; public class ExtensionStatementImpl extends AbstractDeclaredStatement implements ExtensionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .EXTENSION) + .add(Rfc6020Mapping.ARGUMENT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .build(); - protected ExtensionStatementImpl(StmtContext context) { + protected ExtensionStatementImpl(final StmtContext context) { super(context); } public static class Definition extends AbstractStatementSupport> { - public Definition() { super(Rfc6020Mapping.EXTENSION); } @Override - public QName parseArgumentValue(StmtContext ctx, String value) { - return Utils.qNameFromArgument(ctx,value); + public QName parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.qNameFromArgument(ctx, value); } @Override - public ExtensionStatement createDeclared(StmtContext ctx) { + public ExtensionStatement createDeclared(final StmtContext ctx) { return new ExtensionStatementImpl(ctx); } @Override - public EffectiveStatement createEffective(StmtContext> ctx) { - return new ExtensionEffectiveStatementImpl(ctx); + public EffectiveStatement createEffective( + final StmtContext> ctx) { + + // Look at the thread-local leak in case we are invoked recursively + final ExtensionEffectiveStatementImpl existing = RecursiveObjectLeaker.lookup(ctx, + ExtensionEffectiveStatementImpl.class); + if (existing != null) { + // Careful! this not fully initialized! + return existing; + } + + RecursiveObjectLeaker.beforeConstructor(ctx); + try { + // This result is fine, we know it has been completely initialized + return new ExtensionEffectiveStatementImpl(ctx); + } finally { + RecursiveObjectLeaker.afterConstructor(ctx); + } } + @Override + public void onStatementDefinitionDeclared(final StmtContext.Mutable> stmt) throws SourceException { + stmt.addContext(ExtensionNamespace.class, stmt.getStatementArgument(), stmt); + } + + @Override + public void onFullDefinitionDeclared(final StmtContext.Mutable> stmt) { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override