YANGTOOLS-706: reorganize statement definitions
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / AbstractEffectiveSimpleDataNodeContainer.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.stmt.rfc6020.effective;
9
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableSet;
12 import java.util.ArrayList;
13 import java.util.LinkedHashSet;
14 import java.util.List;
15 import java.util.Set;
16 import javax.annotation.Nonnull;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
20 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
21 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
22 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
24 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
26 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
27 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedDataNodeContainer;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
31
32 abstract class AbstractEffectiveSimpleDataNodeContainer<D extends DeclaredStatement<QName>> extends
33         AbstractEffectiveDocumentedDataNodeContainer<QName, D> implements DataNodeContainer, AugmentationTarget,
34         DataSchemaNode {
35
36     private final SchemaPath path;
37
38     // :FIXME should be private and final
39     boolean augmenting;
40     private final boolean addedByUses;
41     private final boolean configuration;
42     private final ConstraintDefinition constraints;
43
44     private final Set<AugmentationSchemaNode> augmentations;
45     private final List<UnknownSchemaNode> unknownNodes;
46
47     AbstractEffectiveSimpleDataNodeContainer(final StmtContext<QName, D, ?> ctx) {
48         super(ctx);
49
50         this.path = ctx.getSchemaPath().get();
51         this.constraints = EffectiveConstraintDefinitionImpl.forParent(this);
52         this.configuration = ctx.isConfiguration();
53
54         // initSubstatementCollectionsAndFields
55
56         List<UnknownSchemaNode> unknownNodesInit = new ArrayList<>();
57         Set<AugmentationSchemaNode> augmentationsInit = new LinkedHashSet<>();
58         for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
59             if (effectiveStatement instanceof UnknownSchemaNode) {
60                 unknownNodesInit.add((UnknownSchemaNode) effectiveStatement);
61             }
62             if (effectiveStatement instanceof AugmentationSchemaNode) {
63                 augmentationsInit.add((AugmentationSchemaNode) effectiveStatement);
64             }
65         }
66         this.unknownNodes = ImmutableList.copyOf(unknownNodesInit);
67         this.augmentations = ImmutableSet.copyOf(augmentationsInit);
68
69         // initCopyType
70         final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
71         if (copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES_AUGMENTATION)) {
72             this.addedByUses = this.augmenting = true;
73         } else {
74             this.augmenting = copyTypesFromOriginal.contains(CopyType.ADDED_BY_AUGMENTATION);
75             this.addedByUses = copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES);
76         }
77     }
78
79     @Nonnull
80     @Override
81     public QName getQName() {
82         return path.getLastComponent();
83     }
84
85     @Nonnull
86     @Override
87     public SchemaPath getPath() {
88         return path;
89     }
90
91     @Override
92     public boolean isAugmenting() {
93         return augmenting;
94     }
95
96     @Override
97     public boolean isAddedByUses() {
98         return addedByUses;
99     }
100
101     @Override
102     public boolean isConfiguration() {
103         return configuration;
104     }
105
106     @Override
107     public ConstraintDefinition getConstraints() {
108         return constraints;
109     }
110
111     @Override
112     public Set<AugmentationSchemaNode> getAvailableAugmentations() {
113         return augmentations;
114     }
115
116     @Nonnull
117     @Override
118     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
119         return unknownNodes;
120     }
121 }