X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=parser%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Fimport_%2FImportStatementSupport.java;h=c33333204b52ea71049c43ac0634a242880151bb;hb=17fba9ed87d9811538c802da6a47d533b7d81081;hp=0ec75ec6ad323cf18008b5ec78723c5d3ffb68a9;hpb=083ef931709258bed6e0fede5eea7fe3f63ddecc;p=yangtools.git diff --git a/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java b/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java index 0ec75ec6ad..c33333204b 100644 --- a/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java +++ b/parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportStatementSupport.java @@ -19,6 +19,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.openconfig.model.api.OpenConfigStatements; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.XMLNamespace; +import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; @@ -26,13 +27,14 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; +import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators; import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements; import org.opendaylight.yangtools.yang.model.ri.stmt.EffectiveStatements; -import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode; import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration; import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStringStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.BoundStmtCtx; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; @@ -45,6 +47,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.spi.source.YangVersionLinkageException; @Beta public final class ImportStatementSupport @@ -64,11 +67,8 @@ public final class ImportStatementSupport .addOptional(YangStmtMapping.REFERENCE) .build(); - private final boolean semanticVersioning; - private ImportStatementSupport(final YangParserConfiguration config, final SubstatementValidator validator) { super(YangStmtMapping.IMPORT, StatementPolicy.reject(), config, validator); - semanticVersioning = config.importResolutionMode() == ImportResolutionMode.OPENCONFIG_SEMVER; } public static @NonNull ImportStatementSupport rfc6020Instance(final YangParserConfiguration config) { @@ -86,13 +86,14 @@ public final class ImportStatementSupport * Based on this information, required modules are searched from library * sources. */ - stmt.addRequiredSource(RevisionImport.getImportedSourceIdentifier(stmt)); + final SourceIdentifier importId = RevisionImport.getImportedSourceIdentifier(stmt); + stmt.addRequiredSource(importId); final String moduleName = stmt.getArgument(); final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE); final Prerequisite> imported = importAction.requiresCtx(stmt, PreLinkageModuleNamespace.class, moduleName, SOURCE_PRE_LINKAGE); - importAction.mutatesCtx(stmt.getRoot(), SOURCE_PRE_LINKAGE); + final Prerequisite> rootPrereq = importAction.mutatesCtx(stmt.getRoot(), SOURCE_PRE_LINKAGE); importAction.apply(new InferenceAction() { @Override @@ -105,6 +106,16 @@ public final class ImportStatementSupport firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class), stmt, "Missing prefix statement"); + final Mutable root = rootPrereq.resolve(ctx); + // Version 1 sources must not import-by-revision Version 1.1 modules + if (importId.getRevision().isPresent() && root.yangVersion() == YangVersion.VERSION_1) { + final YangVersion importedVersion = importedModuleContext.yangVersion(); + if (importedVersion != YangVersion.VERSION_1) { + throw new YangVersionLinkageException(stmt, + "Cannot import by revision version %s module %s", importedVersion, moduleName); + } + } + stmt.addToNs(ImpPrefixToNamespace.class, impPrefix, importedModuleNamespace); } @@ -118,16 +129,12 @@ public final class ImportStatementSupport @Override public void onLinkageDeclared(final Mutable stmt) { - if (semanticVersioning) { - SemanticVersionImport.onLinkageDeclared(stmt); - } else { - RevisionImport.onLinkageDeclared(stmt); - } + RevisionImport.onLinkageDeclared(stmt); } @Override - protected ImportStatement createDeclared(final StmtContext ctx, - final ImmutableList> substatements) { + protected ImportStatement createDeclared(final BoundStmtCtx ctx, + final ImmutableList> substatements) { return DeclaredStatements.createImport(ctx.getRawArgument(), substatements); } @@ -142,6 +149,6 @@ public final class ImportStatementSupport final ImmutableList> substatements) { InferenceException.throwIf(substatements.isEmpty(), stmt, "Unexpected empty effective import statement"); return EffectiveStatements.createImport(stmt.declared(), substatements, - verifyNotNull(stmt.getFromNamespace(ImportedVersionNamespace.class, Empty.getInstance()))); + verifyNotNull(stmt.getFromNamespace(ImportedVersionNamespace.class, Empty.value()))); } }