Bump upstreams
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / TargetAugmentEffectiveStatement.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.mdsal.binding.generator.impl.reactor;
9
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.base.MoreObjects;
14 import com.google.common.collect.Collections2;
15 import com.google.common.collect.ImmutableList;
16 import java.util.Collection;
17 import java.util.List;
18 import java.util.Optional;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
22 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
25 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
26 import org.opendaylight.yangtools.yang.model.api.Status;
27 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.UsesNode;
29 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
30 import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
31 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
32 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
34 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
35 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
36 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
37
38 final class TargetAugmentEffectiveStatement implements AugmentEffectiveStatement, AugmentationSchemaNode {
39     private final @NonNull List<EffectiveStatement<?, ?>> substatements;
40     private final @NonNull AugmentEffectiveStatement delegate;
41     private final @NonNull AugmentationSchemaNode schemaDelegate;
42
43     TargetAugmentEffectiveStatement(final AugmentEffectiveStatement augment,
44             final SchemaTreeAwareEffectiveStatement<?, ?> target,
45             final ImmutableList<EffectiveStatement<?, ?>> substatements) {
46         delegate = requireNonNull(augment);
47         verify(augment instanceof AugmentationSchemaNode, "Unsupported augment implementation %s", augment);
48         schemaDelegate = (AugmentationSchemaNode) augment;
49         this.substatements = requireNonNull(substatements);
50     }
51
52     @NonNull AugmentEffectiveStatement delegate() {
53         return delegate;
54     }
55
56     @Override
57     public AugmentStatement getDeclared() {
58         return delegate.getDeclared();
59     }
60
61     @Override
62     public SchemaNodeIdentifier argument() {
63         return delegate.argument();
64     }
65
66     @Override
67     public StatementOrigin statementOrigin() {
68         return delegate.statementOrigin();
69     }
70
71     @Override
72     public List<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
73         return substatements;
74     }
75
76     @Override
77     @SuppressWarnings({ "rawtypes", "unchecked" })
78     public Collection<SchemaTreeEffectiveStatement<?>> schemaTreeNodes() {
79         return (Collection) collectEffectiveSubstatements(SchemaTreeEffectiveStatement.class);
80     }
81
82     @Override
83     @SuppressWarnings({ "rawtypes", "unchecked" })
84     public Optional<SchemaTreeEffectiveStatement<?>> findSchemaTreeNode(final QName qname) {
85         return (Optional) streamEffectiveSubstatements(SchemaTreeEffectiveStatement.class)
86             .filter(stmt -> qname.equals(stmt.argument()))
87             .findAny();
88     }
89
90     @Override
91     public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
92         return schemaDelegate.getTypeDefinitions();
93     }
94
95     @Override
96     @SuppressWarnings("unchecked")
97     public Collection<? extends DataSchemaNode> getChildNodes() {
98         return (Collection) Collections2.filter(substatements, DataSchemaNode.class::isInstance);
99     }
100
101     @Override
102     public Collection<? extends GroupingDefinition> getGroupings() {
103         return schemaDelegate.getGroupings();
104     }
105
106     @Override
107     public DataSchemaNode dataChildByName(final QName name) {
108         return getChildNodes().stream().filter(child -> name.equals(child.getQName())).findFirst().orElse(null);
109     }
110
111     @Override
112     public Collection<? extends UsesNode> getUses() {
113         return schemaDelegate.getUses();
114     }
115
116     @Override
117     @SuppressWarnings("unchecked")
118     public Collection<? extends NotificationDefinition> getNotifications() {
119         return (Collection) Collections2.filter(substatements, NotificationDefinition.class::isInstance);
120     }
121
122     @Override
123     @SuppressWarnings("unchecked")
124     public Collection<? extends ActionDefinition> getActions() {
125         return (Collection) Collections2.filter(substatements, ActionDefinition.class::isInstance);
126     }
127
128     @Override
129     public Optional<? extends QualifiedBound> getWhenCondition() {
130         return schemaDelegate.getWhenCondition();
131     }
132
133     @Override
134     public @NonNull Status getStatus() {
135         return schemaDelegate.getStatus();
136     }
137
138     @Override
139     public Optional<String> getDescription() {
140         return schemaDelegate.getDescription();
141     }
142
143     @Override
144     public Optional<String> getReference() {
145         return schemaDelegate.getReference();
146     }
147
148     @Override
149     public AugmentEffectiveStatement asEffectiveStatement() {
150         return this;
151     }
152
153     @Override
154     public String toString() {
155         return MoreObjects.toStringHelper(this)
156             .add("delegate", delegate)
157             .add("substatements", substatements.size())
158             .toString();
159     }
160 }