Populate model/ hierarchy
[yangtools.git] / xpath / 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.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;
24
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);
30         }
31
32         @Override
33         public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
34             return Utils.interpretAsQName(expr);
35         }
36
37         @Override
38         InstanceIdentifierParser createInstanceIdentifierParser() {
39             return new InstanceIdentifierParser.Base(getMathMode());
40         }
41     }
42
43     static class Qualified extends AntlrYangXPathExpression implements QualifiedBound {
44         private final @Nullable YangNamespaceContext namespaceContext;
45
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;
50         }
51
52         final YangNamespaceContext namespaceContext() throws XPathExpressionException {
53             final YangNamespaceContext local = namespaceContext;
54             if (local == null) {
55                 throw new XPathExpressionException("Expression does not have a legal literal member");
56             }
57             return local;
58         }
59
60         @Override
61         public YangQNameExpr interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
62             return Utils.interpretAsQName(namespaceContext(), expr);
63         }
64
65         @Override
66         final InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException {
67             return new InstanceIdentifierParser.Qualified(getMathMode(), namespaceContext());
68         }
69     }
70
71     static final class Unqualified extends Qualified implements UnqualifiedBound {
72         private final QNameModule defaultNamespace;
73
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);
79         }
80
81         @Override
82         public Resolved interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
83             return Utils.interpretAsQName(namespaceContext(), defaultNamespace, expr);
84         }
85     }
86
87     private final YangXPathMathMode mathMode;
88     private final YangVersion yangVersion;
89     private final YangExpr rootExpr;
90     private final String origStr;
91
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);
98     }
99
100     @Override
101     public final YangXPathMathMode getMathMode() {
102         return mathMode;
103     }
104
105     @Override
106     public final YangVersion getYangVersion() {
107         return yangVersion;
108     }
109
110     @Override
111     public final YangExpr getRootExpr() {
112         return rootExpr;
113     }
114
115     @Override
116     public final YangLocationPath interpretAsInstanceIdentifier(final YangLiteralExpr expr)
117             throws XPathExpressionException {
118         return createInstanceIdentifierParser().interpretAsInstanceIdentifier(expr);
119     }
120
121     @Override
122     public final String toString() {
123         return origStr;
124     }
125
126     abstract InstanceIdentifierParser createInstanceIdentifierParser() throws XPathExpressionException;
127 }