Merge "Bug 1331 - Generate SPIs and yangs to target/generated-sources/ subfolders"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / GroupingUtils.java
index 2442d47b75eda5da1757538bffd88238690dd6f6..12dabc1a6a8628f6263a4f93edb367886644e950 100644 (file)
@@ -7,14 +7,13 @@
  */
 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.builder.api.Builder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
@@ -24,10 +23,47 @@ 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 +79,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;
@@ -73,15 +96,13 @@ public final class GroupingUtils {
             return null;
         }
 
-        GroupingBuilder result;
         Set<GroupingBuilder> groupings = dependentModule.getGroupingBuilders();
-        result = findGroupingBuilder(groupings, groupingName);
+        GroupingBuilder result = findGroupingBuilder(groupings, groupingName);
         if (result != null) {
             return result;
         }
 
         Builder parent = usesBuilder.getParent();
-
         while (parent != null) {
             if (parent instanceof DataNodeContainerBuilder) {
                 groupings = ((DataNodeContainerBuilder) parent).getGroupingBuilders();
@@ -97,46 +118,11 @@ public final class GroupingUtils {
         }
 
         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.
      *
@@ -155,24 +141,6 @@ public final class GroupingUtils {
         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.
@@ -184,9 +152,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) {