Improve {Action,Notification}NodeContainerCompat safety
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / container / ContainerEffectiveStatementImpl.java
index a64b32333d84cd4a73d9bf8c0753c04e8150431a..c8c8e240b86b49356cc5498d210d91536721393c 100644 (file)
@@ -7,95 +7,90 @@
  */
 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;
+    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