*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.container;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSet.Builder;
-import java.util.Objects;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
import java.util.Optional;
-import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ContainerStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.PresenceEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.compat.ActionNodeContainerCompat;
+import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AugmentationTargetMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataSchemaNodeMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.MustConstraintMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.NotificationNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.PresenceMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-final class ContainerEffectiveStatementImpl extends AbstractEffectiveContainerSchemaNode<ContainerStatement>
- implements ContainerEffectiveStatement, DerivableSchemaNode {
- private final @NonNull ImmutableSet<ActionDefinition> actions;
- private final @NonNull ImmutableSet<NotificationDefinition> notifications;
+final class ContainerEffectiveStatementImpl
+ extends WithSubstatements<QName, ContainerStatement, ContainerEffectiveStatement>
+ implements ContainerEffectiveStatement, ContainerSchemaNode, DerivableSchemaNode,
+ DataSchemaNodeMixin<QName, ContainerStatement>, DataNodeContainerMixin<QName, ContainerStatement>,
+ ActionNodeContainerMixin<QName, ContainerStatement>,
+ ActionNodeContainerCompat<QName, ContainerStatement, ContainerEffectiveStatement>,
+ NotificationNodeContainerMixin<QName, ContainerStatement>,
+ NotificationNodeContainerCompat<QName, ContainerStatement, ContainerEffectiveStatement>,
+ MustConstraintMixin<QName, ContainerStatement>, PresenceMixin<QName, ContainerStatement>,
+ AugmentationTargetMixin<QName, ContainerStatement> {
+
+ private final int flags;
+ private final @NonNull SchemaPath path;
private final @Nullable ContainerSchemaNode original;
- private final boolean presence;
- ContainerEffectiveStatementImpl(
- final StmtContext<QName, ContainerStatement, EffectiveStatement<QName, ContainerStatement>> ctx) {
- super(ctx);
- this.original = (ContainerSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
- final ImmutableSet.Builder<ActionDefinition> actionsBuilder = ImmutableSet.builder();
- final Builder<NotificationDefinition> notificationsBuilder = ImmutableSet.builder();
- for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
- if (effectiveStatement instanceof ActionDefinition) {
- actionsBuilder.add((ActionDefinition) effectiveStatement);
- }
+ ContainerEffectiveStatementImpl(final ContainerStatement declared, final SchemaPath path, final int flags,
+ final StmtContext<?, ?, ?> ctx, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
+ final ContainerSchemaNode original) {
+ super(declared, ctx, substatements);
- if (effectiveStatement instanceof NotificationDefinition) {
- notificationsBuilder.add((NotificationDefinition) effectiveStatement);
- }
- }
+ EffectiveStmtUtils.checkUniqueGroupings(ctx, substatements);
+ EffectiveStmtUtils.checkUniqueTypedefs(ctx, substatements);
+ EffectiveStmtUtils.checkUniqueUses(ctx, substatements);
- this.actions = actionsBuilder.build();
- this.notifications = notificationsBuilder.build();
- presence = findFirstEffectiveSubstatement(PresenceEffectiveStatement.class).isPresent();
+ this.path = requireNonNull(path);
+ this.original = original;
+ this.flags = flags;
}
@Override
- public Optional<ContainerSchemaNode> getOriginal() {
- return Optional.ofNullable(original);
+ public int flags() {
+ return flags;
}
@Override
- public Set<ActionDefinition> getActions() {
- return actions;
+ public QName argument() {
+ return getQName();
}
@Override
- public Set<NotificationDefinition> getNotifications() {
- return notifications;
+ @Deprecated
+ public SchemaPath getPath() {
+ return path;
}
@Override
- public boolean isPresenceContainer() {
- return presence;
+ public Optional<ContainerSchemaNode> getOriginal() {
+ return Optional.ofNullable(original);
}
@Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + Objects.hashCode(getQName());
- result = prime * result + Objects.hashCode(getPath());
- return result;
+ public boolean isPresenceContainer() {
+ return presence();
}
@Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final ContainerEffectiveStatementImpl other = (ContainerEffectiveStatementImpl) obj;
- return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+ public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+ return findDataSchemaNode(name);
}
@Override