2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.xpath.impl;
10 import static java.util.Objects.requireNonNull;
12 import javax.xml.xpath.XPathExpressionException;
13 import org.eclipse.jdt.annotation.Nullable;
14 import org.opendaylight.yangtools.yang.common.QNameModule;
15 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
16 import org.opendaylight.yangtools.yang.common.YangVersion;
17 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
18 import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
19 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
20 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr;
21 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr.Resolved;
22 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression;
23 import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
25 abstract class AntlrYangXPathExpression implements YangXPathExpression {
26 static final class Base extends AntlrYangXPathExpression {
27 Base(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
28 final String origStr) {
29 super(mathMode, yangVersion, rootExpr, origStr);
33 public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
34 return Utils.interpretAsQName(expr);
38 InstanceIdentifierParser createInstanceIdentifierParser() {
39 return new InstanceIdentifierParser.Base(getMathMode());
43 static class Qualified extends AntlrYangXPathExpression implements QualifiedBound {
44 private final @Nullable YangNamespaceContext namespaceContext;
46 Qualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
47 final String origStr, final @Nullable YangNamespaceContext namespaceContext) {
48 super(mathMode, yangVersion, rootExpr, origStr);
49 this.namespaceContext = namespaceContext;
52 final YangNamespaceContext namespaceContext() throws XPathExpressionException {
53 final YangNamespaceContext local = namespaceContext;
55 throw new XPathExpressionException("Expression does not have a legal literal member");
61 public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
62 return Utils.interpretAsQName(namespaceContext(), expr);
66 final InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException {
67 return new InstanceIdentifierParser.Qualified(getMathMode(), namespaceContext());
71 static final class Unqualified extends Qualified implements UnqualifiedBound {
72 private final QNameModule defaultNamespace;
74 Unqualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
75 final String origStr, final @Nullable YangNamespaceContext namespaceContext,
76 final QNameModule defaultNamespace) {
77 super(mathMode, yangVersion, rootExpr, origStr, namespaceContext);
78 this.defaultNamespace = requireNonNull(defaultNamespace);
82 public Resolved interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
83 return Utils.interpretAsQName(namespaceContext(), defaultNamespace, expr);
87 private final YangXPathMathMode mathMode;
88 private final YangVersion yangVersion;
89 private final YangExpr rootExpr;
90 private final String origStr;
92 AntlrYangXPathExpression(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
93 final String origStr) {
94 this.mathMode = requireNonNull(mathMode);
95 this.yangVersion = requireNonNull(yangVersion);
96 this.rootExpr = requireNonNull(rootExpr);
97 this.origStr = requireNonNull(origStr);
101 public final YangXPathMathMode getMathMode() {
106 public final YangVersion getYangVersion() {
111 public final YangExpr getRootExpr() {
116 public final YangLocationPath interpretAsInstanceIdentifier(final YangLiteralExpr expr)
117 throws XPathExpressionException {
118 return createInstanceIdentifierParser().interpretAsInstanceIdentifier(expr);
122 public final String toString() {
126 abstract InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException;