Refactor ContainerEffectiveStatementImpl
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / container / ContainerEffectiveStatementImpl.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.container;
9
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.collect.ImmutableList;
14 import java.util.Objects;
15 import java.util.Optional;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
23 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.compat.ActionNodeContainerCompat;
27 import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat;
28 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree;
29 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
30 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AugmentationTargetMixin;
31 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin;
32 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataSchemaNodeMixin;
33 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.MustConstraintMixin;
34 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.NotificationNodeContainerMixin;
35 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.PresenceMixin;
36 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
37 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
38
39 /**
40  * Internal implementation of ContainerEffectiveStatement.
41  *
42  * @deprecated This class is visible only for historical purposes and is going to be hidden.
43  */
44 // FIXME: 4.0.0: hide this class
45 @Deprecated
46 public final class ContainerEffectiveStatementImpl
47         extends DefaultWithDataTree<QName, ContainerStatement, ContainerEffectiveStatement>
48         implements ContainerEffectiveStatement, ContainerSchemaNode, DerivableSchemaNode,
49             DataSchemaNodeMixin<QName, ContainerStatement>, DataNodeContainerMixin<QName, ContainerStatement>,
50             ActionNodeContainerMixin<QName, ContainerStatement>,
51             ActionNodeContainerCompat<QName, ContainerStatement>,
52             NotificationNodeContainerMixin<QName, ContainerStatement>,
53             NotificationNodeContainerCompat<QName, ContainerStatement>,
54             MustConstraintMixin<QName, ContainerStatement>, PresenceMixin<QName, ContainerStatement>,
55             AugmentationTargetMixin<QName, ContainerStatement> {
56
57     private final int flags;
58     private final @NonNull Object substatements;
59     private final @NonNull SchemaPath path;
60     private final @Nullable ContainerSchemaNode original;
61
62     ContainerEffectiveStatementImpl(final ContainerStatement declared, final SchemaPath path, final int flags,
63                 final StmtContext<?, ?, ?> ctx, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
64                 final ContainerSchemaNode original) {
65         super(declared, ctx, substatements);
66
67         EffectiveStmtUtils.checkUniqueGroupings(ctx, substatements);
68         EffectiveStmtUtils.checkUniqueTypedefs(ctx, substatements);
69         EffectiveStmtUtils.checkUniqueUses(ctx, substatements);
70
71         this.substatements = substatements.size() == 1 ? substatements.get(0) : substatements;
72         this.path = requireNonNull(path);
73         this.original = original;
74         this.flags = flags;
75     }
76
77     @SuppressWarnings("unchecked")
78     @Override
79     public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
80         if (substatements instanceof ImmutableList) {
81             return (ImmutableList<? extends EffectiveStatement<?, ?>>) substatements;
82         }
83         verify(substatements instanceof EffectiveStatement, "Unexpected substatement %s", substatements);
84         return ImmutableList.of((EffectiveStatement<?, ?>) substatements);
85     }
86
87     @Override
88     public int flags() {
89         return flags;
90     }
91
92     @Override
93     public QName argument() {
94         return getQName();
95     }
96
97     @Override
98     public SchemaPath getPath() {
99         return path;
100     }
101
102     @Override
103     public Optional<ContainerSchemaNode> getOriginal() {
104         return Optional.ofNullable(original);
105     }
106
107     @Override
108     public boolean isPresenceContainer() {
109         return presence();
110     }
111
112     @Override
113     public Optional<DataSchemaNode> findDataChildByName(final QName name) {
114         return findDataSchemaNode(name);
115     }
116
117     @Override
118     public int hashCode() {
119         final int prime = 31;
120         int result = 1;
121         result = prime * result + Objects.hashCode(getQName());
122         result = prime * result + Objects.hashCode(getPath());
123         return result;
124     }
125
126     @Override
127     public boolean equals(final Object obj) {
128         if (this == obj) {
129             return true;
130         }
131         if (obj == null) {
132             return false;
133         }
134         if (getClass() != obj.getClass()) {
135             return false;
136         }
137         final ContainerEffectiveStatementImpl other = (ContainerEffectiveStatementImpl) obj;
138         return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
139     }
140
141     @Override
142     public String toString() {
143         return "container " + getQName().getLocalName();
144     }
145 }