Refactor argument adaptation
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / StatementDefinitionContext.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  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.parser.stmt.reactor;
9
10 import com.google.common.base.MoreObjects;
11 import com.google.common.base.MoreObjects.ToStringHelper;
12 import com.google.common.base.Preconditions;
13 import java.util.HashMap;
14 import java.util.Map;
15 import java.util.Optional;
16 import javax.annotation.Nonnull;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
20 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
22 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementFactory;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
28 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
29
30 public class StatementDefinitionContext<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>> {
31     private final StatementSupport<A, D, E> support;
32     private final Map<String, StatementDefinitionContext<?, ?, ?>> argumentSpecificSubDefinitions;
33     private Map<StatementDefinitionContext<?,?,?>, StatementDefinitionContext<?,?,?>> unknownStmtDefsOfYangStmts;
34
35     public StatementDefinitionContext(final StatementSupport<A, D, E> support) {
36         this.support = Preconditions.checkNotNull(support);
37         this.argumentSpecificSubDefinitions = support.hasArgumentSpecificSupports() ? new HashMap<>() : null;
38     }
39
40     public StatementFactory<A,D,E> getFactory() {
41         return support;
42     }
43
44     public A parseArgumentValue(final StmtContext<A, D, E> context, final String value) {
45         return support.parseArgumentValue(context, value);
46     }
47
48     public A adaptArgumentValue(final StmtContext<A, D, E> context, final QNameModule targetModule) {
49         return support.adaptArgumentValue(context, targetModule);
50     }
51
52     public void checkNamespaceAllowed(final Class<? extends IdentifierNamespace<?,?>> namespace) {
53         // Noop
54     }
55
56     public StatementDefinition getPublicView() {
57         return support.getPublicView();
58     }
59
60     public Optional<StatementContextBase<?, ?, ?>> beforeSubStatementCreated(final Mutable<?, ?, ?> stmt, final int offset, final StatementDefinitionContext<?, ?, ?> def, final StatementSourceReference ref,
61             final String argument) {
62         return support.beforeSubStatementCreated(stmt, offset, def, ref, argument);
63     }
64
65     public boolean onStatementAdded(final Mutable<A, D, E> stmt) {
66         support.onStatementAdded(stmt);
67         return false;
68     }
69
70
71     public void onDeclarationFinished(final Mutable<A, D, E> statement, final ModelProcessingPhase phase) {
72         switch (phase) {
73         case SOURCE_PRE_LINKAGE:
74             support.onPreLinkageDeclared(statement);
75             break;
76         case SOURCE_LINKAGE:
77             support.onLinkageDeclared(statement);
78             break;
79         case STATEMENT_DEFINITION:
80             support.onStatementDefinitionDeclared(statement);
81             break;
82         case FULL_DECLARATION:
83             support.onFullDefinitionDeclared(statement);
84             break;
85         default:
86             break;
87         }
88     }
89
90     public Class<?> getRepresentingClass() {
91         return support.getDeclaredRepresentationClass();
92     }
93
94     public boolean hasArgument() {
95         return support.getArgumentName() != null;
96     }
97
98     public boolean isArgumentYinElement() {
99         return support.isArgumentYinElement();
100     }
101
102     public QName getStatementName() {
103         return support.getStatementName();
104     }
105
106     public QName getArgumentName() {
107         return support.getArgumentName();
108     }
109
110     @Override
111     public final String toString() {
112         return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
113     }
114
115     protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
116         return toStringHelper.add("statement", getStatementName());
117     }
118
119     @Nonnull
120     StatementDefinitionContext<?, ?, ?> getSubDefinitionSpecificForArgument(final String argument) {
121         if (!hasArgumentSpecificSubDefinitions()) {
122             return this;
123         }
124
125         StatementDefinitionContext<?, ?, ?> potential = argumentSpecificSubDefinitions.get(argument);
126         if (potential == null) {
127             final StatementSupport<?, ?, ?> argumentSpecificSupport = support.getSupportSpecificForArgument(argument);
128             potential = argumentSpecificSupport != null ? new StatementDefinitionContext<>(argumentSpecificSupport)
129                     : this;
130             argumentSpecificSubDefinitions.put(argument, potential);
131         }
132
133         return potential;
134     }
135
136     boolean hasArgumentSpecificSubDefinitions() {
137         return support.hasArgumentSpecificSupports();
138     }
139
140     String internArgument(final String rawArgument) {
141         return support.internArgument(rawArgument);
142     }
143
144     StatementDefinitionContext<?, ?, ?> getAsUnknownStatementDefinition(
145             final StatementDefinitionContext<?, ?, ?> yangStmtDef) {
146         if (unknownStmtDefsOfYangStmts == null) {
147             unknownStmtDefsOfYangStmts = new HashMap<>();
148         }
149
150         StatementDefinitionContext<?, ?, ?> ret = unknownStmtDefsOfYangStmts.get(yangStmtDef);
151         if (ret != null) {
152             return ret;
153         }
154
155         ret = support.getUnknownStatementDefinitionOf(yangStmtDef).orElse(null);
156
157         if (ret != null) {
158             unknownStmtDefsOfYangStmts.put(yangStmtDef, ret);
159         }
160         return ret;
161     }
162
163     boolean isIgnoringIfFeatures() {
164         return support.isIgnoringIfFeatures();
165     }
166
167     boolean isIgnoringConfig() {
168         return support.isIgnoringConfig();
169     }
170 }