+ private GroupingBuilder getTargetGrouping(
+ final UsesNodeBuilder usesBuilder,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ final int line = usesBuilder.getLine();
+ String groupingString = usesBuilder.getGroupingName();
+ String groupingPrefix;
+ String groupingName;
+
+ if(groupingString.contains(":")) {
+ String[] splitted = groupingString.split(":");
+ if(splitted.length != 2 || groupingString.contains("/")) {
+ throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
+ }
+ groupingPrefix = splitted[0];
+ groupingName = splitted[1];
+ } else {
+ groupingPrefix = module.getPrefix();
+ groupingName = groupingString;
+ }
+
+ ModuleBuilder dependentModule = null;
+ if(groupingPrefix.equals(module.getPrefix())) {
+ dependentModule = module;
+ } else {
+ dependentModule = findDependentModule(modules, module, groupingPrefix, line);
+ }
+
+
+ List<QName> path = usesBuilder.getPath().getPath();
+ GroupingBuilder result = null;
+ Set<GroupingBuilder> groupings = dependentModule.getModuleGroupings();
+ result = findGrouping(groupings, groupingName);
+
+ if (result == null) {
+ Builder currentNode = null;
+ final List<String> currentPath = new ArrayList<String>();
+ currentPath.add(dependentModule.getName());
+
+ for (int i = 0; i < path.size(); i++) {
+ QName qname = path.get(i);
+ currentPath.add(qname.getLocalName());
+ currentNode = dependentModule.getModuleNode(currentPath);
+
+ if (currentNode instanceof RpcDefinitionBuilder) {
+ groupings = ((RpcDefinitionBuilder) currentNode).getGroupings();
+ } else if (currentNode instanceof DataNodeContainerBuilder) {
+ groupings = ((DataNodeContainerBuilder) currentNode).getGroupings();
+ } else {
+ groupings = Collections.emptySet();
+ }
+
+ result = findGrouping(groupings, groupingName);
+ if (result != null) {
+ break;
+ }
+ }
+ }
+
+ if (result != null) {
+ return result;
+ }
+ throw new YangParseException(module.getName(), line,
+ "Referenced grouping '" + groupingName + "' not found.");
+ }
+
+ private GroupingBuilder findGrouping(Set<GroupingBuilder> groupings,
+ String name) {
+ for (GroupingBuilder grouping : groupings) {
+ if (grouping.getQName().getLocalName().equals(name)) {
+ return grouping;
+ }
+ }
+ return null;
+ }
+