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%2FTypedefStatementImpl.java;h=e149b628cf2c5e780ddca18dc7c44e73b3cbd8cd;hb=c47f428aedb1a9555564c11d851f41d7d030f054;hp=595c280e87109b6d05c519b2f878a3b20996c36b;hpb=6af38a495f688cbfa0ff2c09db7e62e4d530bb3a;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java index 595c280e87..e149b628cf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,54 +7,84 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; - -import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; +import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; 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.AbstractQNameStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nullable; - -public class TypedefStatementImpl extends AbstractDeclaredStatement - implements TypedefStatement { - - protected TypedefStatementImpl( - StmtContext context) { +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.TypeDefEffectiveStatementImpl; + +public class TypedefStatementImpl extends AbstractDeclaredStatement implements TypedefStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping + .TYPEDEF) + .addOptional(YangStmtMapping.DEFAULT) + .addOptional(YangStmtMapping.DESCRIPTION) + .addOptional(YangStmtMapping.REFERENCE) + .addOptional(YangStmtMapping.STATUS) + .addMandatory(YangStmtMapping.TYPE) + .addOptional(YangStmtMapping.UNITS) + .build(); + + protected TypedefStatementImpl(final StmtContext context) { super(context); } - public static class Definition - extends - AbstractStatementSupport> { + public static class Definition extends + AbstractQNameStatementSupport> { public Definition() { - super(Rfc6020Mapping.TYPEDEF); + super(YangStmtMapping.TYPEDEF); } @Override - public QName parseArgumentValue(StmtContext ctx, String value) - throws SourceException { - return Utils.qNameFromArgument(ctx, value); + public QName parseArgumentValue(final StmtContext ctx, final String value) { + return StmtContextUtils.qnameFromArgument(ctx, value); } @Override - public TypedefStatement createDeclared( - StmtContext ctx) { + public TypedefStatement createDeclared(final StmtContext ctx) { return new TypedefStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { - throw new UnsupportedOperationException(); + final StmtContext> ctx) { + return new TypeDefEffectiveStatementImpl(ctx); + } + + @Override + public void onFullDefinitionDeclared(final StmtContext.Mutable> stmt) { + super.onFullDefinitionDeclared(stmt); + + if (stmt != null && stmt.getParentContext() != null) { + final StmtContext existing = stmt.getParentContext() + .getFromNamespace(TypeNamespace.class, stmt.getStatementArgument()); + SourceException.throwIf(existing != null, stmt.getStatementSourceReference(), + "Duplicate name for typedef %s", stmt.getStatementArgument()); + + stmt.getParentContext().addContext(TypeNamespace.class, stmt.getStatementArgument(), stmt); + } + } + + @Override + protected SubstatementValidator getSubstatementValidator() { + return SUBSTATEMENT_VALIDATOR; } } @@ -76,6 +106,7 @@ public class TypedefStatementImpl extends AbstractDeclaredStatement return firstDeclared(ReferenceStatement.class); } + @Nonnull @Override public TypeStatement getType() { return firstDeclared(TypeStatement.class); @@ -86,9 +117,15 @@ public class TypedefStatementImpl extends AbstractDeclaredStatement return firstDeclared(UnitsStatement.class); } + @Nonnull @Override public QName getName() { return argument(); } + @Nullable + @Override + public DefaultStatement getDefault() { + return firstDeclared(DefaultStatement.class); + } }