import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
-import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import javax.xml.xpath.XPathExpressionException;
import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
+import org.opendaylight.yangtools.yang.common.YangVersion;
import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator;
import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
@Override
public YangXPathExpression parseExpression(final String xpath) throws XPathExpressionException {
- return new AntlrYangXPathExpression.Base(mathMode, parseExpr(xpath), xpath);
+ final Entry<YangVersion, YangExpr> result = parseExpr(xpath);
+ return new AntlrYangXPathExpression.Base(mathMode, result.getKey(), result.getValue(), xpath);
}
@Override
@Override
public YangXPathExpression.QualifiedBound parseExpression(final String xpath) throws XPathExpressionException {
- return new AntlrYangXPathExpression.Qualified(mathMode, parseExpr(xpath), xpath, namespaceContext);
+ final Entry<YangVersion, YangExpr> result = parseExpr(xpath);
+ return new AntlrYangXPathExpression.Qualified(mathMode, result.getKey(), result.getValue(), xpath,
+ namespaceContext);
}
@Override
@Override
public YangXPathExpression.UnqualifiedBound parseExpression(final String xpath)
throws XPathExpressionException {
- return new AntlrYangXPathExpression.Unqualified(mathMode, parseExpr(xpath), xpath, namespaceContext,
- defaultNamespace);
+ final Entry<YangVersion, YangExpr> result = parseExpr(xpath);
+
+ return new AntlrYangXPathExpression.Unqualified(mathMode, result.getKey(), result.getValue(), xpath,
+ namespaceContext, defaultNamespace);
}
@Override
private final YangXPathMathSupport mathSupport;
private final FunctionSupport functionSupport;
+ private YangVersion minimumYangVersion = YangVersion.VERSION_1;
+
AntlrXPathParser(final YangXPathMathMode mathMode) {
this.mathMode = requireNonNull(mathMode);
this.mathSupport = mathMode.getSupport();
}
}
- final YangExpr parseExpr(final String xpath) throws XPathExpressionException {
+ @SuppressWarnings("checkstyle:illegalCatch")
+ final Entry<YangVersion, YangExpr> parseExpr(final String xpath) throws XPathExpressionException {
// Create a parser and disconnect it from console error output
final xpathLexer lexer = new xpathLexer(CharStreams.fromString(xpath));
final xpathParser parser = new xpathParser(new CommonTokenStream(lexer));
lexer.addErrorListener(listener);
parser.removeErrorListeners();
parser.addErrorListener(listener);
-
- final YangExpr expr = parseExpr(parser.main().expr());
+ final ExprContext antlr = parser.main().expr();
listener.reportError();
- return expr;
+
+ // Reset our internal context
+ minimumYangVersion = YangVersion.VERSION_1;
+
+ final YangExpr expr;
+ try {
+ expr = parseExpr(antlr);
+ } catch (RuntimeException e) {
+ throw new XPathExpressionException(e);
+ }
+ return new SimpleImmutableEntry<>(minimumYangVersion, expr);
}
/**
* Parse and simplify an XPath expression in {@link ExprContext} representation.
*
+ * @param ctx Current parsing context
* @param expr ANTLR ExprContext
* @return A {@link YangExpr}
* @throws NullPointerException if {@code expr} is null
throw illegalShape(name);
}
- final List<YangExpr> args = ImmutableList.copyOf(Lists.transform(expr.expr(), this::parseExpr));
+ final List<YangExpr> args = expr.expr().stream().map(this::parseExpr).collect(ImmutableList.toImmutableList());
final YangFunction func = YANG_FUNCTIONS.get(parsed);
if (func != null) {
+ if (minimumYangVersion.compareTo(func.getYangVersion()) < 0) {
+ minimumYangVersion = func.getYangVersion();
+ }
return functionSupport.functionToExpr(func, args);
}
import javax.xml.xpath.XPathExpressionException;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
+import org.opendaylight.yangtools.yang.common.YangVersion;
import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
abstract class AntlrYangXPathExpression implements YangXPathExpression {
static final class Base extends AntlrYangXPathExpression {
- Base(final YangXPathMathMode mathMode, final YangExpr rootExpr, final String origStr) {
- super(mathMode, rootExpr, origStr);
+ Base(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
+ final String origStr) {
+ super(mathMode, yangVersion, rootExpr, origStr);
}
@Override
static class Qualified extends AntlrYangXPathExpression implements QualifiedBound {
final YangNamespaceContext namespaceContext;
- Qualified(final YangXPathMathMode mathMode, final YangExpr rootExpr,
- final String origStr, final YangNamespaceContext namespaceContext) {
- super(mathMode, rootExpr, origStr);
+ Qualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
+ final String origStr, final YangNamespaceContext namespaceContext) {
+ super(mathMode, yangVersion, rootExpr, origStr);
this.namespaceContext = requireNonNull(namespaceContext);
}
static final class Unqualified extends Qualified implements UnqualifiedBound {
private final QNameModule defaultNamespace;
- Unqualified(final YangXPathMathMode mathMode, final YangExpr rootExpr,
- final String origStr, final YangNamespaceContext namespaceContext, final QNameModule defaultNamespace) {
- super(mathMode, rootExpr, origStr, namespaceContext);
+ Unqualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
+ final String origStr, final YangNamespaceContext namespaceContext, final QNameModule defaultNamespace) {
+ super(mathMode, yangVersion, rootExpr, origStr, namespaceContext);
this.defaultNamespace = requireNonNull(defaultNamespace);
}
}
private final YangXPathMathMode mathMode;
+ private final YangVersion yangVersion;
private final YangExpr rootExpr;
private final String origStr;
- AntlrYangXPathExpression(final YangXPathMathMode mathMode, final YangExpr rootExpr, final String origStr) {
+ AntlrYangXPathExpression(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
+ final String origStr) {
this.mathMode = requireNonNull(mathMode);
+ this.yangVersion = requireNonNull(yangVersion);
this.rootExpr = requireNonNull(rootExpr);
this.origStr = requireNonNull(origStr);
}
return mathMode;
}
+ @Override
+ public final YangVersion getYangVersion() {
+ return yangVersion;
+ }
+
@Override
public final YangExpr getRootExpr() {
return rootExpr;