2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. 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.mdsal.binding.generator.impl.reactor;
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.collect.Collections2;
14 import com.google.common.collect.ImmutableList;
15 import java.util.Collection;
16 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.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;
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;
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;
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 final Optional<? extends SchemaTreeEffectiveStatement<?>> child =
56 target.get(SchemaTreeAwareEffectiveStatement.Namespace.class, qname);
57 child.ifPresent(builder::add);
63 substatements = builder.build();
66 @NonNull AugmentEffectiveStatement delegate() {
71 public AugmentStatement getDeclared() {
72 return delegate.getDeclared();
76 public SchemaNodeIdentifier argument() {
77 return delegate.argument();
81 public StatementOrigin statementOrigin() {
82 return delegate.statementOrigin();
86 public <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends V> get(final Class<N> namespace,
88 return Optional.empty();
92 public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(final Class<N> namespace) {
97 public Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
102 public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
103 return schemaDelegate.getTypeDefinitions();
107 @SuppressWarnings("unchecked")
108 public Collection<? extends DataSchemaNode> getChildNodes() {
109 return (Collection) Collections2.filter(substatements, DataSchemaNode.class::isInstance);
113 public Collection<? extends GroupingDefinition> getGroupings() {
114 return schemaDelegate.getGroupings();
118 public DataSchemaNode dataChildByName(final QName name) {
119 return getChildNodes().stream().filter(child -> name.equals(child.getQName())).findFirst().orElse(null);
123 public Collection<? extends UsesNode> getUses() {
124 return schemaDelegate.getUses();
128 @SuppressWarnings("unchecked")
129 public Collection<? extends NotificationDefinition> getNotifications() {
130 return (Collection) Collections2.filter(substatements, NotificationDefinition.class::isInstance);
134 @SuppressWarnings("unchecked")
135 public Collection<? extends ActionDefinition> getActions() {
136 return (Collection) Collections2.filter(substatements, ActionDefinition.class::isInstance);
140 public Optional<? extends QualifiedBound> getWhenCondition() {
141 return schemaDelegate.getWhenCondition();
145 public @NonNull Status getStatus() {
146 return schemaDelegate.getStatus();
150 public Optional<String> getDescription() {
151 return schemaDelegate.getDescription();
155 public Optional<String> getReference() {
156 return schemaDelegate.getReference();
160 public AugmentEffectiveStatement asEffectiveStatement() {
165 @Deprecated(forRemoval = true)
166 public Optional<AugmentationSchemaNode> getOriginalDefinition() {
167 return schemaDelegate.getOriginalDefinition();