90212383534997b54bd664e5bed47bbb2b49dfb7
[yangtools.git] / yang / yang-xpath-impl / src / main / java / org / opendaylight / yangtools / yang / xpath / impl / AntlrYangXPathExpression.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.xpath.impl;
9
10 import static java.util.Objects.requireNonNull;
11
12 import javax.xml.xpath.XPathExpressionException;
13 import org.opendaylight.yangtools.yang.common.QNameModule;
14 import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
15 import org.opendaylight.yangtools.yang.common.YangVersion;
16 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
17 import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
18 import org.opendaylight.yangtools.yang.xpath.api.YangLocationPath;
19 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr;
20 import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr.Resolved;
21 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression;
22 import org.opendaylight.yangtools.yang.xpath.api.YangXPathMathMode;
23
24 abstract class AntlrYangXPathExpression implements YangXPathExpression {
25     static final class Base extends AntlrYangXPathExpression {
26         Base(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
27                 final String origStr) {
28             super(mathMode, yangVersion, rootExpr, origStr);
29         }
30
31         @Override
32         public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
33             return Utils.interpretAsQName(expr);
34         }
35
36         @Override
37         InstanceIdentifierParser createInstanceIdentifierParser() {
38             return new InstanceIdentifierParser.Base(getMathMode());
39         }
40     }
41
42     static class Qualified extends AntlrYangXPathExpression implements QualifiedBound {
43         final YangNamespaceContext namespaceContext;
44
45         Qualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
46                 final String origStr, final YangNamespaceContext namespaceContext) {
47             super(mathMode, yangVersion, rootExpr, origStr);
48             this.namespaceContext = requireNonNull(namespaceContext);
49         }
50
51         YangNamespaceContext getNamespaceContext() {
52             return namespaceContext;
53         }
54
55         @Override
56         public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
57             return Utils.interpretAsQName(namespaceContext, expr);
58         }
59
60         @Override
61         final InstanceIdentifierParser createInstanceIdentifierParser() {
62             return new InstanceIdentifierParser.Qualified(getMathMode(), namespaceContext);
63         }
64     }
65
66     static final class Unqualified extends Qualified implements UnqualifiedBound {
67         private final QNameModule defaultNamespace;
68
69         Unqualified(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
70                 final String origStr, final YangNamespaceContext namespaceContext, final QNameModule defaultNamespace) {
71             super(mathMode, yangVersion, rootExpr, origStr, namespaceContext);
72             this.defaultNamespace = requireNonNull(defaultNamespace);
73         }
74
75         @Override
76         public Resolved interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
77             return Utils.interpretAsQName(getNamespaceContext(), defaultNamespace, expr);
78         }
79     }
80
81     private final YangXPathMathMode mathMode;
82     private final YangVersion yangVersion;
83     private final YangExpr rootExpr;
84     private final String origStr;
85
86     AntlrYangXPathExpression(final YangXPathMathMode mathMode, final YangVersion yangVersion, final YangExpr rootExpr,
87             final String origStr) {
88         this.mathMode = requireNonNull(mathMode);
89         this.yangVersion = requireNonNull(yangVersion);
90         this.rootExpr = requireNonNull(rootExpr);
91         this.origStr = requireNonNull(origStr);
92     }
93
94     @Override
95     public final YangXPathMathMode getMathMode() {
96         return mathMode;
97     }
98
99     @Override
100     public final YangVersion getYangVersion() {
101         return yangVersion;
102     }
103
104     @Override
105     public final YangExpr getRootExpr() {
106         return rootExpr;
107     }
108
109     @Override
110     public final YangLocationPath interpretAsInstanceIdentifier(final YangLiteralExpr expr)
111             throws XPathExpressionException {
112         return createInstanceIdentifierParser().interpretAsInstanceIdentifier(expr);
113     }
114
115     @Override
116     public final String toString() {
117         return origStr;
118     }
119
120     abstract InstanceIdentifierParser createInstanceIdentifierParser();
121 }