/*
* Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.yang.model.api;
import com.google.common.annotations.Beta;
import com.google.common.base.Preconditions;
import javax.annotation.Nonnull;
import javax.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.ActionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.AnydataStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.CaseStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.IncludeStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
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.LengthStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
/**
* Mapping for both RFC6020 and RFC7950 statements.
*/
@Beta
public enum YangStmtMapping implements StatementDefinition {
ACTION(ActionStatement.class, "action", "name"),
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"),
MODIFIER(ModifierStatement.class, "modifier", "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");
private final Class<? extends DeclaredStatement<?>> type;
private final Class<? extends EffectiveStatement<?,?>> effectiveType;
private final QName name;
private final 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;
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<?>> clz, final String nameStr, final String argumentStr,
final boolean yinElement) {
type = Preconditions.checkNotNull(clz);
//FIXME: fill up effective type correctly
effectiveType = null;
name = yinQName(nameStr);
argument = yinQName(argumentStr);
this.yinElement = yinElement;
}
@Nonnull 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() {
return argument;
}
@Override
@Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
return type;
}
@Nonnull
@Override
public Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
return effectiveType;
}
@Override
public boolean isArgumentYinElement() {
return yinElement;
}
}