Add AbstractIdentityRefSpecificationSupport defences
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / XPathSupport.java
index a5bc3f462e57e690badf854b3e319633a8c0d178..f407c3197c2b83fbbaef4215309e659efbead6b4 100644 (file)
@@ -12,9 +12,9 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import javax.xml.xpath.XPathExpressionException;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
-import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.YangNamespaceContextNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathParser;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathParserFactory;
@@ -32,23 +32,21 @@ public final class XPathSupport {
         this.factory = requireNonNull(factory);
     }
 
-    public RevisionAwareXPath parseXPath(final StmtContext<?, ?, ?> ctx, final String xpath) {
-        final boolean isAbsolute = ArgumentUtils.isAbsoluteXPath(xpath);
-        final YangXPathParser.QualifiedBound parser = factory.newParser(new StmtNamespaceContext(ctx));
+    public QualifiedBound parseXPath(final StmtContext<?, ?, ?> ctx, final String xpath) {
+        final YangXPathParser.QualifiedBound parser = factory.newParser(
+            YangNamespaceContextNamespace.computeIfAbsent(ctx));
         final QualifiedBound parsed;
         try {
             parsed = parser.parseExpression(xpath);
         } catch (XPathExpressionException e) {
-            LOG.warn("Argument \"{}\" is not valid XPath string at \"{}\"", xpath,
-                ctx.getStatementSourceReference(), e);
-            return new RevisionAwareXPathImpl(xpath, isAbsolute);
+            throw new SourceException(ctx, e, "Argument \"%s\" is not valid XPath string", xpath);
         }
 
-        if (ctx.getRootVersion().compareTo(parsed.getYangVersion()) < 0) {
+        if (ctx.yangVersion().compareTo(parsed.getYangVersion()) < 0) {
             LOG.warn("{} features required in {} context to parse expression '{}' [at {}]",
-                parsed.getYangVersion().getReference(), ctx.getRootVersion().getReference(), xpath,
-                ctx.getStatementSourceReference());
+                parsed.getYangVersion().getReference(), ctx.yangVersion().getReference(), xpath,
+                ctx.sourceReference());
         }
-        return new WithExpressionImpl(xpath, isAbsolute, parsed);
+        return parsed;
     }
 }