3b33f694cfa40463b85266f63d4ae6b64f2c7199
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / impl / eff / AbstractListEffectiveStatement.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 com.google.common.collect.ImmutableList;
11 import java.util.Collection;
12 import java.util.List;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
16 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.compat.ActionNodeContainerCompat;
22 import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat;
23 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithTypedefNamespace;
24 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.ActionNodeContainerMixin;
25 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.AugmentationTargetMixin;
26 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataNodeContainerMixin;
27 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataSchemaNodeMixin;
28 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.MustConstraintMixin;
29 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.NotificationNodeContainerMixin;
30 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.UserOrderedAwareMixin;
31 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.WhenConditionMixin;
32
33 abstract class AbstractListEffectiveStatement
34         extends WithTypedefNamespace<QName, ListStatement, ListEffectiveStatement>
35         implements ListEffectiveStatement, ListSchemaNode,
36             ActionNodeContainerCompat<QName, ListStatement, ListEffectiveStatement>,
37             NotificationNodeContainerCompat<QName, ListStatement, ListEffectiveStatement>,
38             DataSchemaNodeMixin<ListStatement>, UserOrderedAwareMixin<QName, ListStatement, ListEffectiveStatement>,
39             DataNodeContainerMixin<QName, ListStatement>, WhenConditionMixin<QName, ListStatement>,
40             AugmentationTargetMixin<QName, ListStatement>, NotificationNodeContainerMixin<QName, ListStatement>,
41             ActionNodeContainerMixin<QName, ListStatement>, MustConstraintMixin<QName, ListStatement> {
42     private final int flags;
43     private final @NonNull Object keyDefinition;
44
45     AbstractListEffectiveStatement(final ListStatement declared, final int flags,
46             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
47             final ImmutableList<QName> keyDefinition) {
48         super(declared, substatements);
49         this.keyDefinition = maskList(keyDefinition);
50         this.flags = flags;
51     }
52
53     AbstractListEffectiveStatement(final AbstractListEffectiveStatement original, final int flags) {
54         super(original);
55         keyDefinition = original.keyDefinition;
56         this.flags = flags;
57     }
58
59     @Override
60     public final int flags() {
61         return flags;
62     }
63
64     @Override
65     public final List<QName> getKeyDefinition() {
66         return unmaskList(keyDefinition, QName.class);
67     }
68
69     @Override
70     public final DataSchemaNode dataChildByName(final QName name) {
71         return dataSchemaNode(name);
72     }
73
74     @Override
75     public final Collection<? extends UniqueEffectiveStatement> getUniqueConstraints() {
76         return effectiveSubstatements().stream()
77                 .filter(UniqueEffectiveStatement.class::isInstance)
78                 .map(UniqueEffectiveStatement.class::cast)
79                 .collect(ImmutableList.toImmutableList());
80     }
81
82     @Override
83     public final ListEffectiveStatement asEffectiveStatement() {
84         return this;
85     }
86 }