import java.util.Date;
import java.util.Objects;
import org.opendaylight.yangtools.concepts.SemVer;
-import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
+import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.ModuleImport;
import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException;
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.source.ImpPrefixToSemVerModuleIdentifier;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
-public class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase<String, ImportStatement> implements
- ModuleImport {
+public class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase<String, ImportStatement>
+ implements ModuleImport {
private final String moduleName;
private final Date revision;
super(ctx);
moduleName = ctx.getStatementArgument();
- PrefixEffectiveStatementImpl prefixStmt = firstEffective(PrefixEffectiveStatementImpl.class);
+ final PrefixEffectiveStatementImpl prefixStmt = firstEffective(PrefixEffectiveStatementImpl.class);
if (prefixStmt != null) {
this.prefix = prefixStmt.argument();
} else {
}
if (!ctx.isEnabledSemanticVersioning()) {
- RevisionDateEffectiveStatementImpl revisionDateStmt = firstEffective(RevisionDateEffectiveStatementImpl.class);
- this.revision = (revisionDateStmt == null) ? SimpleDateFormatUtil.DEFAULT_DATE_IMP : revisionDateStmt
- .argument();
+ final RevisionDateEffectiveStatementImpl revisionDateStmt = firstEffective(
+ RevisionDateEffectiveStatementImpl.class);
+ this.revision = revisionDateStmt == null ? getImportedRevision(ctx) : revisionDateStmt.argument();
this.semVer = Module.DEFAULT_SEMANTIC_VERSION;
} else {
- ModuleIdentifier importedModuleIdentifier = ctx.getFromNamespace(ImpPrefixToSemVerModuleIdentifier.class, prefix);
+ final ModuleIdentifier importedModuleIdentifier = ctx.getFromNamespace(
+ ImpPrefixToSemVerModuleIdentifier.class, prefix);
revision = importedModuleIdentifier.getRevision();
semVer = importedModuleIdentifier.getSemanticVersion();
}
- DescriptionEffectiveStatementImpl descriptionStmt = firstEffective(DescriptionEffectiveStatementImpl.class);
- this.description = (descriptionStmt != null) ? descriptionStmt.argument() : null;
+ final DescriptionEffectiveStatementImpl descriptionStmt = firstEffective(
+ DescriptionEffectiveStatementImpl.class);
+ this.description = descriptionStmt != null ? descriptionStmt.argument() : null;
- ReferenceEffectiveStatementImpl referenceStmt = firstEffective(ReferenceEffectiveStatementImpl.class);
- this.reference = (referenceStmt != null) ? referenceStmt.argument() : null;
+ final ReferenceEffectiveStatementImpl referenceStmt = firstEffective(ReferenceEffectiveStatementImpl.class);
+ this.reference = referenceStmt != null ? referenceStmt.argument() : null;
+ }
+
+ private Date getImportedRevision(final StmtContext<String, ImportStatement, ?> ctx) {
+ /*
+ * When 'revision-date' of an import is not specified in yang source, we
+ * need to find revision of imported module.
+ */
+ final QNameModule importedModule = StmtContextUtils.getModuleQNameByPrefix(ctx, this.prefix);
+ SourceException.throwIfNull(importedModule, ctx.getStatementSourceReference(),
+ "Unable to find import of module %s with prefix %s.", this.moduleName, this.prefix);
+ return importedModule.getRevision();
}
@Override
if (getClass() != obj.getClass()) {
return false;
}
- ImportEffectiveStatementImpl other = (ImportEffectiveStatementImpl) obj;
+ final ImportEffectiveStatementImpl other = (ImportEffectiveStatementImpl) obj;
return Objects.equals(moduleName, other.moduleName) && Objects.equals(revision, other.revision)
&& Objects.equals(semVer, other.semVer) && Objects.equals(prefix, other.prefix)
&& Objects.equals(description, other.description) && Objects.equals(reference, other.reference);