Make getIfFeaturePredicate() a default method
[yangtools.git] / yang / yang-model-api / src / main / java / org / opendaylight / yangtools / yang / model / api / YangStmtMapping.java
index fc1086120540ac6d6aff9f189fa86c0dbab92c1a..d53dde83a250223a44624be3bebee2d5101fc166 100644 (file)
  */
 package org.opendaylight.yangtools.yang.model.api;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.BitEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.CaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DeviationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.EnumEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IdentityEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.IncludeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.LengthEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.MustEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PathEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PositionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PresenceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RangeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ValueEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
 
 /**
  * Mapping for both RFC6020 and RFC7950 statements.
  */
 @Beta
+@NonNullByDefault
 public enum YangStmtMapping implements StatementDefinition {
-    ANYDATA(AnydataStatement.class, "anydata", "name"),
-    ANYXML(AnyxmlStatement.class, "anyxml", "name"),
-    ARGUMENT(ArgumentStatement.class, "argument", "name"),
-    AUGMENT(AugmentStatement.class, "augment", "target-node"),
-    BASE(BaseStatement.class, "base", "name"),
-    BELONGS_TO(BelongsToStatement.class, "belongs-to", "module"),
-    BIT(BitStatement.class, "bit", "name"),
-    CASE(CaseStatement.class, "case", "name"),
-    CHOICE(ChoiceStatement.class, "choice", "name"),
-    CONFIG(ConfigStatement.class, "config", "value"),
-    CONTACT(ContactStatement.class, "contact", "text", true),
-    CONTAINER(ContainerStatement.class, "container", "name"),
-    DEFAULT(DefaultStatement.class, "default", "value"),
-    DESCRIPTION(DescriptionStatement.class, "description", "text", true),
-    DEVIATE(DeviateStatement.class, "deviate", "value"),
-    DEVIATION(DeviationStatement.class, "deviation", "target-node"),
-    ENUM(EnumStatement.class, "enum", "name"),
-    ERROR_APP_TAG(ErrorAppTagStatement.class, "error-app-tag", "value"),
-    ERROR_MESSAGE(ErrorMessageStatement.class, "error-message", "value", true),
-    EXTENSION(ExtensionStatement.class, "extension", "name"),
-    FEATURE(FeatureStatement.class, "feature", "name"),
-    FRACTION_DIGITS(FractionDigitsStatement.class, "fraction-digits", "value"),
-    GROUPING(GroupingStatement.class, "grouping", "name"),
-    IDENTITY(IdentityStatement.class, "identity", "name"),
-    IF_FEATURE(IfFeatureStatement.class, "if-feature", "name"),
-    IMPORT(ImportStatement.class, "import", "module"),
-    INCLUDE(IncludeStatement.class, "include", "module"),
-    INPUT(InputStatement.class, "input"),
-    KEY(KeyStatement.class, "key", "value"),
-    LEAF(LeafStatement.class, "leaf", "name"),
-    LEAF_LIST(LeafListStatement.class, "leaf-list", "name"),
-    LENGTH(LengthStatement.class, "length", "value"),
-    LIST(ListStatement.class, "list", "name"),
-    MANDATORY(MandatoryStatement.class, "mandatory", "value"),
-    MAX_ELEMENTS(MaxElementsStatement.class, "max-elements", "value"),
-    MIN_ELEMENTS(MinElementsStatement.class, "min-elements", "value"),
-    MODULE(ModuleStatement.class, "module", "name"),
-    MUST(MustStatement.class, "must", "condition"),
-    NAMESPACE(NamespaceStatement.class, "namespace", "uri"),
-    NOTIFICATION(NotificationStatement.class, "notification", "name"),
-    ORDERED_BY(OrderedByStatement.class, "ordered-by", "value"),
-    ORGANIZATION(OrganizationStatement.class, "organization", "text", true),
-    OUTPUT(OutputStatement.class, "output"),
-    PATH(PathStatement.class, "path", "value"),
-    PATTERN(PatternStatement.class, "pattern", "value"),
-    POSITION(PositionStatement.class, "position", "value"),
-    PREFIX(PrefixStatement.class, "prefix", "value"),
-    PRESENCE(PresenceStatement.class, "presence", "value"),
-    RANGE(RangeStatement.class, "range", "value"),
-    REFERENCE(ReferenceStatement.class, "reference", "text", true),
-    REFINE(RefineStatement.class, "refine", "target-node"),
-    REQUIRE_INSTANCE(RequireInstanceStatement.class, "require-instance", "value"),
-    REVISION(RevisionStatement.class, "revision", "date"),
-    REVISION_DATE(RevisionDateStatement.class, "revision-date", "date"),
-    RPC(RpcStatement.class, "rpc", "name"),
-    STATUS(StatusStatement.class, "status", "value"),
-    SUBMODULE(SubmoduleStatement.class, "submodule", "name"),
-    TYPE(TypeStatement.class, "type", "name"),
-    TYPEDEF(TypedefStatement.class, "typedef", "name"),
-    UNIQUE(UniqueStatement.class, "unique", "tag"),
-    UNITS(UnitsStatement.class, "units", "name"),
-    USES(UsesStatement.class, "uses", "name"),
-    VALUE(ValueStatement.class, "value", "value"),
-    WHEN(WhenStatement.class, "when", "condition"),
-    YANG_VERSION(YangVersionStatement.class, "yang-version", "value"),
-    YIN_ELEMENT(YinElementStatement.class, "yin-element", "value");
+    ACTION(ActionStatement.class, ActionEffectiveStatement.class, "action", "name"),
+    ANYDATA(AnydataStatement.class, AnydataEffectiveStatement.class, "anydata", "name"),
+    ANYXML(AnyxmlStatement.class, AnyxmlEffectiveStatement.class, "anyxml", "name"),
+    ARGUMENT(ArgumentStatement.class, ArgumentEffectiveStatement.class, "argument", "name"),
+    AUGMENT(AugmentStatement.class, AugmentEffectiveStatement.class, "augment", "target-node"),
+    BASE(BaseStatement.class, BaseEffectiveStatement.class, "base", "name"),
+    BELONGS_TO(BelongsToStatement.class, BelongsToEffectiveStatement.class, "belongs-to", "module"),
+    BIT(BitStatement.class, BitEffectiveStatement.class, "bit", "name"),
+    CASE(CaseStatement.class, CaseEffectiveStatement.class, "case", "name"),
+    CHOICE(ChoiceStatement.class, ChoiceEffectiveStatement.class, "choice", "name"),
+    CONFIG(ConfigStatement.class, ConfigEffectiveStatement.class, "config", "value"),
+    CONTACT(ContactStatement.class, ContactEffectiveStatement.class, "contact", "text", true),
+    CONTAINER(ContainerStatement.class, ContainerEffectiveStatement.class, "container", "name"),
+    DEFAULT(DefaultStatement.class, DefaultEffectiveStatement.class, "default", "value"),
+    DESCRIPTION(DescriptionStatement.class, DescriptionEffectiveStatement.class, "description", "text", true),
+    DEVIATE(DeviateStatement.class, DeviateEffectiveStatement.class, "deviate", "value"),
+    DEVIATION(DeviationStatement.class, DeviationEffectiveStatement.class, "deviation", "target-node"),
+    ENUM(EnumStatement.class, EnumEffectiveStatement.class, "enum", "name"),
+    ERROR_APP_TAG(ErrorAppTagStatement.class, ErrorAppTagEffectiveStatement.class, "error-app-tag", "value"),
+    ERROR_MESSAGE(ErrorMessageStatement.class, ErrorMessageEffectiveStatement.class, "error-message", "value", true),
+    EXTENSION(ExtensionStatement.class, ExtensionEffectiveStatement.class, "extension", "name"),
+    FEATURE(FeatureStatement.class, FeatureEffectiveStatement.class, "feature", "name"),
+    FRACTION_DIGITS(FractionDigitsStatement.class, FractionDigitsEffectiveStatement.class, "fraction-digits", "value"),
+    GROUPING(GroupingStatement.class, GroupingEffectiveStatement.class, "grouping", "name"),
+    IDENTITY(IdentityStatement.class, IdentityEffectiveStatement.class, "identity", "name"),
+    IF_FEATURE(IfFeatureStatement.class, IfFeatureEffectiveStatement.class, "if-feature", "name"),
+    IMPORT(ImportStatement.class, ImportEffectiveStatement.class, "import", "module"),
+    INCLUDE(IncludeStatement.class, IncludeEffectiveStatement.class, "include", "module"),
+    INPUT(InputStatement.class, InputEffectiveStatement.class, "input"),
+    KEY(KeyStatement.class, KeyEffectiveStatement.class, "key", "value"),
+    LEAF(LeafStatement.class, LeafEffectiveStatement.class, "leaf", "name"),
+    LEAF_LIST(LeafListStatement.class, LeafListEffectiveStatement.class, "leaf-list", "name"),
+    LENGTH(LengthStatement.class, LengthEffectiveStatement.class, "length", "value"),
+    LIST(ListStatement.class, ListEffectiveStatement.class, "list", "name"),
+    MANDATORY(MandatoryStatement.class, MandatoryEffectiveStatement.class, "mandatory", "value"),
+    MAX_ELEMENTS(MaxElementsStatement.class, MaxElementsEffectiveStatement.class, "max-elements", "value"),
+    MIN_ELEMENTS(MinElementsStatement.class, MinElementsEffectiveStatement.class, "min-elements", "value"),
+    MODIFIER(ModifierStatement.class, ModifierEffectiveStatement.class, "modifier", "value"),
+    MODULE(ModuleStatement.class, ModuleEffectiveStatement.class, "module", "name"),
+    MUST(MustStatement.class, MustEffectiveStatement.class, "must", "condition"),
+    NAMESPACE(NamespaceStatement.class, NamespaceEffectiveStatement.class, "namespace", "uri"),
+    NOTIFICATION(NotificationStatement.class, NotificationEffectiveStatement.class, "notification", "name"),
+    ORDERED_BY(OrderedByStatement.class, OrderedByEffectiveStatement.class, "ordered-by", "value"),
+    ORGANIZATION(OrganizationStatement.class, OrganizationEffectiveStatement.class, "organization", "text", true),
+    OUTPUT(OutputStatement.class, OutputEffectiveStatement.class, "output"),
+    PATH(PathStatement.class, PathEffectiveStatement.class, "path", "value"),
+    PATTERN(PatternStatement.class, PatternEffectiveStatement.class, "pattern", "value"),
+    POSITION(PositionStatement.class, PositionEffectiveStatement.class, "position", "value"),
+    PREFIX(PrefixStatement.class, PrefixEffectiveStatement.class, "prefix", "value"),
+    PRESENCE(PresenceStatement.class, PresenceEffectiveStatement.class, "presence", "value"),
+    RANGE(RangeStatement.class, RangeEffectiveStatement.class, "range", "value"),
+    REFERENCE(ReferenceStatement.class, ReferenceEffectiveStatement.class, "reference", "text", true),
+    REFINE(RefineStatement.class, RefineEffectiveStatement.class, "refine", "target-node"),
+    REQUIRE_INSTANCE(RequireInstanceStatement.class, RequireInstanceEffectiveStatement.class, "require-instance",
+        "value"),
+    REVISION(RevisionStatement.class, RevisionEffectiveStatement.class, "revision", "date"),
+    REVISION_DATE(RevisionDateStatement.class, RevisionDateEffectiveStatement.class, "revision-date", "date"),
+    RPC(RpcStatement.class, RpcEffectiveStatement.class, "rpc", "name"),
+    STATUS(StatusStatement.class, StatusEffectiveStatement.class, "status", "value"),
+    SUBMODULE(SubmoduleStatement.class, SubmoduleEffectiveStatement.class, "submodule", "name"),
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    TYPE(TypeStatement.class, (Class) TypeEffectiveStatement.class, "type", "name"),
+    TYPEDEF(TypedefStatement.class, TypedefEffectiveStatement.class, "typedef", "name"),
+    UNIQUE(UniqueStatement.class, UniqueEffectiveStatement.class, "unique", "tag"),
+    UNITS(UnitsStatement.class, UnitsEffectiveStatement.class, "units", "name"),
+    USES(UsesStatement.class, UsesEffectiveStatement.class, "uses", "name"),
+    VALUE(ValueStatement.class, ValueEffectiveStatement.class, "value", "value"),
+    WHEN(WhenStatement.class, WhenEffectiveStatement.class, "when", "condition"),
+    YANG_VERSION(YangVersionStatement.class, YangVersionEffectiveStatement.class, "yang-version", "value"),
+    YIN_ELEMENT(YinElementStatement.class, YinElementEffectiveStatement.class, "yin-element", "value");
 
-    private final Class<? extends DeclaredStatement<?>> type;
-    private final Class<? extends EffectiveStatement<?,?>> effectiveType;
+    private final Class<? extends DeclaredStatement<?>> declaredType;
+    private final Class<? extends EffectiveStatement<?, ?>> effectiveType;
     private final QName name;
-    private final QName argument;
+    private final @Nullable QName argument;
     private final boolean yinElement;
 
-    YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr) {
-        type = Preconditions.checkNotNull(clz);
-        //FIXME: fill up effective type correctly
-        effectiveType = null;
+    @SuppressFBWarnings("NP_STORE_INTO_NONNULL_FIELD")
+    YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
+            final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr) {
+        declaredType = requireNonNull(declared);
+        effectiveType = requireNonNull(effective);
         name = yinQName(nameStr);
         argument = null;
         yinElement = false;
     }
 
-    YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr) {
-        type = Preconditions.checkNotNull(clz);
-        //FIXME: fill up effective type correctly
-        effectiveType = null;
-        name = yinQName(nameStr);
-        argument = yinQName(argumentStr);
-        this.yinElement = false;
+    YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
+            final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr, final String argumentStr) {
+        this(declared, effective, nameStr, argumentStr, false);
     }
 
-    YangStmtMapping(final Class<? extends DeclaredStatement<?>> clz, final String nameStr, final String argumentStr,
+    YangStmtMapping(final Class<? extends DeclaredStatement<?>> declared,
+            final Class<? extends EffectiveStatement<?, ?>> effective, final String nameStr, final String argumentStr,
             final boolean yinElement) {
-        type = Preconditions.checkNotNull(clz);
-        //FIXME: fill up effective type correctly
-        effectiveType = null;
+        declaredType = requireNonNull(declared);
+        effectiveType = requireNonNull(effective);
         name = yinQName(nameStr);
         argument = yinQName(argumentStr);
         this.yinElement = yinElement;
     }
 
-    @Nonnull private static QName yinQName(final String nameStr) {
+    private static QName yinQName(final String nameStr) {
         return QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr).intern();
     }
 
-    @Nonnull
     @Override
     public QName getStatementName() {
         return name;
     }
 
     @Override
-    @Nullable public QName getArgumentName() {
+    public @Nullable QName getArgumentName() {
         return argument;
     }
 
     @Override
-    @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
-        return type;
+    public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
+        return declaredType;
     }
 
-    @Nonnull
     @Override
-    public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
+    public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
         return effectiveType;
     }
 
@@ -220,4 +292,3 @@ public enum YangStmtMapping implements StatementDefinition {
         return yinElement;
     }
 }
-