Bug 6870: [Yang 1.1] Support for new "modifier" statement
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / Utils.java
index 38620a1e7bacaee5e49866f8e8e7d74519dbaa67..86ffd0ae09fd5ac0cbb20d9579745acb37632a09 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
 import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
 
 import com.google.common.base.CharMatcher;
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -24,6 +23,7 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -41,7 +41,6 @@ import org.opendaylight.yangtools.yang.model.api.DeviateKind;
 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
@@ -51,17 +50,16 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
 import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
+import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
+import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName;
 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName;
 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
-import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.RootStatementContext;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
@@ -393,52 +391,6 @@ public final class Utils {
         return identifier;
     }
 
-    /**
-     *
-     * Based on identifier read from source and collections of relevant prefixes and statement definitions mappings
-     * provided for actual phase, method resolves and returns valid QName for declared statement to be written.
-     * This applies to any declared statement, including unknown statements.
-     *
-     * @param prefixes - collection of all relevant prefix mappings supplied for actual parsing phase
-     * @param stmtDef - collection of all relevant statement definition mappings provided for actual parsing phase
-     * @param identifier - statement to parse from source
-     * @return valid QName for declared statement to be written
-     *
-     */
-    public static QName getValidStatementDefinition(final PrefixToModule prefixes,
-            final QNameToStatementDefinition stmtDef, final QName identifier) {
-        if (stmtDef.get(identifier) != null) {
-            return stmtDef.get(identifier).getStatementName();
-        } else {
-            final String prefixedLocalName = identifier.getLocalName();
-            final String[] namesParts = prefixedLocalName.split(":");
-
-            if (namesParts.length == 2) {
-                final String prefix = namesParts[0];
-                final String localName = namesParts[1];
-
-                if (prefixes == null) {
-                    return null;
-                }
-
-                final QNameModule qNameModule = prefixes.get(prefix);
-                if (qNameModule == null) {
-                    return null;
-                }
-
-                if (prefixes.isPreLinkageMap()) {
-                    final StatementDefinition foundStmtDef = stmtDef.getByNamespaceAndLocalName(qNameModule.getNamespace(),
-                            localName);
-                    return foundStmtDef != null ? foundStmtDef.getStatementName() : null;
-                } else {
-                    final QName qName = QName.create(qNameModule, localName);
-                    return stmtDef.get(qName) != null ? qName : null;
-                }
-            }
-        }
-        return null;
-    }
-
     static SchemaNodeIdentifier nodeIdentifierFromPath(final StmtContext<?, ?, ?> ctx, final String path) {
         // FIXME: is the path trimming really necessary??
         final List<QName> qNames = new ArrayList<>();
@@ -446,9 +398,9 @@ public final class Utils {
             try {
                 final QName qName = Utils.qNameFromArgument(ctx, nodeName);
                 qNames.add(qName);
-            } catch (final Exception e) {
-                throw new IllegalArgumentException(
-                    String.format("Failed to parse node '%s' in path '%s'", nodeName, path), e);
+            } catch (final RuntimeException e) {
+                throw new SourceException(ctx.getStatementSourceReference(), e,
+                        "Failed to parse node '%s' in path '%s'", nodeName, path);
             }
         }
 
@@ -520,9 +472,9 @@ public final class Utils {
             break;
         }
 
-        Preconditions.checkArgument(qNameModule != null,
-                "Error in module '%s': can not resolve QNameModule for '%s'. Statement source at %s",
-                ctx.getRoot().rawStatementArgument(), value, ctx.getStatementSourceReference());
+        qNameModule = InferenceException.throwIfNull(qNameModule, ctx.getStatementSourceReference(),
+            "Cannot resolve QNameModule for '%s'", value);
+
         final QNameModule resultQNameModule;
         if (qNameModule.getRevision() == null) {
             resultQNameModule = QNameModule.create(qNameModule.getNamespace(), SimpleDateFormatUtil.DEFAULT_DATE_REV)
@@ -556,7 +508,8 @@ public final class Utils {
         if (StmtContextUtils.producesDeclared(rootCtx, ModuleStatement.class)) {
             qNameModule = rootCtx.getFromNamespace(ModuleCtxToModuleQName.class, rootCtx);
         } else if (StmtContextUtils.producesDeclared(rootCtx, SubmoduleStatement.class)) {
-            final String belongsToModuleName = firstAttributeOf(rootCtx.substatements(), BelongsToStatement.class);
+            final String belongsToModuleName = firstAttributeOf(rootCtx.declaredSubstatements(),
+                BelongsToStatement.class);
             qNameModule = rootCtx.getFromNamespace(ModuleNameToModuleQName.class, belongsToModuleName);
         } else {
             qNameModule = null;
@@ -582,9 +535,8 @@ public final class Utils {
     }
 
     public static DeviateKind parseDeviateFromString(final StmtContext<?, ?, ?> ctx, final String deviateKeyword) {
-        return Preconditions.checkNotNull(KEYWORD_TO_DEVIATE_MAP.get(deviateKeyword),
-                "String '%s' is not valid deviate argument. Statement source at %s", deviateKeyword,
-                ctx.getStatementSourceReference());
+        return SourceException.throwIfNull(KEYWORD_TO_DEVIATE_MAP.get(deviateKeyword),
+            ctx.getStatementSourceReference(), "String '%s' is not valid deviate argument", deviateKeyword);
     }
 
     public static Status parseStatus(final String value) {
@@ -685,13 +637,12 @@ public final class Utils {
             // creates SourceIdentifier for a module
             return RevisionSourceIdentifier.create((String) root.getStatementArgument(),
                 qNameModule.getFormattedRevision());
-        } else {
-            // creates SourceIdentifier for a submodule
-            final Date revision = Optional.fromNullable(Utils.getLatestRevision(root.declaredSubstatements()))
-                    .or(SimpleDateFormatUtil.DEFAULT_DATE_REV);
-            final String formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(revision);
-            return RevisionSourceIdentifier.create((String) root.getStatementArgument(),
-                    formattedRevision);
         }
+
+        // creates SourceIdentifier for a submodule
+        final Date revision = Optional.ofNullable(Utils.getLatestRevision(root.declaredSubstatements()))
+                .orElse(SimpleDateFormatUtil.DEFAULT_DATE_REV);
+        final String formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(revision);
+        return RevisionSourceIdentifier.create((String) root.getStatementArgument(), formattedRevision);
     }
 }