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.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;
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;
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);
52 @NonNull AugmentEffectiveStatement delegate() {
57 public AugmentStatement getDeclared() {
58 return delegate.getDeclared();
62 public SchemaNodeIdentifier argument() {
63 return delegate.argument();
67 public StatementOrigin statementOrigin() {
68 return delegate.statementOrigin();
72 public List<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
77 @SuppressWarnings({ "rawtypes", "unchecked" })
78 public Collection<SchemaTreeEffectiveStatement<?>> schemaTreeNodes() {
79 return (Collection) collectEffectiveSubstatements(SchemaTreeEffectiveStatement.class);
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()))
91 public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
92 return schemaDelegate.getTypeDefinitions();
96 @SuppressWarnings("unchecked")
97 public Collection<? extends DataSchemaNode> getChildNodes() {
98 return (Collection) Collections2.filter(substatements, DataSchemaNode.class::isInstance);
102 public Collection<? extends GroupingDefinition> getGroupings() {
103 return schemaDelegate.getGroupings();
107 public DataSchemaNode dataChildByName(final QName name) {
108 return getChildNodes().stream().filter(child -> name.equals(child.getQName())).findFirst().orElse(null);
112 public Collection<? extends UsesNode> getUses() {
113 return schemaDelegate.getUses();
117 @SuppressWarnings("unchecked")
118 public Collection<? extends NotificationDefinition> getNotifications() {
119 return (Collection) Collections2.filter(substatements, NotificationDefinition.class::isInstance);
123 @SuppressWarnings("unchecked")
124 public Collection<? extends ActionDefinition> getActions() {
125 return (Collection) Collections2.filter(substatements, ActionDefinition.class::isInstance);
129 public Optional<? extends QualifiedBound> getWhenCondition() {
130 return schemaDelegate.getWhenCondition();
134 public @NonNull Status getStatus() {
135 return schemaDelegate.getStatus();
139 public Optional<String> getDescription() {
140 return schemaDelegate.getDescription();
144 public Optional<String> getReference() {
145 return schemaDelegate.getReference();
149 public AugmentEffectiveStatement asEffectiveStatement() {
154 public String toString() {
155 return MoreObjects.toStringHelper(this)
156 .add("delegate", delegate)
157 .add("substatements", substatements.size())