YANGTOOLS-706: Split up base utility classes into rfc6020.util
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / AugmentEffectiveStatementImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
9
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableSet;
12 import java.net.URI;
13 import java.util.List;
14 import java.util.Objects;
15 import java.util.Optional;
16 import java.util.Set;
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.AugmentEffectiveStatement;
29 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
30 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
31 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
32 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
33 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
34
35 public final class AugmentEffectiveStatementImpl
36         extends AbstractEffectiveDocumentedDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
37         implements AugmentEffectiveStatement, AugmentationSchemaNode, NamespaceRevisionAware {
38     private final SchemaPath targetPath;
39     private final URI namespace;
40     private final Revision revision;
41     private final Set<ActionDefinition> actions;
42     private final Set<NotificationDefinition> notifications;
43     private final List<UnknownSchemaNode> unknownNodes;
44     private final RevisionAwareXPath whenCondition;
45     private final AugmentationSchemaNode copyOf;
46
47     public AugmentEffectiveStatementImpl(final StmtContext<SchemaNodeIdentifier, AugmentStatement,
48             EffectiveStatement<SchemaNodeIdentifier, AugmentStatement>> ctx) {
49         super(ctx);
50
51         this.targetPath = ctx.getStatementArgument().asSchemaPath();
52
53         final QNameModule rootModuleQName = StmtContextUtils.getRootModuleQName(ctx);
54         this.namespace = rootModuleQName.getNamespace();
55         this.revision = rootModuleQName.getRevision().orElse(null);
56
57         this.copyOf = (AugmentationSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
58
59         final WhenEffectiveStatement whenStmt = firstEffective(WhenEffectiveStatement.class);
60         this.whenCondition = whenStmt == null ? null : whenStmt.argument();
61
62         // initSubstatementCollections
63         final ImmutableSet.Builder<ActionDefinition> actionsBuilder = ImmutableSet.builder();
64         final ImmutableSet.Builder<NotificationDefinition> notificationsBuilder = ImmutableSet.builder();
65         final ImmutableList.Builder<UnknownSchemaNode> listBuilder = new ImmutableList.Builder<>();
66         for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
67             if (effectiveStatement instanceof ActionDefinition) {
68                 actionsBuilder.add((ActionDefinition) effectiveStatement);
69             } else if (effectiveStatement instanceof NotificationDefinition) {
70                 notificationsBuilder.add((NotificationDefinition) effectiveStatement);
71             } else if (effectiveStatement instanceof UnknownSchemaNode) {
72                 listBuilder.add((UnknownSchemaNode) effectiveStatement);
73             }
74         }
75
76         this.actions = actionsBuilder.build();
77         this.notifications = notificationsBuilder.build();
78         this.unknownNodes = listBuilder.build();
79     }
80
81     @Override
82     public Optional<AugmentationSchemaNode> getOriginalDefinition() {
83         return Optional.ofNullable(this.copyOf);
84     }
85
86     @Override
87     public SchemaPath getTargetPath() {
88         return targetPath;
89     }
90
91     @Override
92     public Optional<RevisionAwareXPath> getWhenCondition() {
93         return Optional.ofNullable(whenCondition);
94     }
95
96     @Nonnull
97     @Override
98     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
99         return unknownNodes;
100     }
101
102     @Override
103     public URI getNamespace() {
104         return namespace;
105     }
106
107     @Override
108     public Set<ActionDefinition> getActions() {
109         return actions;
110     }
111
112     @Override
113     public Set<NotificationDefinition> getNotifications() {
114         return notifications;
115     }
116
117     @Override
118     public Optional<Revision> getRevision() {
119         return Optional.ofNullable(revision);
120     }
121
122     @Override
123     public int hashCode() {
124         final int prime = 17;
125         int result = 1;
126         result = prime * result + Objects.hashCode(targetPath);
127         result = prime * result + Objects.hashCode(whenCondition);
128         result = prime * result + getChildNodes().hashCode();
129         return result;
130     }
131
132     @Override
133     public boolean equals(final Object obj) {
134         if (this == obj) {
135             return true;
136         }
137         if (obj == null) {
138             return false;
139         }
140         if (getClass() != obj.getClass()) {
141             return false;
142         }
143         final AugmentEffectiveStatementImpl other = (AugmentEffectiveStatementImpl) obj;
144         if (!Objects.equals(targetPath, other.targetPath)) {
145             return false;
146         }
147         if (!Objects.equals(whenCondition, other.whenCondition)) {
148             return false;
149         }
150         if (!getChildNodes().equals(other.getChildNodes())) {
151             return false;
152         }
153         return true;
154     }
155
156     @Override
157     public String toString() {
158         return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + targetPath + ", when="
159                 + whenCondition + "]";
160     }
161 }