Refactor ContainerEffectiveStatementImpl
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / container / ContainerEffectiveStatementImpl.java
index a64b32333d84cd4a73d9bf8c0753c04e8150431a..87f8e3c9bdfb94274ef8c1c0e7006a800409f4c5 100644 (file)
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.container;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSet.Builder;
+import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
 import java.util.Objects;
 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;
+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 DefaultWithDataTree<QName, ContainerStatement, ContainerEffectiveStatement>
+        implements ContainerEffectiveStatement, ContainerSchemaNode, DerivableSchemaNode,
+            DataSchemaNodeMixin<QName, ContainerStatement>, DataNodeContainerMixin<QName, ContainerStatement>,
+            ActionNodeContainerMixin<QName, ContainerStatement>,
+            ActionNodeContainerCompat<QName, ContainerStatement>,
+            NotificationNodeContainerMixin<QName, ContainerStatement>,
+            NotificationNodeContainerCompat<QName, ContainerStatement>,
+            MustConstraintMixin<QName, ContainerStatement>, PresenceMixin<QName, ContainerStatement>,
+            AugmentationTargetMixin<QName, ContainerStatement> {
+
+    private final int flags;
+    private final @NonNull Object substatements;
+    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);
-            }
-
-            if (effectiveStatement instanceof NotificationDefinition) {
-                notificationsBuilder.add((NotificationDefinition) 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);
+
+        EffectiveStmtUtils.checkUniqueGroupings(ctx, substatements);
+        EffectiveStmtUtils.checkUniqueTypedefs(ctx, substatements);
+        EffectiveStmtUtils.checkUniqueUses(ctx, substatements);
+
+        this.substatements = substatements.size() == 1 ? substatements.get(0) : substatements;
+        this.path = requireNonNull(path);
+        this.original = original;
+        this.flags = flags;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+        if (substatements instanceof ImmutableList) {
+            return (ImmutableList<? extends EffectiveStatement<?, ?>>) substatements;
         }
+        verify(substatements instanceof EffectiveStatement, "Unexpected substatement %s", substatements);
+        return ImmutableList.of((EffectiveStatement<?, ?>) substatements);
+    }
 
-        this.actions = actionsBuilder.build();
-        this.notifications = notificationsBuilder.build();
-        presence = findFirstEffectiveSubstatement(PresenceEffectiveStatement.class).isPresent();
+    @Override
+    public int flags() {
+        return flags;
     }
 
     @Override
-    public Optional<ContainerSchemaNode> getOriginal() {
-        return Optional.ofNullable(original);
+    public QName argument() {
+        return getQName();
     }
 
     @Override
-    public Set<ActionDefinition> getActions() {
-        return actions;
+    public SchemaPath getPath() {
+        return path;
     }
 
     @Override
-    public Set<NotificationDefinition> getNotifications() {
-        return notifications;
+    public Optional<ContainerSchemaNode> getOriginal() {
+        return Optional.ofNullable(original);
     }
 
     @Override
     public boolean isPresenceContainer() {
-        return presence;
+        return presence();
+    }
+
+    @Override
+    public Optional<DataSchemaNode> findDataChildByName(final QName name) {
+        return findDataSchemaNode(name);
     }
 
     @Override