Eliminate use of String.split()
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / GroupingUtils.java
index 2442d47b75eda5da1757538bffd88238690dd6f6..59689e16aaafade4b1ae42c5fd7021479629c6be 100644 (file)
@@ -7,11 +7,15 @@
  */
 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;
@@ -24,10 +28,43 @@ import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
 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.
      *
@@ -43,25 +80,12 @@ public final class GroupingUtils {
             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;
@@ -117,24 +141,9 @@ public final class GroupingUtils {
     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]);
     }
 
     /**
@@ -184,9 +193,8 @@ public final class GroupingUtils {
         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) {