Adopt odlparent-10.0.0/yangtools-8.0.0-SNAPSHOT
[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.collect.Collections2;
14 import com.google.common.collect.ImmutableList;
15 import java.util.Collection;
16 import java.util.List;
17 import java.util.Map;
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.IdentifierNamespace;
31 import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
32 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
33 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
34 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
35 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
36 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
37 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
38
39 final class TargetAugmentEffectiveStatement implements AugmentEffectiveStatement, AugmentationSchemaNode {
40     private final @NonNull List<EffectiveStatement<?, ?>> substatements;
41     private final @NonNull AugmentEffectiveStatement delegate;
42     private final @NonNull AugmentationSchemaNode schemaDelegate;
43
44     TargetAugmentEffectiveStatement(final AugmentEffectiveStatement augment,
45             final SchemaTreeAwareEffectiveStatement<?, ?> target) {
46         delegate = requireNonNull(augment);
47         verify(augment instanceof AugmentationSchemaNode, "Unsupported augment implementation %s", augment);
48         schemaDelegate = (AugmentationSchemaNode) augment;
49
50         final var stmts = augment.effectiveSubstatements();
51         final var builder = ImmutableList.<EffectiveStatement<?, ?>>builderWithExpectedSize(stmts.size());
52         for (var stmt : stmts) {
53             if (stmt instanceof SchemaTreeEffectiveStatement) {
54                 final var qname = ((SchemaTreeEffectiveStatement<?>) stmt).getIdentifier();
55                 target.get(SchemaTreeNamespace.class, qname).ifPresent(builder::add);
56             } else {
57                 builder.add(stmt);
58             }
59         }
60
61         substatements = builder.build();
62     }
63
64     @NonNull AugmentEffectiveStatement delegate() {
65         return delegate;
66     }
67
68     @Override
69     public AugmentStatement getDeclared() {
70         return delegate.getDeclared();
71     }
72
73     @Override
74     public SchemaNodeIdentifier argument() {
75         return delegate.argument();
76     }
77
78     @Override
79     public StatementOrigin statementOrigin() {
80         return delegate.statementOrigin();
81     }
82
83     @Override
84     public <K, V, N extends IdentifierNamespace<K, V>> Optional<V> get(final Class<N> namespace, final K identifier) {
85         return Optional.empty();
86     }
87
88     @Override
89     public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(final Class<N> namespace) {
90         return Map.of();
91     }
92
93     @Override
94     public List<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
95         return substatements;
96     }
97
98     @Override
99     public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
100         return schemaDelegate.getTypeDefinitions();
101     }
102
103     @Override
104     @SuppressWarnings("unchecked")
105     public Collection<? extends DataSchemaNode> getChildNodes() {
106         return (Collection) Collections2.filter(substatements, DataSchemaNode.class::isInstance);
107     }
108
109     @Override
110     public Collection<? extends GroupingDefinition> getGroupings() {
111         return schemaDelegate.getGroupings();
112     }
113
114     @Override
115     public DataSchemaNode dataChildByName(final QName name) {
116         return getChildNodes().stream().filter(child -> name.equals(child.getQName())).findFirst().orElse(null);
117     }
118
119     @Override
120     public Collection<? extends UsesNode> getUses() {
121         return schemaDelegate.getUses();
122     }
123
124     @Override
125     @SuppressWarnings("unchecked")
126     public Collection<? extends NotificationDefinition> getNotifications() {
127         return (Collection) Collections2.filter(substatements, NotificationDefinition.class::isInstance);
128     }
129
130     @Override
131     @SuppressWarnings("unchecked")
132     public Collection<? extends ActionDefinition> getActions() {
133         return (Collection) Collections2.filter(substatements, ActionDefinition.class::isInstance);
134     }
135
136     @Override
137     public Optional<? extends QualifiedBound> getWhenCondition() {
138         return schemaDelegate.getWhenCondition();
139     }
140
141     @Override
142     public @NonNull Status getStatus() {
143         return schemaDelegate.getStatus();
144     }
145
146     @Override
147     public Optional<String> getDescription() {
148         return schemaDelegate.getDescription();
149     }
150
151     @Override
152     public Optional<String> getReference() {
153         return schemaDelegate.getReference();
154     }
155
156     @Override
157     public AugmentEffectiveStatement asEffectiveStatement() {
158         return this;
159     }
160 }