*/
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;
}
}