public YangXPathExpression.QualifiedBound parseExpression(final String xpath) throws XPathExpressionException {
final ParseExprResult result = parseExpr(xpath);
return new AntlrYangXPathExpression.Qualified(mathMode, result.minimumYangVersion, result.expression, xpath,
- namespaceContext);
+ result.haveLiteral ? namespaceContext : null);
}
@Override
final ParseExprResult result = parseExpr(xpath);
return new AntlrYangXPathExpression.Unqualified(mathMode, result.minimumYangVersion, result.expression,
- xpath, namespaceContext, defaultNamespace);
+ xpath, result.haveLiteral ? namespaceContext : null, defaultNamespace);
}
@Override
private static final class ParseExprResult {
final YangVersion minimumYangVersion;
final YangExpr expression;
+ final boolean haveLiteral;
- ParseExprResult(final YangVersion minimumYangVersion, final YangExpr expression) {
+ ParseExprResult(final YangVersion minimumYangVersion, final YangExpr expression, final boolean haveLiteral) {
this.minimumYangVersion = requireNonNull(minimumYangVersion);
this.expression = requireNonNull(expression);
+ this.haveLiteral = haveLiteral;
}
}
private final FunctionSupport functionSupport;
private YangVersion minimumYangVersion = YangVersion.VERSION_1;
+ private boolean haveLiteral = false;
AntlrXPathParser(final YangXPathMathMode mathMode) {
this.mathMode = requireNonNull(mathMode);
// Reset our internal context
minimumYangVersion = YangVersion.VERSION_1;
+ haveLiteral = false;
final YangExpr expr;
try {
} catch (RuntimeException e) {
throw new XPathExpressionException(e);
}
- return new ParseExprResult(minimumYangVersion, expr);
+ return new ParseExprResult(minimumYangVersion, expr, haveLiteral);
}
/**
if (minimumYangVersion.compareTo(func.getYangVersion()) < 0) {
minimumYangVersion = func.getYangVersion();
}
- return functionSupport.functionToExpr(func, args);
+
+ final YangExpr funcExpr = functionSupport.functionToExpr(func, args);
+ if (funcExpr instanceof YangLiteralExpr) {
+ haveLiteral = true;
+ }
+ return funcExpr;
}
checkArgument(!YangConstants.RFC6020_YIN_MODULE.equals(parsed.getModule()), "Unknown default function %s",
switch (term.getSymbol().getType()) {
case xpathParser.Literal:
// We have to strip quotes
+ haveLiteral = true;
return YangLiteralExpr.of(text.substring(1, text.length() - 1));
case xpathParser.Number:
return mathSupport.createNumber(text);
import static java.util.Objects.requireNonNull;
import javax.xml.xpath.XPathExpressionException;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
import org.opendaylight.yangtools.yang.common.YangVersion;
}
static class Qualified extends AntlrYangXPathExpression implements QualifiedBound {
- private final YangNamespaceContext namespaceContext;
+ private final @Nullable YangNamespaceContext namespaceContext;
Qualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
- final String origStr, final YangNamespaceContext namespaceContext) {
+ final String origStr, final @Nullable YangNamespaceContext namespaceContext) {
super(mathMode, yangVersion, rootExpr, origStr);
- this.namespaceContext = requireNonNull(namespaceContext);
+ this.namespaceContext = namespaceContext;
}
- final YangNamespaceContext namespaceContext() {
- return namespaceContext;
+ final YangNamespaceContext namespaceContext() throws XPathExpressionException {
+ final YangNamespaceContext local = namespaceContext;
+ if (local == null) {
+ throw new XPathExpressionException("Expression does not have a legal literal member");
+ }
+ return local;
}
@Override
public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
- return Utils.interpretAsQName(namespaceContext, expr);
+ return Utils.interpretAsQName(namespaceContext(), expr);
}
@Override
- final InstanceIdentifierParser createInstanceIdentifierParser() {
- return new InstanceIdentifierParser.Qualified(getMathMode(), namespaceContext);
+ final InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException {
+ return new InstanceIdentifierParser.Qualified(getMathMode(), namespaceContext());
}
}
private final QNameModule defaultNamespace;
Unqualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
- final String origStr, final YangNamespaceContext namespaceContext, final QNameModule defaultNamespace) {
+ final String origStr, final @Nullable YangNamespaceContext namespaceContext,
+ final QNameModule defaultNamespace) {
super(mathMode, yangVersion, rootExpr, origStr, namespaceContext);
this.defaultNamespace = requireNonNull(defaultNamespace);
}
return origStr;
}
- abstract InstanceIdentifierParser createInstanceIdentifierParser();
+ abstract InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException;
}