BUG-865: deprecate pre-Beryllium parser elements
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / GroupingUtils.java
index 2442d47b75eda5da1757538bffd88238690dd6f6..63058a6f319811c4ca6d8574a25abd1776898c12 100644 (file)
@@ -7,14 +7,15 @@
  */
 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.NavigableMap;
 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;
@@ -22,8 +23,17 @@ import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 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;
 
+/**
+ * @deprecated Pre-Beryllium implementation, scheduled for removal.
+ */
+@Deprecated
 public final class GroupingUtils {
+    private static final Logger LOG = LoggerFactory.getLogger(GroupingUtils.class);
+
+    private static final Splitter SLASH_SPLITTER = Splitter.on('/');
 
     private GroupingUtils() {
     }
@@ -37,58 +47,32 @@ public final class GroupingUtils {
      *            all loaded modules
      * @param module
      *            current module
-     * @return grouping with given name if found, null otherwise
+     * @return grouping with given name, never null
+     * @throws YangParseException
+     *             if no grouping found
      */
     public static GroupingBuilder getTargetGroupingFromModules(final UsesNodeBuilder usesBuilder,
-            final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
+            final Map<URI, NavigableMap<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;
-
-        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;
-        }
+        SchemaPath groupingPath = usesBuilder.getTargetGroupingPath();
+        QName groupingName = groupingPath.getPathFromRoot().iterator().next();
+        ModuleBuilder dependentModule = BuilderUtils.findModule(groupingName, modules);
 
-        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 {
@@ -97,46 +81,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 +104,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 +115,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) {
@@ -196,8 +126,15 @@ public final class GroupingUtils {
 
             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);