X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FExtensionStatementImpl.java;h=9a09f2b4abe1454ef16dc609524a5f57791cb2b3;hb=91f43b1ce6453fef9e04e6673e7637fb5dba8b38;hp=062a3e90a7804fafbe3bd5155e8149cd1ec262d6;hpb=0de136825605fc7c15b49bdb1841ff5ea48d8a21;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 062a3e90a7..9a09f2b4ab 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,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import java.util.HashSet; +import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -20,6 +22,7 @@ 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 { @@ -31,29 +34,48 @@ public class ExtensionStatementImpl extends AbstractDeclaredStatement imp .add(Rfc6020Mapping.STATUS, 0, 1) .build(); - protected ExtensionStatementImpl(StmtContext context) { + protected ExtensionStatementImpl(final StmtContext context) { super(context); } public static class Definition extends AbstractStatementSupport> { + private static final ThreadLocal>> BUILDING = new ThreadLocal<>(); public Definition() { super(Rfc6020Mapping.EXTENSION); } @Override - public QName parseArgumentValue(StmtContext ctx, String 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) { + Set> building = BUILDING.get(); + if (building == null) { + building = new HashSet<>(); + BUILDING.set(building); + } + + SourceException.throwIf(building.contains(ctx), ctx.getStatementSourceReference(), + "Extension %s references itself", ctx.getStatementArgument()); + + building.add(ctx); + try { + return new ExtensionEffectiveStatementImpl(ctx); + } finally { + building.remove(ctx); + if (building.isEmpty()) { + BUILDING.remove(); + } + } } @Override @@ -62,7 +84,7 @@ public class ExtensionStatementImpl extends AbstractDeclaredStatement imp } @Override - public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) { super.onFullDefinitionDeclared(stmt); SUBSTATEMENT_VALIDATOR.validate(stmt);