2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableSet;
13 import java.util.List;
14 import java.util.Objects;
15 import java.util.Optional;
17 import javax.annotation.Nonnull;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.common.Revision;
20 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
21 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.NamespaceRevisionAware;
23 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
24 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
25 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
26 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
33 public final class AugmentEffectiveStatementImpl
34 extends AbstractEffectiveDocumentedDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
35 implements AugmentationSchemaNode, NamespaceRevisionAware {
36 private final SchemaPath targetPath;
37 private final URI namespace;
38 private final Revision revision;
39 private final Set<ActionDefinition> actions;
40 private final Set<NotificationDefinition> notifications;
41 private final List<UnknownSchemaNode> unknownNodes;
42 private final RevisionAwareXPath whenCondition;
43 private final AugmentationSchemaNode copyOf;
45 public AugmentEffectiveStatementImpl(final StmtContext<SchemaNodeIdentifier, AugmentStatement,
46 EffectiveStatement<SchemaNodeIdentifier, AugmentStatement>> ctx) {
49 this.targetPath = ctx.getStatementArgument().asSchemaPath();
51 final QNameModule rootModuleQName = StmtContextUtils.getRootModuleQName(ctx);
52 this.namespace = rootModuleQName.getNamespace();
53 this.revision = rootModuleQName.getRevision().orElse(null);
55 this.copyOf = (AugmentationSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
57 final WhenEffectiveStatementImpl whenStmt = firstEffective(WhenEffectiveStatementImpl.class);
58 this.whenCondition = whenStmt == null ? null : whenStmt.argument();
60 // initSubstatementCollections
61 final ImmutableSet.Builder<ActionDefinition> actionsBuilder = ImmutableSet.builder();
62 final ImmutableSet.Builder<NotificationDefinition> notificationsBuilder = ImmutableSet.builder();
63 final ImmutableList.Builder<UnknownSchemaNode> listBuilder = new ImmutableList.Builder<>();
64 for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
65 if (effectiveStatement instanceof ActionDefinition) {
66 actionsBuilder.add((ActionDefinition) effectiveStatement);
67 } else if (effectiveStatement instanceof NotificationDefinition) {
68 notificationsBuilder.add((NotificationDefinition) effectiveStatement);
69 } else if (effectiveStatement instanceof UnknownSchemaNode) {
70 listBuilder.add((UnknownSchemaNode) effectiveStatement);
74 this.actions = actionsBuilder.build();
75 this.notifications = notificationsBuilder.build();
76 this.unknownNodes = listBuilder.build();
80 public Optional<AugmentationSchemaNode> getOriginalDefinition() {
81 return Optional.ofNullable(this.copyOf);
85 public SchemaPath getTargetPath() {
90 public RevisionAwareXPath getWhenCondition() {
96 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
101 public URI getNamespace() {
106 public Set<ActionDefinition> getActions() {
111 public Set<NotificationDefinition> getNotifications() {
112 return notifications;
116 public Optional<Revision> getRevision() {
117 return Optional.ofNullable(revision);
121 public int hashCode() {
122 final int prime = 17;
124 result = prime * result + Objects.hashCode(targetPath);
125 result = prime * result + Objects.hashCode(whenCondition);
126 result = prime * result + getChildNodes().hashCode();
131 public boolean equals(final Object obj) {
138 if (getClass() != obj.getClass()) {
141 final AugmentEffectiveStatementImpl other = (AugmentEffectiveStatementImpl) obj;
142 if (!Objects.equals(targetPath, other.targetPath)) {
145 if (!Objects.equals(whenCondition, other.whenCondition)) {
148 if (!getChildNodes().equals(other.getChildNodes())) {
155 public String toString() {
156 return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + targetPath + ", when="
157 + whenCondition + "]";