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 target.get(SchemaTreeNamespace.class, qname).ifPresent(builder::add);
61 substatements = builder.build();
64 @NonNull AugmentEffectiveStatement delegate() {
69 public AugmentStatement getDeclared() {
70 return delegate.getDeclared();
74 public SchemaNodeIdentifier argument() {
75 return delegate.argument();
79 public StatementOrigin statementOrigin() {
80 return delegate.statementOrigin();
84 public <K, V, N extends IdentifierNamespace<K, V>> Optional<V> get(final Class<N> namespace, final K identifier) {
85 return Optional.empty();
89 public <K, V, N extends IdentifierNamespace<K, V>> Map<K, V> getAll(final Class<N> namespace) {
94 public List<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
99 public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
100 return schemaDelegate.getTypeDefinitions();
104 @SuppressWarnings("unchecked")
105 public Collection<? extends DataSchemaNode> getChildNodes() {
106 return (Collection) Collections2.filter(substatements, DataSchemaNode.class::isInstance);
110 public Collection<? extends GroupingDefinition> getGroupings() {
111 return schemaDelegate.getGroupings();
115 public DataSchemaNode dataChildByName(final QName name) {
116 return getChildNodes().stream().filter(child -> name.equals(child.getQName())).findFirst().orElse(null);
120 public Collection<? extends UsesNode> getUses() {
121 return schemaDelegate.getUses();
125 @SuppressWarnings("unchecked")
126 public Collection<? extends NotificationDefinition> getNotifications() {
127 return (Collection) Collections2.filter(substatements, NotificationDefinition.class::isInstance);
131 @SuppressWarnings("unchecked")
132 public Collection<? extends ActionDefinition> getActions() {
133 return (Collection) Collections2.filter(substatements, ActionDefinition.class::isInstance);
137 public Optional<? extends QualifiedBound> getWhenCondition() {
138 return schemaDelegate.getWhenCondition();
142 public @NonNull Status getStatus() {
143 return schemaDelegate.getStatus();
147 public Optional<String> getDescription() {
148 return schemaDelegate.getDescription();
152 public Optional<String> getReference() {
153 return schemaDelegate.getReference();
157 public AugmentEffectiveStatement asEffectiveStatement() {