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