*/
package org.opendaylight.yangtools.yang.parser.builder.impl;
+import com.google.common.base.Splitter;
+
import java.util.Comparator;
import java.util.Date;
+import java.util.Iterator;
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.parser.util.YangParseException;
public final class GroupingUtils {
+ private static final Splitter COLON_SPLITTER = Splitter.on(':');
+ private static final Splitter SLASH_SPLITTER = Splitter.on('/');
private GroupingUtils() {
}
+ /**
+ * Common string splitter. Given a string representation of a grouping's name, it creates a prefix/name
+ * pair and returns it.
+ *
+ * @param groupingString Grouping string reference
+ * @param module Module which we are processing
+ * @param line Module line which we are processing
+ * @return An array of two strings, first one is the module prefix, the second is the grouping name.
+ */
+ private static String[] getPrefixAndName(final String groupingString, final ModuleBuilder module, final int line) {
+ final String[] ret = new String[2];
+
+ if (groupingString.indexOf(':') != -1) {
+ if (groupingString.indexOf('/') != -1) {
+ throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
+ }
+
+ final Iterator<String> split = COLON_SPLITTER.split(groupingString).iterator();
+ ret[0] = split.next();
+ ret[1] = split.next();
+ if (split.hasNext()) {
+ throw new YangParseException(module.getName(), line, "Invalid name of target grouping");
+ }
+ } else {
+ ret[0] = module.getPrefix();
+ ret[1] = groupingString;
+ }
+
+ return ret;
+ }
+
/**
* Search given modules for grouping by name defined in uses node.
*
final Map<String, 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;
+ final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line);
+ final String groupingPrefix = split[0];
+ final String groupingName = split[1];
+ final ModuleBuilder dependentModule;
- if(groupingPrefix == null) {
+ if (groupingPrefix == null) {
dependentModule = module;
} else if (groupingPrefix.equals(module.getPrefix())) {
dependentModule = module;
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);
+ final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line);
+ Module dependentModule = BuilderUtils.findModuleFromContext(context, module, split[0], line);
+ return findGroupingDefinition(dependentModule.getGroupings(), split[1]);
}
/**
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) {