+
+ throw new IllegalArgumentException(
+ "Root of parsed AST must be either module or submodule");
+ }
+
+ /**
+ * Extracts {@link YangModelDependencyInfo} from input stream containing
+ * YANG model.
+ *
+ * This parsing does not validate full YANG module, only parses header up to
+ * the revisions and imports.
+ *
+ * @param yangStream
+ * Opened Input stream containing text source of YANG model
+ * @return {@link YangModelDependencyInfo}
+ * @throws IllegalArgumentException
+ * If input stream is not valid YANG stream
+ */
+ public static YangModelDependencyInfo fromInputStream(
+ final InputStream yangStream) {
+ final StatementContext yangAST = new YangStatementSourceImpl(yangStream)
+ .getYangAST();
+ return parseAST(yangAST);
+ }
+
+ private static YangModelDependencyInfo parseModuleContext(final StatementContext module) {
+ final String name = Utils.stringFromStringContext(module.argument());
+ final String latestRevision = getLatestRevision(module);
+ final Optional<SemVer> semVer = Optional.fromNullable(getSemanticVersion(module));
+ final ImmutableSet<ModuleImport> imports = parseImports(module);
+ final ImmutableSet<ModuleImport> includes = parseIncludes(module);
+
+ return new ModuleDependencyInfo(name, latestRevision, imports, includes, semVer);
+ }
+
+ private static ImmutableSet<ModuleImport> parseImports(final StatementContext module) {
+ final Set<ModuleImport> result = new HashSet<>();
+ final List<StatementContext> subStatements = module.statement();
+ for (final StatementContext subStatementContext : subStatements) {
+ if (subStatementContext
+ .keyword()
+ .getText()
+ .equals(Rfc6020Mapping.IMPORT.getStatementName()
+ .getLocalName())) {
+ final String revisionDateStr = getRevisionDateString(subStatementContext);
+ final String importedModuleName = Utils
+ .stringFromStringContext(subStatementContext.argument());
+ final Date revisionDate = (revisionDateStr == null) ? null : QName
+ .parseRevision(revisionDateStr);
+ final Optional<SemVer> importSemVer = Optional.fromNullable(getSemanticVersion(subStatementContext));
+ result.add(new ModuleImportImpl(importedModuleName,
+ revisionDate, importSemVer));
+ }