Specialize ChoiceEffectiveStatement implementations
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / EffectiveStatements.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, s.r.o. 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.model.ri.stmt;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableSet;
15 import java.util.Set;
16 import org.eclipse.jdt.annotation.NonNullByDefault;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.common.QNameModule;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
23 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
31 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentEffectiveStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
37 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
38 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
39 import org.opendaylight.yangtools.yang.model.api.stmt.BitEffectiveStatement;
40 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
41 import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
42 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
43 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
44 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
45 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
46 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
47 import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
48 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
49 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
50 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
51 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
52 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
53 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
54 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
55 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
56 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
57 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationEffectiveStatement;
58 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
59 import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement;
60 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
61 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
62 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
63 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
64 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
65 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
66 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
67 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
68 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
69 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
70 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
71 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
72 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
73 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement;
74 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
75 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement;
76 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
77 import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
78 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
79 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeEffectiveStatement;
80 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
81 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
82 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
83 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
84 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
85 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
86 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
87 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
88 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
89 import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement;
90 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
91 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
92 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
93 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
94 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
95 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
96 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
97 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
98 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
99 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement;
100 import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
101 import org.opendaylight.yangtools.yang.model.api.stmt.MustEffectiveStatement;
102 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
103 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceEffectiveStatement;
104 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
105 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
106 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
107 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
108 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
109 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
110 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
111 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
112 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
113 import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
114 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
115 import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement;
116 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
117 import org.opendaylight.yangtools.yang.model.api.stmt.PositionEffectiveStatement;
118 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
119 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
120 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
121 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceEffectiveStatement;
122 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
123 import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement;
124 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
125 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
126 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
127 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
128 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
129 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateEffectiveStatement;
130 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
131 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement;
132 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
133 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
134 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
135 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
136 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
137 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
138 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
139 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
140 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
141 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
142 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
143 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
144 import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement;
145 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
146 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
147 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
148 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
149 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
150 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStatement;
151 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
152 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
153 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRequireInstanceStatement;
154 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyStatusStatement;
155 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYangVersionStatement;
156 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractChoiceEffectiveStatement;
157 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractContainerEffectiveStatement;
158 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractLeafEffectiveStatement;
159 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ActionEffectiveStatementImpl;
160 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AugmentEffectiveStatementImpl;
161 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredCaseEffectiveStatement;
162 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredInputEffectiveStatement;
163 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredOutputEffectiveStatement;
164 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeviateEffectiveStatementImpl;
165 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeviationEffectiveStatementImpl;
166 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyAnydataEffectiveStatement;
167 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyAnyxmlEffectiveStatement;
168 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyArgumentEffectiveStatement;
169 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBaseEffectiveStatement;
170 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBelongsToEffectiveStatement;
171 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBitEffectiveStatement;
172 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyChoiceEffectiveStatement;
173 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyConfigEffectiveStatement;
174 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContactEffectiveStatement;
175 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContainerEffectiveStatement;
176 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDefaultEffectiveStatement;
177 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDescriptionEffectiveStatement;
178 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyEnumEffectiveStatement;
179 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorAppTagEffectiveStatement;
180 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorMessageEffectiveStatement;
181 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFeatureEffectiveStatement;
182 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyForeignKeyEffectiveStatement;
183 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFractionDigitsEffectiveStatement;
184 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIdentityEffectiveStatement;
185 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIfFeatureEffectiveStatement;
186 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIncludeEffectiveStatement;
187 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLeafEffectiveStatement;
188 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLeafListEffectiveStatement;
189 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLengthEffectiveStatement;
190 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyListEffectiveStatement;
191 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLocalKeyEffectiveStatement;
192 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMandatoryEffectiveStatement;
193 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMaxElementsEffectiveStatement;
194 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMinElementsEffectiveStatement;
195 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyModifierEffectiveStatement;
196 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyMustEffectiveStatement;
197 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyNamespaceEffectiveStatement;
198 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyOrderedByEffectiveStatement;
199 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyOrganizationEffectiveStatement;
200 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPathEffectiveStatement;
201 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPatternEffectiveStatement;
202 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPositionEffectiveStatement;
203 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPrefixEffectiveStatement;
204 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyPresenceEffectiveStatement;
205 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRangeEffectiveStatement;
206 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyReferenceEffectiveStatement;
207 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRequireInstanceEffectiveStatement;
208 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRevisionDateEffectiveStatement;
209 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyRevisionEffectiveStatement;
210 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyStatusEffectiveStatement;
211 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyUniqueEffectiveStatement;
212 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyUnitsEffectiveStatement;
213 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyValueEffectiveStatement;
214 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyWhenEffectiveStatement;
215 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYangVersionEffectiveStatement;
216 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYinElementEffectiveStatement;
217 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ExtensionEffectiveStatementImpl;
218 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.GroupingEffectiveStatementImpl;
219 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ImportEffectiveStatementImpl;
220 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.NotificationEffectiveStatementImpl;
221 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnydataEffectiveStatement;
222 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnyxmlEffectiveStatement;
223 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularArgumentEffectiveStatement;
224 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBaseEffectiveStatement;
225 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBelongsToEffectiveStatement;
226 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBitEffectiveStatement;
227 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularChoiceEffectiveStatement;
228 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularConfigEffectiveStatement;
229 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContactEffectiveStatement;
230 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContainerEffectiveStatement;
231 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDefaultEffectiveStatement;
232 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDescriptionEffectiveStatement;
233 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularEnumEffectiveStatement;
234 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorAppTagEffectiveStatement;
235 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorMessageEffectiveStatement;
236 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFeatureEffectiveStatement;
237 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularForeignKeyEffectiveStatement;
238 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFractionDigitsEffectiveStatement;
239 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIdentityEffectiveStatement;
240 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIfFeatureEffectiveStatement;
241 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIncludeEffectiveStatement;
242 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLeafEffectiveStatement;
243 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLeafListEffectiveStatement;
244 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLengthEffectiveStatement;
245 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularListEffectiveStatement;
246 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLocalKeyEffectiveStatement;
247 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMandatoryEffectiveStatement;
248 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMaxElementsEffectiveStatement;
249 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMinElementsEffectiveStatement;
250 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularModifierEffectiveStatement;
251 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularMustEffectiveStatement;
252 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularNamespaceEffectiveStatement;
253 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularOrderedByEffectiveStatement;
254 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularOrganizationEffectiveStatement;
255 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPathEffectiveStatement;
256 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPatternEffectiveStatement;
257 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPositionEffectiveStatement;
258 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPrefixEffectiveStatement;
259 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularPresenceEffectiveStatement;
260 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRangeEffectiveStatement;
261 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularReferenceEffectiveStatement;
262 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRequireInstanceEffectiveStatement;
263 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRevisionDateEffectiveStatement;
264 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularRevisionEffectiveStatement;
265 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularStatusEffectiveStatement;
266 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularUniqueEffectiveStatement;
267 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularUnitsEffectiveStatement;
268 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularValueEffectiveStatement;
269 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularWhenEffectiveStatement;
270 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularYangVersionEffectiveStatement;
271 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularYinElementEffectiveStatement;
272 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RpcEffectiveStatementImpl;
273 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.SlimLeafListEffectiveStatement;
274 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.TypedefEffectiveStatementImpl;
275 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredCaseEffectiveStatement;
276 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredInputEffectiveStatement;
277 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredOutputEffectiveStatement;
278 import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
279
280 /**
281  * Static entry point to instantiating {@link EffectiveStatement} covered in the {@code RFC7950} metamodel.
282  */
283 @Beta
284 @NonNullByDefault
285 public final class EffectiveStatements {
286     private EffectiveStatements() {
287         // Hidden on purpose
288     }
289
290     public static ActionEffectiveStatement copyAction(final ActionEffectiveStatement original, final QName argument,
291             final int flags) {
292         checkArgument(original instanceof ActionEffectiveStatementImpl, "Unsupported original %s", original);
293         return new ActionEffectiveStatementImpl((ActionEffectiveStatementImpl) original, argument, flags);
294     }
295
296     public static ActionEffectiveStatement createAction(final ActionStatement declared, final QName argument,
297             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
298                 throws SubstatementIndexingException {
299         return new ActionEffectiveStatementImpl(declared, argument, flags, substatements);
300     }
301
302     public static AnydataEffectiveStatement copyAnydata(final AnydataEffectiveStatement original, final QName argument,
303             final int flags) {
304         if (original instanceof RegularAnydataEffectiveStatement) {
305             return new RegularAnydataEffectiveStatement((RegularAnydataEffectiveStatement) original, argument, flags);
306         } else if (original instanceof EmptyAnydataEffectiveStatement) {
307             return new EmptyAnydataEffectiveStatement((EmptyAnydataEffectiveStatement) original, argument, flags);
308         } else {
309             throw new IllegalArgumentException("Unsupported original " + original);
310         }
311     }
312
313     public static AnydataEffectiveStatement createAnydata(final AnydataStatement declared, final QName argument,
314             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
315         return substatements.isEmpty() ? new EmptyAnydataEffectiveStatement(declared, argument, flags)
316             : new RegularAnydataEffectiveStatement(declared, argument, flags, substatements);
317     }
318
319     public static AnyxmlEffectiveStatement copyAnyxml(final AnyxmlEffectiveStatement original, final QName argument,
320             final int flags) {
321         if (original instanceof RegularAnyxmlEffectiveStatement) {
322             return new RegularAnyxmlEffectiveStatement((RegularAnyxmlEffectiveStatement) original, argument, flags);
323         } else if (original instanceof EmptyAnyxmlEffectiveStatement) {
324             return new EmptyAnyxmlEffectiveStatement((EmptyAnyxmlEffectiveStatement) original, argument, flags);
325         } else {
326             throw new IllegalArgumentException("Unsupported original " + original);
327         }
328     }
329
330     public static AnyxmlEffectiveStatement createAnyxml(final AnyxmlStatement declared, final QName argument,
331             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
332         return substatements.isEmpty() ? new EmptyAnyxmlEffectiveStatement(declared, argument, flags)
333             : new RegularAnyxmlEffectiveStatement(declared, argument, flags, substatements);
334     }
335
336     public static ArgumentEffectiveStatement createArgument(final ArgumentStatement declared,
337             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
338         return substatements.isEmpty() ? new EmptyArgumentEffectiveStatement(declared)
339             : new RegularArgumentEffectiveStatement(declared, substatements);
340     }
341
342     public static AugmentEffectiveStatement createAugment(final AugmentStatement declared,
343             final SchemaNodeIdentifier argument, final int flags, final QNameModule rootModuleQName,
344             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
345             final @Nullable AugmentationSchemaNode original) throws SubstatementIndexingException {
346         return new AugmentEffectiveStatementImpl(declared, argument, flags, rootModuleQName, substatements, original);
347     }
348
349     public static BaseEffectiveStatement createBase(final BaseStatement declared,
350             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
351         return substatements.isEmpty() ? new EmptyBaseEffectiveStatement(declared)
352             : new RegularBaseEffectiveStatement(declared, substatements);
353     }
354
355     public static BelongsToEffectiveStatement createBelongsTo(final BelongsToStatement declared,
356             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
357         return substatements.isEmpty() ? new EmptyBelongsToEffectiveStatement(declared)
358             : new RegularBelongsToEffectiveStatement(declared, substatements);
359     }
360
361     public static BitEffectiveStatement createBit(final BitStatement declared,
362             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
363         return substatements.isEmpty() ? new EmptyBitEffectiveStatement(declared)
364             : new RegularBitEffectiveStatement(declared, substatements);
365     }
366
367     public static CaseEffectiveStatement copyCase(final CaseEffectiveStatement original, final QName argument,
368             final int flags) {
369         if (original instanceof DeclaredCaseEffectiveStatement) {
370             return new DeclaredCaseEffectiveStatement((DeclaredCaseEffectiveStatement) original, argument, flags);
371         } else if (original instanceof UndeclaredCaseEffectiveStatement) {
372             return new UndeclaredCaseEffectiveStatement((UndeclaredCaseEffectiveStatement) original, argument, flags);
373         } else {
374             throw new IllegalArgumentException("Unsupported origin " + original);
375         }
376     }
377
378     public static CaseEffectiveStatement createCase(final QName argument, final int flags,
379             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
380         return new UndeclaredCaseEffectiveStatement(substatements, argument, flags);
381     }
382
383     public static CaseEffectiveStatement createCase(final CaseStatement declared, final QName argument,
384             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
385         return new DeclaredCaseEffectiveStatement(declared, substatements, argument, flags);
386     }
387
388     public static ChoiceEffectiveStatement copyChoice(final ChoiceEffectiveStatement original,
389             final QName argument, final int flags) {
390         checkArgument(original instanceof AbstractChoiceEffectiveStatement, "Unsupported original %s", original);
391         final var orig = (AbstractChoiceEffectiveStatement) original;
392         return argument.equals(orig.getDeclared().argument()) && orig.getDefaultCase().isEmpty()
393             ? new EmptyChoiceEffectiveStatement(orig, flags)
394                 : new RegularChoiceEffectiveStatement((AbstractChoiceEffectiveStatement) original, argument, flags);
395     }
396
397     public static ChoiceEffectiveStatement createChoice(final ChoiceStatement declared, final QName argument,
398             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
399             final @Nullable CaseSchemaNode defaultCase) {
400         return defaultCase == null && argument.equals(declared.argument())
401             ? new EmptyChoiceEffectiveStatement(declared, substatements, flags)
402                 : new RegularChoiceEffectiveStatement(declared, substatements, argument, flags, defaultCase);
403     }
404
405     public static ConfigEffectiveStatement createConfig(final boolean argument) {
406         return argument ? EmptyConfigEffectiveStatement.TRUE : EmptyConfigEffectiveStatement.FALSE;
407     }
408
409     public static ConfigEffectiveStatement createConfig(final ConfigStatement declared) {
410         return new EmptyConfigEffectiveStatement(declared);
411     }
412
413     public static ConfigEffectiveStatement createConfig(final ConfigStatement declared,
414             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
415         return substatements.isEmpty() ? createConfig(declared)
416             : new RegularConfigEffectiveStatement(declared, substatements);
417     }
418
419     public static ContactEffectiveStatement createContact(final ContactStatement declared) {
420         return new EmptyContactEffectiveStatement(declared);
421     }
422
423     public static ContactEffectiveStatement createContact(final ContactStatement declared,
424             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
425         return substatements.isEmpty() ? createContact(declared)
426             : new RegularContactEffectiveStatement(declared, substatements);
427     }
428
429     public static ContainerEffectiveStatement copyContainer(final ContainerEffectiveStatement original,
430             final QName argument, final int flags) {
431         checkArgument(original instanceof AbstractContainerEffectiveStatement, "Unsupported original %s", original);
432         final var orig = (AbstractContainerEffectiveStatement) original;
433         return argument.equals(orig.getDeclared().argument()) ? new EmptyContainerEffectiveStatement(orig, flags)
434             : new RegularContainerEffectiveStatement(orig, argument, flags);
435     }
436
437     public static ContainerEffectiveStatement createContainer(final ContainerStatement declared, final QName argument,
438             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
439         return argument.equals(declared.argument())
440             ? new EmptyContainerEffectiveStatement(declared, substatements, flags)
441                 : new RegularContainerEffectiveStatement(declared, substatements, argument, flags);
442     }
443
444     public static DefaultEffectiveStatement createDefault(final DefaultStatement declared,
445             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
446         return substatements.isEmpty() ? new EmptyDefaultEffectiveStatement(declared)
447             : new RegularDefaultEffectiveStatement(declared, substatements);
448     }
449
450     public static DescriptionEffectiveStatement createDescription(final DescriptionStatement declared,
451             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
452         return substatements.isEmpty() ? new EmptyDescriptionEffectiveStatement(declared)
453             : new RegularDescriptionEffectiveStatement(declared, substatements);
454     }
455
456     public static DeviateEffectiveStatement createDeviate(final DeviateStatement declared,
457             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
458         return new DeviateEffectiveStatementImpl(declared, substatements);
459     }
460
461     public static DeviationEffectiveStatement createDeviation(final DeviationStatement declared,
462             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
463         return new DeviationEffectiveStatementImpl(declared, substatements);
464     }
465
466     public static EnumEffectiveStatement createEnum(final EnumStatement declared,
467             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
468         return substatements.isEmpty() ? new EmptyEnumEffectiveStatement(declared)
469             : new RegularEnumEffectiveStatement(declared, substatements);
470     }
471
472     public static ErrorAppTagEffectiveStatement createErrorAppTag(final ErrorAppTagStatement declared,
473             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
474         return substatements.isEmpty() ? new EmptyErrorAppTagEffectiveStatement(declared)
475             : new RegularErrorAppTagEffectiveStatement(declared, substatements);
476     }
477
478     public static ErrorMessageEffectiveStatement createErrorMessage(final ErrorMessageStatement declared,
479             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
480         return substatements.isEmpty() ? new EmptyErrorMessageEffectiveStatement(declared)
481             : new RegularErrorMessageEffectiveStatement(declared, substatements);
482     }
483
484     public static ExtensionEffectiveStatement createExtension(final ExtensionStatement declared,
485             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
486         return new ExtensionEffectiveStatementImpl(declared, substatements);
487     }
488
489     public static FeatureEffectiveStatement createFeature(final FeatureStatement declared, final int flags,
490             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
491         return substatements.isEmpty() ? new EmptyFeatureEffectiveStatement(declared, flags)
492             : new RegularFeatureEffectiveStatement(declared, flags, substatements);
493     }
494
495     public static FractionDigitsEffectiveStatement createFractionDigits(final FractionDigitsStatement declared) {
496         return new EmptyFractionDigitsEffectiveStatement(declared);
497     }
498
499     public static FractionDigitsEffectiveStatement createFractionDigits(final FractionDigitsStatement declared,
500             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
501         return substatements.isEmpty() ? createFractionDigits(declared)
502             : new RegularFractionDigitsEffectiveStatement(declared, substatements);
503     }
504
505     public static GroupingEffectiveStatement createGrouping(final GroupingStatement declared,
506             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
507             final int flags) throws SubstatementIndexingException {
508         return new GroupingEffectiveStatementImpl(declared, substatements, argument, flags);
509     }
510
511     public static IfFeatureEffectiveStatement createIfFeature(final IfFeatureStatement declared,
512             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
513         return substatements.isEmpty() ? new EmptyIfFeatureEffectiveStatement(declared)
514             : new RegularIfFeatureEffectiveStatement(declared, substatements);
515     }
516
517     public static IdentityEffectiveStatement createIdentity(final IdentityStatement declared) {
518         return new EmptyIdentityEffectiveStatement(declared);
519     }
520
521     public static IdentityEffectiveStatement createIdentity(final IdentityStatement declared, final int flags,
522             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
523             final ImmutableSet<IdentitySchemaNode> baseIdentities) {
524         return new RegularIdentityEffectiveStatement(declared, flags, substatements, baseIdentities);
525     }
526
527     public static ImportEffectiveStatement createImport(final ImportStatement declared,
528             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
529             final SourceIdentifier importedSource) {
530         return new ImportEffectiveStatementImpl(declared, substatements, importedSource);
531     }
532
533     public static IncludeEffectiveStatement createInclude(final IncludeStatement declared,
534             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
535         return substatements.isEmpty() ? new EmptyIncludeEffectiveStatement(declared)
536             : new RegularIncludeEffectiveStatement(declared, substatements);
537     }
538
539     public static InputEffectiveStatement copyInput(final InputEffectiveStatement original, final QName argument,
540             final int flags) {
541         if (original instanceof DeclaredInputEffectiveStatement) {
542             return new DeclaredInputEffectiveStatement((DeclaredInputEffectiveStatement) original, argument, flags);
543         } else if (original instanceof UndeclaredInputEffectiveStatement) {
544             return new UndeclaredInputEffectiveStatement((UndeclaredInputEffectiveStatement) original, argument, flags);
545         } else {
546             throw new IllegalArgumentException("Unsupported original " + original);
547         }
548     }
549
550     public static InputEffectiveStatement createInput(final QName argument, final int flags,
551             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
552             throws SubstatementIndexingException {
553         return new UndeclaredInputEffectiveStatement(substatements, argument, flags);
554     }
555
556     public static InputEffectiveStatement createInput(final InputStatement declared, final QName argument,
557             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
558                 throws SubstatementIndexingException {
559         return new DeclaredInputEffectiveStatement(declared, substatements, argument, flags);
560     }
561
562     public static KeyEffectiveStatement createKey(final KeyStatement declared, final Set<QName> argument,
563             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
564         if (substatements.isEmpty()) {
565             return argument.equals(declared.argument()) ? new EmptyLocalKeyEffectiveStatement(declared)
566                 : new EmptyForeignKeyEffectiveStatement(declared, argument);
567         }
568         return argument.equals(declared.argument()) ? new RegularLocalKeyEffectiveStatement(declared, substatements)
569             : new RegularForeignKeyEffectiveStatement(declared, argument, substatements);
570     }
571
572     public static LeafEffectiveStatement copyLeaf(final LeafEffectiveStatement original, final QName argument,
573             final int flags) {
574         checkArgument(original instanceof AbstractLeafEffectiveStatement, "Unsupported original %s", original);
575         final var orig = (AbstractLeafEffectiveStatement) original;
576         return argument.equals(orig.getDeclared().argument()) ? new EmptyLeafEffectiveStatement(orig, flags)
577             : new RegularLeafEffectiveStatement(orig, argument, flags);
578     }
579
580     public static LeafEffectiveStatement createLeaf(final LeafStatement declared, final QName argument, final int flags,
581             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
582                 throws SubstatementIndexingException {
583         return argument.equals(declared.argument()) ? new EmptyLeafEffectiveStatement(declared, flags, substatements)
584             : new RegularLeafEffectiveStatement(declared, argument, flags, substatements);
585     }
586
587     public static LeafListEffectiveStatement copyLeafList(final LeafListEffectiveStatement original,
588             final QName argument, final int flags) {
589         if (original instanceof RegularLeafListEffectiveStatement) {
590             return new RegularLeafListEffectiveStatement((RegularLeafListEffectiveStatement) original, argument, flags);
591         } else if (original instanceof SlimLeafListEffectiveStatement) {
592             return new SlimLeafListEffectiveStatement((SlimLeafListEffectiveStatement) original, argument, flags);
593         } else if (original instanceof EmptyLeafListEffectiveStatement) {
594             // Promote to slim
595             return new SlimLeafListEffectiveStatement((EmptyLeafListEffectiveStatement) original, argument, flags);
596         } else {
597             throw new IllegalArgumentException("Unsupported original " + original);
598         }
599     }
600
601     public static LeafListEffectiveStatement createLeafList(final LeafListStatement declared, final QName argument,
602             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
603             final ImmutableSet<String> defaultValues, final @Nullable ElementCountConstraint elementCountConstraint)
604                 throws SubstatementIndexingException {
605         if (defaultValues.isEmpty()) {
606             return elementCountConstraint == null && argument.equals(declared.argument())
607                 ? new EmptyLeafListEffectiveStatement(declared, flags, substatements)
608                     : new SlimLeafListEffectiveStatement(declared, argument, flags, substatements,
609                         elementCountConstraint);
610         }
611
612         return new RegularLeafListEffectiveStatement(declared, argument, flags, substatements, defaultValues,
613             elementCountConstraint);
614     }
615
616     public static LengthEffectiveStatement createLength(final LengthStatement declared,
617             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
618         return substatements.isEmpty() ? new EmptyLengthEffectiveStatement(declared)
619             : new RegularLengthEffectiveStatement(declared, substatements);
620     }
621
622     public static ListEffectiveStatement copyList(final ListEffectiveStatement original, final QName argument,
623             final int flags) {
624         if (original instanceof RegularListEffectiveStatement) {
625             return new RegularListEffectiveStatement((RegularListEffectiveStatement) original, argument, flags);
626         } else if (original instanceof EmptyListEffectiveStatement) {
627             return new RegularListEffectiveStatement((EmptyListEffectiveStatement) original, argument, flags);
628         } else {
629             throw new IllegalArgumentException("Unsupported original " + original);
630         }
631     }
632
633     public static ListEffectiveStatement createList(final ListStatement declared, final QName argument,
634             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
635             final ImmutableList<QName> keyDefinition, final @Nullable ElementCountConstraint elementCountConstraint) {
636         return elementCountConstraint == null && argument.equals(declared.argument())
637             ? new EmptyListEffectiveStatement(declared, flags, substatements, keyDefinition)
638                 : new RegularListEffectiveStatement(declared, argument, flags, substatements, keyDefinition,
639                     elementCountConstraint);
640     }
641
642     public static MandatoryEffectiveStatement createMandatory(final MandatoryStatement declared) {
643         return new EmptyMandatoryEffectiveStatement(declared);
644     }
645
646     public static MandatoryEffectiveStatement createMandatory(final MandatoryStatement declared,
647             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
648         return substatements.isEmpty() ? createMandatory(declared)
649             : new RegularMandatoryEffectiveStatement(declared, substatements);
650     }
651
652     public static MaxElementsEffectiveStatement createMaxElements(final MaxElementsStatement declared,
653             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
654         return substatements.isEmpty() ? new EmptyMaxElementsEffectiveStatement(declared)
655             : new RegularMaxElementsEffectiveStatement(declared, substatements);
656     }
657
658     public static MinElementsEffectiveStatement createMinElements(final MinElementsStatement declared) {
659         return new EmptyMinElementsEffectiveStatement(declared);
660     }
661
662     public static MinElementsEffectiveStatement createMinElements(final MinElementsStatement declared,
663             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
664         return substatements.isEmpty() ? createMinElements(declared)
665             : new RegularMinElementsEffectiveStatement(declared, substatements);
666     }
667
668     public static ModifierEffectiveStatement createModifier(final ModifierStatement declared,
669             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
670         return substatements.isEmpty() ? new EmptyModifierEffectiveStatement(declared)
671             : new RegularModifierEffectiveStatement(declared, substatements);
672     }
673
674     public static MustEffectiveStatement createMust(final MustStatement declared,
675             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
676         return substatements.isEmpty() ? new EmptyMustEffectiveStatement(declared)
677             : new RegularMustEffectiveStatement(declared, substatements);
678     }
679
680     public static NamespaceEffectiveStatement createNamespace(final NamespaceStatement declared,
681             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
682         return substatements.isEmpty() ? new EmptyNamespaceEffectiveStatement(declared)
683             : new RegularNamespaceEffectiveStatement(declared, substatements);
684     }
685
686     public static NotificationEffectiveStatement copyNotification(final NotificationEffectiveStatement original,
687             final QName argument, final int flags) {
688         checkArgument(original instanceof NotificationEffectiveStatementImpl, "Unsupported original %s", original);
689         return new NotificationEffectiveStatementImpl((NotificationEffectiveStatementImpl) original, argument, flags);
690     }
691
692     public static NotificationEffectiveStatement createNotification(final NotificationStatement declared,
693             final QName argument, final int flags,
694             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
695                 throws SubstatementIndexingException {
696         return new NotificationEffectiveStatementImpl(declared, substatements, argument, flags);
697     }
698
699     public static OutputEffectiveStatement copyOutput(final OutputEffectiveStatement original, final QName argument,
700             final int flags) {
701         if (original instanceof DeclaredOutputEffectiveStatement) {
702             return new DeclaredOutputEffectiveStatement((DeclaredOutputEffectiveStatement) original, argument, flags);
703         } else if (original instanceof UndeclaredOutputEffectiveStatement) {
704             return new UndeclaredOutputEffectiveStatement((UndeclaredOutputEffectiveStatement) original, argument,
705                 flags);
706         } else {
707             throw new IllegalArgumentException("Unsupported original " + original);
708         }
709     }
710
711     public static OutputEffectiveStatement createOutput(final QName argument, final int flags,
712             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
713             throws SubstatementIndexingException {
714         return new UndeclaredOutputEffectiveStatement(substatements, argument, flags);
715     }
716
717     public static OutputEffectiveStatement createOutput(final OutputStatement declared, final QName argument,
718             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
719                 throws SubstatementIndexingException {
720         return new DeclaredOutputEffectiveStatement(declared, substatements, argument, flags);
721     }
722
723     public static OrderedByEffectiveStatement createOrderedBy(final OrderedByStatement declared) {
724         return new EmptyOrderedByEffectiveStatement(declared);
725     }
726
727     public static OrderedByEffectiveStatement createOrderedBy(final OrderedByStatement declared,
728             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
729         return substatements.isEmpty() ? createOrderedBy(declared)
730             : new RegularOrderedByEffectiveStatement(declared, substatements);
731     }
732
733     public static OrganizationEffectiveStatement createOrganization(final OrganizationStatement declared) {
734         return new EmptyOrganizationEffectiveStatement(declared);
735     }
736
737     public static OrganizationEffectiveStatement createOrganization(final OrganizationStatement declared,
738             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
739         return substatements.isEmpty() ? createOrganization(declared)
740             : new RegularOrganizationEffectiveStatement(declared, substatements);
741     }
742
743     public static PathEffectiveStatement createPath(final PathStatement declared,
744             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
745         return substatements.isEmpty() ? new EmptyPathEffectiveStatement(declared)
746             : new RegularPathEffectiveStatement(declared, substatements);
747     }
748
749     public static PatternEffectiveStatement createPattern(final PatternStatement declared,
750             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
751         return substatements.isEmpty() ? new EmptyPatternEffectiveStatement(declared)
752             : new RegularPatternEffectiveStatement(declared, substatements);
753     }
754
755     public static PositionEffectiveStatement createPosition(final PositionStatement declared) {
756         return new EmptyPositionEffectiveStatement(declared);
757     }
758
759     public static PositionEffectiveStatement createPosition(final PositionStatement declared,
760             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
761         return substatements.isEmpty() ? createPosition(declared)
762             : new RegularPositionEffectiveStatement(declared, substatements);
763     }
764
765     public static PrefixEffectiveStatement createPrefix(final PrefixStatement declared,
766             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
767         return substatements.isEmpty() ? new EmptyPrefixEffectiveStatement(declared)
768             : new RegularPrefixEffectiveStatement(declared, substatements);
769     }
770
771     public static PresenceEffectiveStatement createPresence(final PresenceStatement declared,
772             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
773         return substatements.isEmpty() ? new EmptyPresenceEffectiveStatement(declared)
774             : new RegularPresenceEffectiveStatement(declared, substatements);
775     }
776
777     public static RangeEffectiveStatement createRange(final RangeStatement declared,
778             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
779         return substatements.isEmpty() ? new EmptyRangeEffectiveStatement(declared)
780             : new RegularRangeEffectiveStatement(declared, substatements);
781     }
782
783     public static ReferenceEffectiveStatement createReference(final ReferenceStatement declared) {
784         return new EmptyReferenceEffectiveStatement(declared);
785     }
786
787     public static ReferenceEffectiveStatement createReference(final ReferenceStatement declared,
788             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
789         return substatements.isEmpty() ? createReference(declared)
790             : new RegularReferenceEffectiveStatement(declared, substatements);
791     }
792
793     public static RevisionEffectiveStatement createRevision(final RevisionStatement declared,
794             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
795         return substatements.isEmpty() ? new EmptyRevisionEffectiveStatement(declared)
796             : new RegularRevisionEffectiveStatement(declared, substatements);
797     }
798
799     public static RequireInstanceEffectiveStatement createRequireInstance(final boolean argument) {
800         return argument ? EmptyRequireInstanceEffectiveStatement.TRUE : EmptyRequireInstanceEffectiveStatement.FALSE;
801     }
802
803     public static RequireInstanceEffectiveStatement createRequireInstance(final RequireInstanceStatement declared) {
804         if (EmptyRequireInstanceStatement.TRUE.equals(declared)) {
805             return EmptyRequireInstanceEffectiveStatement.TRUE;
806         } else if (EmptyRequireInstanceStatement.FALSE.equals(declared)) {
807             return EmptyRequireInstanceEffectiveStatement.FALSE;
808         } else {
809             return new EmptyRequireInstanceEffectiveStatement(declared);
810         }
811     }
812
813     public static RequireInstanceEffectiveStatement createRequireInstance(final RequireInstanceStatement declared,
814             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
815         return substatements.isEmpty() ? createRequireInstance(declared)
816             : new RegularRequireInstanceEffectiveStatement(declared, substatements);
817     }
818
819     public static RevisionDateEffectiveStatement createRevisionDate(final RevisionDateStatement declared,
820             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
821         return substatements.isEmpty() ? new EmptyRevisionDateEffectiveStatement(declared)
822             : new RegularRevisionDateEffectiveStatement(declared, substatements);
823     }
824
825     public static RpcEffectiveStatement createRpc(final RpcStatement declared,
826             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
827             final int flags) throws SubstatementIndexingException {
828         return new RpcEffectiveStatementImpl(declared, substatements, argument, flags);
829     }
830
831     public static StatusEffectiveStatement createStatus(final StatusStatement declared) {
832         // Aggressively reuse effective instances which are backed by the corresponding empty declared instance, as this
833         // is the case unless there is a weird extension in use.
834         if (EmptyStatusStatement.DEPRECATED.equals(declared)) {
835             // Most likely to be seen (as current is the default)
836             return EmptyStatusEffectiveStatement.DEPRECATED;
837         } else if (EmptyStatusStatement.OBSOLETE.equals(declared)) {
838             // less likely
839             return EmptyStatusEffectiveStatement.OBSOLETE;
840         } else if (EmptyStatusStatement.CURRENT.equals(declared)) {
841             // ... okay, why is this there? :)
842             return EmptyStatusEffectiveStatement.CURRENT;
843         } else {
844             return new EmptyStatusEffectiveStatement(declared);
845         }
846     }
847
848     public static StatusEffectiveStatement createStatus(final StatusStatement declared,
849             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
850         return substatements.isEmpty() ? createStatus(declared)
851             : new RegularStatusEffectiveStatement(declared, substatements);
852     }
853
854     public static TypedefEffectiveStatement createTypedef(final TypedefStatement declared, final int flags,
855             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
856         return new TypedefEffectiveStatementImpl(declared, flags, substatements);
857     }
858
859     public static UnitsEffectiveStatement createUnits(final UnitsStatement declared,
860             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
861         return substatements.isEmpty() ? new EmptyUnitsEffectiveStatement(declared)
862             : new RegularUnitsEffectiveStatement(declared, substatements);
863     }
864
865     public static UniqueEffectiveStatement createUnique(final UniqueStatement declared,
866             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
867         return substatements.isEmpty() ? new EmptyUniqueEffectiveStatement(declared)
868             : new RegularUniqueEffectiveStatement(declared, substatements);
869     }
870
871     public static ValueEffectiveStatement createValue(final ValueStatement declared) {
872         return new EmptyValueEffectiveStatement(declared);
873     }
874
875     public static ValueEffectiveStatement createValue(final ValueStatement declared,
876             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
877         return substatements.isEmpty() ? createValue(declared)
878             : new RegularValueEffectiveStatement(declared, substatements);
879     }
880
881     public static WhenEffectiveStatement createWhen(final WhenStatement declared,
882             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
883         return substatements.isEmpty() ? new EmptyWhenEffectiveStatement(declared)
884             : new RegularWhenEffectiveStatement(declared, substatements);
885     }
886
887     public static YangVersionEffectiveStatement createYangVersion(final YangVersionStatement declared) {
888         if (EmptyYangVersionStatement.VERSION_1.equals(declared)) {
889             return EmptyYangVersionEffectiveStatement.VERSION_1;
890         } else if (EmptyYangVersionStatement.VERSION_1_1.equals(declared)) {
891             return EmptyYangVersionEffectiveStatement.VERSION_1_1;
892         } else {
893             return new EmptyYangVersionEffectiveStatement(declared);
894         }
895     }
896
897     public static YangVersionEffectiveStatement createYangVersion(final YangVersionStatement declared,
898             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
899         return substatements.isEmpty() ? createYangVersion(declared)
900             : new RegularYangVersionEffectiveStatement(declared, substatements);
901     }
902
903     public static YinElementEffectiveStatement createYinElement(final YinElementStatement declared) {
904         return new EmptyYinElementEffectiveStatement(declared);
905     }
906
907     public static YinElementEffectiveStatement createYinElement(final YinElementStatement declared,
908         final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
909         return substatements.isEmpty() ? createYinElement(declared)
910             : new RegularYinElementEffectiveStatement(declared, substatements);
911     }
912 }