public final class YangParserImpl implements YangModelParser {
private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class);
-
+
private static final String FAIL_DEVIATION_TARGET = "Failed to find deviation target.";
@Override
findUsesTargets(modules, null);
resolveDirtyNodes(modules);
resolveAugments(modules);
- resolveUses(modules);
+ resolveUses(modules, false);
resolveDeviations(modules);
// build
findUsesTargets(modules, context);
resolvedDirtyNodesWithContext(modules, context);
resolveAugmentsWithContext(modules, context);
- resolveUsesWithContext(modules);
+ resolveUses(modules, true);
resolveDeviationsWithContext(modules, context);
// build
/**
* Search for dirty nodes (node which contains UnknownType) and resolve
* unknown types.
- *
+ *
* @param modules
* all available modules
* @param module
/**
* Go through all augment definitions and perform augmentation. It is
* expected that modules are already sorted by their dependencies.
- *
+ *
* @param modules
* all loaded modules
*/
/**
* Search for augment target and perform augmentation.
- *
+ *
* @param modules
* all loaded modules
* @param augmentBuilder
* Go through all augment definitions and resolve them. This method works in
* same way as {@link #resolveAugments(Map)} except that if target node is
* not found in loaded modules, it search for target node in given context.
- *
+ *
* @param modules
* all loaded modules
* @param context
/**
* Search for augment target and perform augmentation.
- *
+ *
* @param modules
* all loaded modules
* @param augment
/**
* Go through identity statements defined in current module and resolve
* their 'base' statement if present.
- *
+ *
* @param modules
* all modules
* @param module
* Go through identity statements defined in current module and resolve
* their 'base' statement. Method tries to find base identity in given
* modules. If base identity is not found, method will search it in context.
- *
+ *
* @param modules
* all loaded modules
* @param module
/**
* Find and add reference of uses target grouping.
- *
+ *
* @param modules
* all loaded modules
* @param context
}
/**
- * Copy data from uses target, update uses parent and perform refinement.
- * Augmentations have to be resolved already.
- *
+ * Copy data from uses target. Augmentations have to be resolved already.
+ *
* @param modules
* all loaded modules
+ * @param resolveWithContext
+ * boolean value which says whether
+ * {@link GroupingUtils#collectUsesDataFromContext(UsesNodeBuilder)
+ * collectUsesDataFromContext} should be used for processing of
+ * individual uses node.
*/
- private void resolveUses(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+ private void resolveUses(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final boolean resolveWithContext) {
for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
ModuleBuilder module = inner.getValue();
usesNodes = new ArrayList<>(module.getAllUsesNodes());
for (UsesNodeBuilder usesNode : usesNodes) {
if (!usesNode.isDataCollected()) {
- GroupingUtils.collectUsesData(usesNode);
+ if (resolveWithContext && usesNode.getGroupingBuilder() == null) {
+ GroupingUtils.collectUsesDataFromContext(usesNode);
+ } else {
+ GroupingUtils.collectUsesData(usesNode);
+ }
}
}
dataCollected = module.isAllUsesDataCollected();
}
}
}
-
- // new loop is must because in collecting data process new uses could
- // be created
- final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();
- for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
- for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
- allModulesUses.addAll(inner.getValue().getAllUsesNodes());
- }
- }
-
- for (UsesNodeBuilder usesNode : allModulesUses) {
- GroupingUtils.updateUsesParent(usesNode);
- GroupingUtils.performRefine(usesNode);
- }
- for (UsesNodeBuilder usesNode : allModulesUses) {
- GroupingUtils.fixUsesNodesPath(usesNode);
- }
-
- for (UsesNodeBuilder usesNode : allModulesUses) {
- if (usesNode.isCopy()) {
- usesNode.getParent().getUsesNodes().remove(usesNode);
- }
- }
+ resolvedUsesPostProcessing(modules, resolveWithContext);
}
/**
- * Copy data from uses target, update uses parent and perform refinement.
- * Augmentations have to be resolved already.
- *
+ * Update uses parent and perform refinement.
+ *
* @param modules
* all loaded modules
+ * @param resolveWithContext
+ * boolean value which says whether
+ * {@link GroupingUtils#collectUsesDataFromContext(UsesNodeBuilder)
+ * collectUsesDataFromContext} should be used for processing of
+ * individual uses node.
*/
- private void resolveUsesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
- for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
- for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
- ModuleBuilder module = inner.getValue();
- List<UsesNodeBuilder> usesNodes = null;
- boolean dataCollected = module.isAllUsesDataCollected();
-
- while (!dataCollected) {
- usesNodes = new ArrayList<>(module.getAllUsesNodes());
- for (UsesNodeBuilder usesNode : usesNodes) {
- if (!usesNode.isDataCollected()) {
- if (usesNode.getGroupingBuilder() == null) {
- GroupingUtils.collectUsesDataFromContext(usesNode);
- } else {
- GroupingUtils.collectUsesData(usesNode);
- }
- }
- }
- dataCollected = module.isAllUsesDataCollected();
- }
- }
- }
-
+ private void resolvedUsesPostProcessing(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final boolean resolveWithContext) {
// new loop is must because in collecting data process new uses could
// be created
final List<UsesNodeBuilder> allModulesUses = new ArrayList<>();
for (UsesNodeBuilder usesNode : allModulesUses) {
GroupingUtils.fixUsesNodesPath(usesNode);
}
+
+ if (!resolveWithContext) {
+ for (UsesNodeBuilder usesNode : allModulesUses) {
+ if (usesNode.isCopy()) {
+ usesNode.getParent().getUsesNodes().remove(usesNode);
+ }
+ }
+ }
}
private void resolveUnknownNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
}
} catch (YangParseException e) {
throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb
- + ": no such extension definition found.",e);
+ + ": no such extension definition found.", e);
}
}
}
/**
* Traverse through modules and resolve their deviation statements.
- *
+ *
* @param modules
* all loaded modules
*/
/**
* Traverse through module and resolve its deviation statements.
- *
+ *
* @param modules
* all loaded modules
* @param module
/**
* Traverse through modules and resolve their deviation statements with
* given context.
- *
+ *
* @param modules
* all loaded modules
* @param context
/**
* Traverse through module and resolve its deviation statements with given
* context.
- *
+ *
* @param modules
* all loaded modules
* @param module
/**
* Correct deviation target path in deviation builder.
- *
+ *
* @param dev
* deviation
* @param dependentModuleBuilder