2 * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
10 import static com.google.common.base.Verify.verifyNotNull;
12 import com.google.common.collect.ImmutableList;
13 import com.google.common.collect.ImmutableMap;
14 import com.google.common.collect.ImmutableMap.Builder;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
17 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
18 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
21 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
25 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
27 public final class FractionDigitsStatementSupport
28 extends BaseStatementSupport<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> {
29 private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
30 SubstatementValidator.builder(YangStmtMapping.FRACTION_DIGITS).build();
31 private static final FractionDigitsStatementSupport INSTANCE = new FractionDigitsStatementSupport();
33 private static final ImmutableMap<Integer, EmptyFractionDigitsStatement> EMPTY_DECLS;
34 private static final ImmutableMap<EmptyFractionDigitsStatement, EmptyFractionDigitsEffectiveStatement> EMPTY_EFF;
37 final Builder<Integer, EmptyFractionDigitsStatement> declBuilder = ImmutableMap.builder();
38 final Builder<EmptyFractionDigitsStatement, EmptyFractionDigitsEffectiveStatement> effBuilder =
39 ImmutableMap.builder();
41 for (int i = 1; i <= 18; ++i) {
42 final Integer argument = i;
43 final EmptyFractionDigitsStatement decl = new EmptyFractionDigitsStatement(argument);
44 declBuilder.put(argument, decl);
45 effBuilder.put(decl, new EmptyFractionDigitsEffectiveStatement(decl));
48 EMPTY_DECLS = declBuilder.build();
49 EMPTY_EFF = effBuilder.build();
52 private FractionDigitsStatementSupport() {
53 super(YangStmtMapping.FRACTION_DIGITS, CopyPolicy.CONTEXT_INDEPENDENT);
56 public static FractionDigitsStatementSupport getInstance() {
61 public Integer parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
62 final int fractionDigits;
64 fractionDigits = Integer.parseInt(value);
65 } catch (NumberFormatException e) {
66 throw new SourceException(ctx.getStatementSourceReference(), e,
67 "%s is not valid fraction-digits integer argument", value);
69 if (fractionDigits < 1 || fractionDigits > 18) {
70 throw new SourceException("fraction-digits argument should be integer within [1..18]",
71 ctx.getStatementSourceReference());
73 return fractionDigits;
77 protected SubstatementValidator getSubstatementValidator() {
78 return SUBSTATEMENT_VALIDATOR;
82 protected FractionDigitsStatement createDeclared(final StmtContext<Integer, FractionDigitsStatement, ?> ctx,
83 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
84 return new RegularFractionDigitsStatement(ctx.coerceStatementArgument(), substatements);
88 protected FractionDigitsStatement createEmptyDeclared(final StmtContext<Integer, FractionDigitsStatement, ?> ctx) {
89 final Integer argument = ctx.coerceStatementArgument();
90 return verifyNotNull(EMPTY_DECLS.get(argument), "No declared instance for %s", argument);
94 protected FractionDigitsEffectiveStatement createEffective(final Current<Integer, FractionDigitsStatement> stmt,
95 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
96 return substatements.isEmpty() ? createEmptyEffective(stmt.declared())
97 : new RegularFractionDigitsEffectiveStatement(stmt.declared(), substatements);
100 private static @NonNull FractionDigitsEffectiveStatement createEmptyEffective(
101 final FractionDigitsStatement declared) {
102 final EmptyFractionDigitsEffectiveStatement shared = EMPTY_EFF.get(declared);
103 return shared != null ? shared : new EmptyFractionDigitsEffectiveStatement(declared);