Update DataObjectStep class hierarchy
[yangtools.git] / parser / rfc8040-parser-support / src / main / java / org / opendaylight / yangtools / rfc8040 / parser / YangDataEffectiveStatementImpl.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, 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.yangtools.rfc8040.parser;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.base.VerifyException;
14 import com.google.common.collect.ImmutableList;
15 import java.util.Collection;
16 import java.util.List;
17 import java.util.Optional;
18 import org.eclipse.jdt.annotation.NonNull;
19 import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
20 import org.opendaylight.yangtools.rfc8040.model.api.YangDataSchemaNode;
21 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.common.YangDataName;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
28 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
29 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractEffectiveUnknownSchmemaNode;
30 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataNodeContainerMixin;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
32
33 @Beta
34 final class YangDataEffectiveStatementImpl
35         extends AbstractEffectiveUnknownSchmemaNode<YangDataName, YangDataStatement>
36         implements YangDataEffectiveStatement, YangDataSchemaNode,
37                    DataNodeContainerMixin<YangDataName, YangDataStatement> {
38     private final @NonNull DataSchemaNode child;
39
40     YangDataEffectiveStatementImpl(final Current<YangDataName, YangDataStatement> stmt,
41              final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final DataSchemaNode child) {
42         super(stmt.declared(), stmt.argument(), stmt.history(), substatements);
43         this.child = requireNonNull(child);
44     }
45
46     @Override
47     public QName getQName() {
48         return child.getQName();
49     }
50
51     @Override
52     public DataSchemaNode dataChildByName(final QName name) {
53         return name.equals(child.getQName()) ? child : null;
54     }
55
56     @Override
57     public YangDataEffectiveStatement asEffectiveStatement() {
58         return this;
59     }
60
61     @Override
62     public Optional<DataTreeEffectiveStatement<?>> findDataTreeNode(final QName qname) {
63         if (child instanceof DataTreeEffectiveStatement<?> dataChild && dataChild.argument().equals(qname)) {
64             return Optional.of(dataChild);
65         } else if (child instanceof DataTreeAwareEffectiveStatement<?, ?> aware) {
66             // A schema tree statement which *has to* know about data tree -- just forward it
67             return aware.findDataTreeNode(qname);
68         } else {
69             throw new VerifyException("Unexpected child " + child);
70         }
71     }
72
73     @Override
74     public Collection<DataTreeEffectiveStatement<?>> dataTreeNodes() {
75         if (child instanceof DataTreeEffectiveStatement<?> dataChild) {
76             return List.of(dataChild);
77         } else if (child instanceof DataTreeAwareEffectiveStatement<?, ?> aware) {
78             // A schema tree statement which *has to* know about data tree -- just forward it
79             return aware.dataTreeNodes();
80         } else {
81             throw new VerifyException("Unexpected child " + child);
82         }
83     }
84
85     @Override
86     public Collection<SchemaTreeEffectiveStatement<?>> schemaTreeNodes() {
87         return (Collection) List.of(child);
88     }
89
90     @Override
91     public Optional<SchemaTreeEffectiveStatement<?>> findSchemaTreeNode(final QName qname) {
92         return qname.equals(child.getQName()) ? (Optional) Optional.of(child) : Optional.empty();
93     }
94 }