+ @Override
+ public Set<Module> parseYangModels(final File yangFile, final File directory) {
+ Preconditions.checkState(yangFile.exists(), yangFile + " does not exists");
+ Preconditions.checkState(directory.exists(), directory + " does not exists");
+ Preconditions.checkState(directory.isDirectory(), directory + " is not a directory");
+
+ final String yangFileName = yangFile.getName();
+ final String[] fileList = directory.list();
+ Preconditions.checkNotNull(fileList, directory + " not found");
+
+ FileInputStream yangFileStream = null;
+ LinkedHashMap<InputStream, File> streamToFileMap = new LinkedHashMap<>();
+
+ try {
+ yangFileStream = new FileInputStream(yangFile);
+ streamToFileMap.put(yangFileStream, yangFile);
+ } catch(FileNotFoundException e) {
+ LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);
+ }
+
+ for (String fileName : fileList) {
+ if (fileName.equals(yangFileName)) {
+ continue;
+ }
+ File dependency = new File(directory, fileName);
+ try {
+ if (dependency.isFile()) {
+ streamToFileMap.put(new FileInputStream(dependency), dependency);
+ }
+ } catch(FileNotFoundException e) {
+ LOG.warn("Exception while reading yang file: " + fileName, e);
+ }
+ }
+
+ Map<InputStream, ModuleBuilder> parsedBuilders = parseModuleBuilders(
+ new ArrayList<>(streamToFileMap.keySet()), new HashMap<ModuleBuilder, InputStream>());
+ ModuleBuilder main = parsedBuilders.get(yangFileStream);
+
+ List<ModuleBuilder> moduleBuilders = new ArrayList<>();
+ moduleBuilders.add(main);
+ filterImports(main, new ArrayList<>(parsedBuilders.values()), moduleBuilders);
+
+ ModuleBuilder[] builders = new ModuleBuilder[moduleBuilders.size()];
+ moduleBuilders.toArray(builders);
+
+ // module dependency graph sorted
+ List<ModuleBuilder> sorted = ModuleDependencySort.sort(builders);
+
+ final LinkedHashMap<String, TreeMap<Date, ModuleBuilder>> modules = orderModules(sorted);
+ return new LinkedHashSet<>(build(modules).values());
+ }
+