Allow derived context to be reused
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / action / ActionEffectiveStatementImpl.java
index 401f5848a0eeca1c28f3cdc9efae7b5ad6f7aadf..ddc44ad380773f0b4cf3062c259ea267ae405e81 100644 (file)
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Verify;
-import com.google.common.collect.ImmutableSet;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Objects;
-import java.util.Set;
+import com.google.common.collect.ImmutableList;
+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.GroupingDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaNodeDefaults;
+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.ActionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveSchemaNode;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStmtUtils;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.CopyableMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OperationDefinitionMixin;
 
-final class ActionEffectiveStatementImpl extends AbstractEffectiveSchemaNode<ActionStatement>
-        implements ActionDefinition, ActionEffectiveStatement {
-    private final ContainerSchemaNode input;
-    private final ContainerSchemaNode output;
-    private final Set<TypeDefinition<?>> typeDefinitions;
-    private final Set<GroupingDefinition> groupings;
-    private final boolean augmenting;
-    private final boolean addedByUses;
+final class ActionEffectiveStatementImpl extends WithSubstatements<QName, ActionStatement, ActionEffectiveStatement>
+        implements ActionDefinition, ActionEffectiveStatement, OperationDefinitionMixin<ActionStatement>,
+                   CopyableMixin<QName, ActionStatement> {
+    private final @Nullable SchemaPath path;
+    private final int flags;
 
-    ActionEffectiveStatementImpl(
-            final StmtContext<QName, ActionStatement, EffectiveStatement<QName, ActionStatement>> ctx) {
-        super(ctx);
-
-        input = findAsContainer(this, InputEffectiveStatement.class);
-        output = findAsContainer(this, OutputEffectiveStatement.class);
-
-        // initSubstatements
-        final Set<GroupingDefinition> groupingsInit = new HashSet<>();
-        final Set<TypeDefinition<?>> mutableTypeDefinitions = new LinkedHashSet<>();
-        for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
-            if (effectiveStatement instanceof GroupingDefinition) {
-                final GroupingDefinition groupingDefinition = (GroupingDefinition) effectiveStatement;
-                groupingsInit.add(groupingDefinition);
-            }
-            if (effectiveStatement instanceof TypedefEffectiveStatement) {
-                final TypedefEffectiveStatement typeDef = (TypedefEffectiveStatement) effectiveStatement;
-                final TypeDefinition<?> type = typeDef.getTypeDefinition();
-                if (!mutableTypeDefinitions.contains(type)) {
-                    mutableTypeDefinitions.add(type);
-                } else {
-                    throw EffectiveStmtUtils.createNameCollisionSourceException(ctx, effectiveStatement);
-                }
-            }
-        }
-        this.groupings = ImmutableSet.copyOf(groupingsInit);
-        this.typeDefinitions = ImmutableSet.copyOf(mutableTypeDefinitions);
-
-        // initCopyType
-        final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
-        if (copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES_AUGMENTATION)) {
-            this.addedByUses = this.augmenting = true;
-        } else {
-            this.augmenting = copyTypesFromOriginal.contains(CopyType.ADDED_BY_AUGMENTATION);
-            this.addedByUses = copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES);
-        }
-    }
-
-    private static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> parent,
-            final Class<? extends EffectiveStatement<QName, ?>> statementType) {
-        final EffectiveStatement<?, ?> statement = parent.findFirstEffectiveSubstatement(statementType).get();
-        Verify.verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode");
-        return (ContainerSchemaNode) statement;
-    }
-
-    @Override
-    public ContainerSchemaNode getInput() {
-        return input;
-    }
-
-    @Override
-    public ContainerSchemaNode getOutput() {
-        return output;
-    }
-
-    @Override
-    public Set<TypeDefinition<?>> getTypeDefinitions() {
-        return typeDefinitions;
-    }
-
-    @Override
-    public Set<GroupingDefinition> getGroupings() {
-        return groupings;
-    }
-
-    @Override
-    public boolean isAugmenting() {
-        return augmenting;
+    ActionEffectiveStatementImpl(final ActionStatement declared, final SchemaPath path, final int flags,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, substatements);
+        this.path = path;
+        this.flags = flags;
     }
 
-    @Override
-    public boolean isAddedByUses() {
-        return addedByUses;
+    ActionEffectiveStatementImpl(final ActionEffectiveStatementImpl original, final SchemaPath path, final int flags) {
+        super(original);
+        this.path = path;
+        this.flags = flags;
     }
 
     @Override
-    public int hashCode() {
-        return Objects.hash(getQName(), getPath());
+    @Deprecated
+    public SchemaPath getPath() {
+        return SchemaNodeDefaults.throwUnsupportedIfNull(this, path);
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj == null) {
-            return false;
-        }
-
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-
-        final ActionEffectiveStatementImpl other = (ActionEffectiveStatementImpl) obj;
-        return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath());
+    public int flags() {
+        return flags;
     }
 
     @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).add("input", input)
-                .add("output", output).toString();
+    public ActionEffectiveStatement asEffectiveStatement() {
+        return this;
     }
 }