*/
package org.opendaylight.yangtools.yang.parser.builder.impl;
+import com.google.common.base.Splitter;
+import java.net.URI;
import java.util.Comparator;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.RefineBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
import org.opendaylight.yangtools.yang.parser.util.YangParseException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public final class GroupingUtils {
+ private static final Logger LOG = LoggerFactory.getLogger(GroupingUtils.class);
+
+ private static final Splitter COLON_SPLITTER = Splitter.on(':');
+ private static final Splitter SLASH_SPLITTER = Splitter.on('/');
private GroupingUtils() {
}
* @return grouping with given name if found, null otherwise
*/
public static GroupingBuilder getTargetGroupingFromModules(final UsesNodeBuilder usesBuilder,
- final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
+ final Map<URI, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
final int line = usesBuilder.getLine();
- final String groupingString = usesBuilder.getGroupingPathAsString();
- 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;
+ SchemaPath groupingPath = usesBuilder.getTargetGroupingPath();
+ QName groupingName = groupingPath.getPathFromRoot().iterator().next();
+ ModuleBuilder dependentModule = BuilderUtils.findModule(groupingName, modules);
- if(groupingPrefix == null) {
- dependentModule = module;
- } else if (groupingPrefix.equals(module.getPrefix())) {
- dependentModule = module;
- } else {
- dependentModule = BuilderUtils.findModuleFromBuilders(modules, module, groupingPrefix, line);
- }
-
- if (dependentModule == null) {
- return null;
- }
-
- GroupingBuilder result;
Set<GroupingBuilder> groupings = dependentModule.getGroupingBuilders();
- result = findGroupingBuilder(groupings, groupingName);
+ GroupingBuilder result = findGroupingBuilder(groupings, groupingName.getLocalName());
if (result != null) {
return result;
}
Builder parent = usesBuilder.getParent();
-
while (parent != null) {
if (parent instanceof DataNodeContainerBuilder) {
groupings = ((DataNodeContainerBuilder) parent).getGroupingBuilders();
} else if (parent instanceof RpcDefinitionBuilder) {
groupings = ((RpcDefinitionBuilder) parent).getGroupings();
}
- result = findGroupingBuilder(groupings, groupingName);
+ result = findGroupingBuilder(groupings, groupingName.getLocalName());
if (result == null) {
parent = parent.getParent();
} else {
}
if (result == null) {
- throw new YangParseException(module.getName(), line, "Referenced grouping '" + groupingName
- + "' not found.");
+ throw new YangParseException(module.getName(), line, "Grouping '" + groupingName + "' not found.");
}
return result;
}
- /**
- * Search context for grouping by name defined in uses node.
- *
- * @param usesBuilder
- * builder of uses statement
- * @param module
- * current module
- * @param context
- * SchemaContext containing already resolved modules
- * @return grouping with given name if found, null otherwise
- */
- public static GroupingDefinition getTargetGroupingFromContext(final UsesNodeBuilder usesBuilder,
- final ModuleBuilder module, final SchemaContext context) {
- final int line = usesBuilder.getLine();
- String groupingString = usesBuilder.getGroupingPathAsString();
- 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;
- }
-
- Module dependentModule = BuilderUtils.findModuleFromContext(context, module, groupingPrefix, line);
- return findGroupingDefinition(dependentModule.getGroupings(), groupingName);
- }
-
/**
* Find grouping by name.
*
return null;
}
- /**
- * Find grouping by name.
- *
- * @param groupings
- * collection of grouping definitions to search
- * @param name
- * name of grouping
- * @return grouping with given name if present in collection, null otherwise
- */
- private static GroupingDefinition findGroupingDefinition(final Set<GroupingDefinition> groupings, final String name) {
- for (GroupingDefinition grouping : groupings) {
- if (grouping.getQName().getLocalName().equals(name)) {
- return grouping;
- }
- }
- return null;
- }
-
/**
* Perform refinement of uses target grouping nodes. Uses process has to be
* already performed.
for (RefineBuilder refine : usesNode.getRefines()) {
String refineTargetPath = refine.getTargetPathString();
- String[] splitted = refineTargetPath.split("/");
Builder currentNode = usesNode.getParent();
- for (String pathElement : splitted) {
+ for (String pathElement : SLASH_SPLITTER.split(refineTargetPath)) {
if (currentNode instanceof DataNodeContainerBuilder) {
currentNode = ((DataNodeContainerBuilder) currentNode).getDataChildByName(pathElement);
} else if (currentNode instanceof ChoiceBuilder) {
DataSchemaNodeBuilder nodeToRefine = (DataSchemaNodeBuilder) currentNode;
if (nodeToRefine == null) {
- throw new YangParseException(refine.getModuleName(), refine.getLine(), "Refine target node '"
- + refine.getTargetPathString() + "' not found");
+ // FIXME: exception replaced with log to avoid breakage when
+ // user tries to refine instance of extension (unknown node)
+
+ // throw new YangParseException(refine.getModuleName(),
+ // refine.getLine(), "Refine target node '" +
+ // refine.getTargetPathString() + "' not found");
+ LOG.warn("Error in module {} at line {}: Refine target node {} not found.", refine.getModuleName(),
+ refine.getLine(), refine.getTargetPathString());
+ continue;
}
RefineUtils.performRefine(nodeToRefine, refine);
usesNode.addRefineNode(nodeToRefine);