Fix DerivableSchemaNode.getOriginal()
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / impl / eff / AbstractLeafListEffectiveStatement.java
1 /*
2  * Copyright (c) 2020 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.impl.eff;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.collect.ImmutableList;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
16 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListEffectiveStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.ri.type.ConcreteTypeBuilder;
26 import org.opendaylight.yangtools.yang.model.ri.type.ConcreteTypes;
27 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataSchemaNodeMixin;
29 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.MustConstraintMixin;
30 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedMixin;
31
32 abstract class AbstractLeafListEffectiveStatement
33         extends AbstractDeclaredEffectiveStatement.Default<QName, LeafListStatement>
34         implements LeafListEffectiveStatement, LeafListSchemaNode, UserOrderedMixin<QName, LeafListStatement>,
35             DataSchemaNodeMixin<LeafListStatement>, MustConstraintMixin<QName, LeafListStatement> {
36     private final @NonNull Object substatements;
37     private final @NonNull QName argument;
38     private final @NonNull TypeDefinition<?> type;
39     private final int flags;
40
41     AbstractLeafListEffectiveStatement(final LeafListStatement declared, final QName argument, final int flags,
42             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
43         super(declared);
44         this.argument = requireNonNull(argument);
45         this.substatements = maskList(substatements);
46         this.flags = flags;
47         // TODO: lazy instantiation?
48         this.type = buildType();
49     }
50
51     AbstractLeafListEffectiveStatement(final AbstractLeafListEffectiveStatement original, final QName argument,
52             final int flags) {
53         super(original);
54         this.argument = requireNonNull(argument);
55         this.substatements = original.substatements;
56         this.flags = flags;
57         // TODO: lazy instantiation?
58         this.type = buildType();
59     }
60
61     @Override
62     public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
63         return unmaskList(substatements);
64     }
65
66     @Override
67     public final int flags() {
68         return flags;
69     }
70
71     @Override
72     public final QName argument() {
73         return argument;
74     }
75
76     @Override
77     public final TypeDefinition<?> getType() {
78         return type;
79     }
80
81     @Override
82     public final boolean isUserOrdered() {
83         return userOrdered();
84     }
85
86     @Override
87     public final LeafListEffectiveStatement asEffectiveStatement() {
88         return this;
89     }
90
91     @Override
92     public final String toString() {
93         return getClass().getSimpleName() + "[" + argument + "]";
94     }
95
96     private TypeDefinition<?> buildType() {
97         final TypeEffectiveStatement<?> typeStmt = findFirstEffectiveSubstatement(TypeEffectiveStatement.class).get();
98         final ConcreteTypeBuilder<?> builder = ConcreteTypes.concreteTypeBuilder(typeStmt.getTypeDefinition(),
99             getQName());
100         for (final EffectiveStatement<?, ?> stmt : effectiveSubstatements()) {
101             // NOTE: 'default' is omitted here on purpose
102             if (stmt instanceof DescriptionEffectiveStatement) {
103                 builder.setDescription(((DescriptionEffectiveStatement)stmt).argument());
104             } else if (stmt instanceof ReferenceEffectiveStatement) {
105                 builder.setReference(((ReferenceEffectiveStatement)stmt).argument());
106             } else if (stmt instanceof StatusEffectiveStatement) {
107                 builder.setStatus(((StatusEffectiveStatement)stmt).argument());
108             } else if (stmt instanceof UnitsEffectiveStatement) {
109                 builder.setUnits(((UnitsEffectiveStatement)stmt).argument());
110             }
111         }
112         return builder.build();
113     }
114 }