Eliminate DeviateEffectiveStatementImpl.deviateType
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / deviate / DeviateEffectiveStatementImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.parser.rfc7950.stmt.deviate;
9
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableSet;
12 import java.util.Collection;
13 import java.util.Set;
14 import org.opendaylight.yangtools.util.OptionalBoolean;
15 import org.opendaylight.yangtools.yang.model.api.DeviateDefinition;
16 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
17 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
18 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
19 import org.opendaylight.yangtools.yang.model.api.UniqueConstraint;
20 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
29 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
31
32 final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase<DeviateKind, DeviateStatement>
33         implements DeviateDefinition, DeviateEffectiveStatement {
34
35     private final String deviatedDefault;
36     private final Integer deviatedMaxElements;
37     private final Integer deviatedMinElements;
38     private final ImmutableSet<MustDefinition> deviatedMustDefinitions;
39     private final TypeDefinition<?> deviatedType;
40     private final ImmutableList<UniqueConstraint> deviatedUniqueConstraints;
41     private final String deviatedUnits;
42
43     private final byte deviatedConfig;
44     private final byte deviatedMandatory;
45
46     DeviateEffectiveStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
47         super(ctx);
48
49         deviatedConfig = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
50             ConfigEffectiveStatement.class).orElse(null));
51         deviatedMandatory = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
52             MandatoryEffectiveStatement.class).orElse(null));
53         deviatedDefault = findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
54         deviatedMaxElements = findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
55                 // FIXME: this does not handle 'unbounded'
56                 .map(Integer::valueOf).orElse(null);
57         deviatedMinElements = findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
58         deviatedType = findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
59                 .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
60         deviatedUnits = findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
61
62         deviatedMustDefinitions = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
63         deviatedUniqueConstraints = ImmutableList.copyOf(allSubstatementsOfType(UniqueConstraint.class));
64     }
65
66     @Override
67     public DeviateKind getDeviateType() {
68         return argument();
69     }
70
71     @Override
72     public Boolean getDeviatedConfig() {
73         return OptionalBoolean.toNullable(deviatedConfig);
74     }
75
76     @Override
77     public String getDeviatedDefault() {
78         return deviatedDefault;
79     }
80
81     @Override
82     public Boolean getDeviatedMandatory() {
83         return OptionalBoolean.toNullable(deviatedMandatory);
84     }
85
86     @Override
87     public Integer getDeviatedMaxElements() {
88         return deviatedMaxElements;
89     }
90
91     @Override
92     public Integer getDeviatedMinElements() {
93         return deviatedMinElements;
94     }
95
96     @Override
97     public Set<MustDefinition> getDeviatedMusts() {
98         return deviatedMustDefinitions;
99     }
100
101     @Override
102     public TypeDefinition<?> getDeviatedType() {
103         return deviatedType;
104     }
105
106     @Override
107     public Collection<UniqueConstraint> getDeviatedUniques() {
108         return deviatedUniqueConstraints;
109     }
110
111     @Override
112     public String getDeviatedUnits() {
113         return deviatedUnits;
114     }
115 }