diff --git a/yangkit-model-api/src/main/java/org/yangcentral/yangkit/model/api/schema/ModuleSet.java b/yangkit-model-api/src/main/java/org/yangcentral/yangkit/model/api/schema/ModuleSet.java index 9fe5a790..ba056523 100644 --- a/yangkit-model-api/src/main/java/org/yangcentral/yangkit/model/api/schema/ModuleSet.java +++ b/yangkit-model-api/src/main/java/org/yangcentral/yangkit/model/api/schema/ModuleSet.java @@ -63,10 +63,28 @@ public YangModuleDescription getModule(String moduleName) { return moduleDescription; } + public YangModuleDescription removeModule(String moduleName){ + int size = this.modules.size(); + for(int i = 0; i < size;i++){ + if(moduleName.equals(this.modules.get(i).getModuleId().getModuleName())){ + return this.modules.remove(i); + } + } + return null; + } + public void addImportOnlyModule(YangModuleDescription module) { this.importOnlyModules.add(module); } - + public YangModuleDescription removeImportOnlyModule(ModuleId moduleId){ + int size = this.importOnlyModules.size(); + for(int i = 0; i < size;i++){ + if(moduleId.equals(this.modules.get(i).getModuleId())){ + return this.importOnlyModules.remove(i); + } + } + return null; + } public YangModuleDescription getImportOnlyModule(ModuleId moduleId) { Iterator moduleDescriptionIterator = this.importOnlyModules.iterator(); diff --git a/yangkit-parser/src/main/java/org/yangcentral/yangkit/parser/YangYinParser.java b/yangkit-parser/src/main/java/org/yangcentral/yangkit/parser/YangYinParser.java index a80e2d23..7da33b6b 100644 --- a/yangkit-parser/src/main/java/org/yangcentral/yangkit/parser/YangYinParser.java +++ b/yangkit-parser/src/main/java/org/yangcentral/yangkit/parser/YangYinParser.java @@ -17,10 +17,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; public class YangYinParser { static { @@ -182,6 +179,20 @@ public static YangSchemaContext parse(String yangDir, List capabilit return schemaContext; } + private static Map searchDependencyChain(YangSchemaContext schemaContext,Module module){ + Map moduleMap = new HashMap<>(); + List dependencies = module.getDependencies(); + for(Module dependency: dependencies){ + Optional moduleOp = schemaContext.getModule(dependency.getModuleId()); + if(!moduleOp.isPresent()){ + //if not found, add + moduleMap.putIfAbsent(dependency.getModuleId(),dependency); + } + moduleMap.putAll(searchDependencyChain(schemaContext,dependency)); + } + return moduleMap; + } + public static YangSchemaContext filter(@Nonnull YangSchemaContext schemaContext, @Nonnull List capabilityList){ List unMatchedModules = new ArrayList<>(); ModuleSet moduleSet = CapabilityParser.toModuleSet(capabilityList); @@ -224,15 +235,16 @@ public static YangSchemaContext filter(@Nonnull YangSchemaContext schemaContext, schemaContext.addImportOnlyModule(importOnlyModule); } + Map moduleMap = new HashMap<>(); for (Module module : schemaContext.getModules()){ - List dependencies = module.getDependencies(); - for(Module dependency: dependencies){ - Optional moduleOp = schemaContext.getModule(dependency.getModuleId()); - if(!moduleOp.isPresent()){ - schemaContext.addImportOnlyModule(dependency); - moduleSet.addImportOnlyModule(new YangModuleDescription(dependency.getModuleId())); - } - } + moduleMap.putAll(searchDependencyChain(schemaContext,module)); + } + + Iterator> it = moduleMap.entrySet().iterator(); + while (it.hasNext()){ + Map.Entry entry = it.next(); + schemaContext.addImportOnlyModule(entry.getValue()); + moduleSet.addImportOnlyModule(new YangModuleDescription(entry.getValue().getModuleId())); } YangSchema yangSchema = schemaContext.getYangSchema();