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