*/
package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment;
-import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
-import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import java.net.URI;
-import java.util.Collection;
-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.QNameModule;
-import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.NamespaceRevisionAware;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.QNameModuleAware;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
-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.AbstractEffectiveDocumentedDataNodeContainer;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
-import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
-
-final class AugmentEffectiveStatementImpl
- extends AbstractEffectiveDocumentedDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
- implements AugmentEffectiveStatement, AugmentationSchemaNode, NamespaceRevisionAware,
- ActionNodeContainerCompat<SchemaNodeIdentifier, AugmentStatement>,
- NotificationNodeContainerCompat<SchemaNodeIdentifier, AugmentStatement> {
- private final SchemaPath targetPath;
- private final URI namespace;
- private final Revision revision;
- private final @NonNull ImmutableSet<ActionDefinition> actions;
- private final @NonNull ImmutableSet<NotificationDefinition> notifications;
- private final RevisionAwareXPath whenCondition;
- private final AugmentationSchemaNode copyOf;
-
- AugmentEffectiveStatementImpl(final StmtContext<SchemaNodeIdentifier, AugmentStatement,
- EffectiveStatement<SchemaNodeIdentifier, AugmentStatement>> ctx) {
- super(ctx);
-
- this.targetPath = ctx.coerceStatementArgument().asSchemaPath();
-
- final QNameModule rootModuleQName = StmtContextUtils.getRootModuleQName(ctx);
- this.namespace = rootModuleQName.getNamespace();
- this.revision = rootModuleQName.getRevision().orElse(null);
-
- this.copyOf = (AugmentationSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
- whenCondition = findFirstEffectiveSubstatementArgument(WhenEffectiveStatement.class).orElse(null);
-
- // initSubstatementCollections
- final ImmutableSet.Builder<ActionDefinition> actionsBuilder = ImmutableSet.builder();
- final ImmutableSet.Builder<NotificationDefinition> notificationsBuilder = ImmutableSet.builder();
- final ImmutableList.Builder<UnknownSchemaNode> listBuilder = new ImmutableList.Builder<>();
- for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
- if (effectiveStatement instanceof ActionDefinition) {
- actionsBuilder.add((ActionDefinition) effectiveStatement);
- } else if (effectiveStatement instanceof NotificationDefinition) {
- notificationsBuilder.add((NotificationDefinition) effectiveStatement);
- }
- }
-
- this.actions = actionsBuilder.build();
- this.notifications = notificationsBuilder.build();
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultDataNodeContainer;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.NotificationNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.WhenConditionMixin;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
+
+final class AugmentEffectiveStatementImpl extends DefaultDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
+ implements AugmentEffectiveStatement, AugmentationSchemaNode, QNameModuleAware,
+ DocumentedNodeMixin.WithStatus<SchemaNodeIdentifier, AugmentStatement>,
+ ActionNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
+ NotificationNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
+ WhenConditionMixin<SchemaNodeIdentifier, AugmentStatement> {
+ private final @Nullable AugmentationSchemaNode original;
+ private final @NonNull SchemaNodeIdentifier argument;
+ private final @NonNull QNameModule rootModuleQName;
+ private final int flags;
+
+ AugmentEffectiveStatementImpl(final AugmentStatement declared, final SchemaNodeIdentifier argument, final int flags,
+ final QNameModule rootModuleQName, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
+ final StatementSourceReference ref, final @Nullable AugmentationSchemaNode original) {
+ super(declared, ref, substatements);
+ this.argument = requireNonNull(argument);
+ this.rootModuleQName = requireNonNull(rootModuleQName);
+ this.flags = flags;
+ this.original = original;
}
@Override
- protected Collection<? extends EffectiveStatement<?, ?>> initSubstatements(
- final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> ctx,
- final Collection<? extends StmtContext<?, ?, ?>> substatementsInit) {
- final StatementContextBase<?, ?, ?> implicitDef = ctx.getFromNamespace(AugmentImplicitHandlingNamespace.class,
- ctx);
- return implicitDef == null ? super.initSubstatements(ctx, substatementsInit)
- : Collections2.transform(Collections2.filter(substatementsInit,
- StmtContext::isSupportedToBuildEffective),
- subCtx -> {
- verify(subCtx instanceof StatementContextBase);
- return implicitDef.wrapWithImplicit((StatementContextBase<?, ?, ?>) subCtx).buildEffective();
- });
+ public @NonNull SchemaNodeIdentifier argument() {
+ return argument;
}
@Override
public Optional<AugmentationSchemaNode> getOriginalDefinition() {
- return Optional.ofNullable(this.copyOf);
- }
-
- @Override
- public SchemaPath getTargetPath() {
- return targetPath;
- }
-
- @Override
- public Optional<RevisionAwareXPath> getWhenCondition() {
- return Optional.ofNullable(whenCondition);
- }
-
- @Override
- public URI getNamespace() {
- return namespace;
- }
-
- @Override
- public Set<ActionDefinition> getActions() {
- return actions;
- }
-
- @Override
- public Set<NotificationDefinition> getNotifications() {
- return notifications;
+ return Optional.ofNullable(this.original);
}
@Override
- public Optional<Revision> getRevision() {
- return Optional.ofNullable(revision);
+ public int flags() {
+ return flags;
}
@Override
- public int hashCode() {
- final int prime = 17;
- int result = 1;
- result = prime * result + Objects.hashCode(targetPath);
- result = prime * result + Objects.hashCode(whenCondition);
- result = prime * result + getChildNodes().hashCode();
- return result;
+ public QNameModule getQNameModule() {
+ return rootModuleQName;
}
@Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof AugmentEffectiveStatementImpl)) {
- return false;
- }
- final AugmentEffectiveStatementImpl other = (AugmentEffectiveStatementImpl) obj;
- return Objects.equals(targetPath, other.targetPath) && Objects.equals(whenCondition, other.whenCondition)
- && getChildNodes().equals(other.getChildNodes());
+ public AugmentEffectiveStatement asEffectiveStatement() {
+ return this;
}
@Override
public String toString() {
- return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + targetPath + ", when="
- + whenCondition + "]";
+ return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + getTargetPath() + ", when="
+ + getWhenCondition() + "]";
}
}