Make AbstractContainerSchemaNode generic
[yangtools.git] / data / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / ContainerSchemaNodes.java
1 /*
2  * Copyright (c) 2016 ZTE, Inc. 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.yang.data.util;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableMap;
15 import com.google.common.collect.ImmutableSet;
16 import com.google.common.collect.Maps;
17 import java.util.Collection;
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.ContainerLike;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
26 import org.opendaylight.yangtools.yang.model.api.InputSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
28 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
29 import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
31 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.Status;
33 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.UsesNode;
35 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
36
37 /**
38  * Utility class for taking notification or rpc as ContainerSchemaNode.
39  *
40  * @author <a href="mailto:geng.xingyuan@zte.com.cn">Geng Xingyuan</a>
41  */
42 public final class ContainerSchemaNodes {
43     private ContainerSchemaNodes() {
44         // Hidden on purpose
45     }
46
47     @Beta
48     public static @NonNull ContainerLike forNotification(final NotificationDefinition notification) {
49         return new NotificationContainerSchemaNode(notification);
50     }
51
52     @Beta
53     public static @NonNull ContainerLike forRPC(final RpcDefinition rpc) {
54         return new RpcContainerSchemaNode(rpc);
55     }
56
57     private abstract static class AbstractContainerSchemaNode<T extends SchemaNode> implements ContainerLike {
58         final T schemaNode;
59
60         AbstractContainerSchemaNode(final T schemaNode) {
61             this.schemaNode = schemaNode;
62         }
63
64         @Override
65         public Collection<? extends UsesNode> getUses() {
66             return ImmutableSet.of();
67         }
68
69         @Override
70         @Deprecated
71         public boolean isAugmenting() {
72             return false;
73         }
74
75         @Override
76         public Optional<Boolean> effectiveConfig() {
77             return Optional.empty();
78         }
79
80         @Override
81         public QName getQName() {
82             return schemaNode.getQName();
83         }
84
85         @Override
86         public Optional<String> getDescription() {
87             return schemaNode.getDescription();
88         }
89
90         @Override
91         public Optional<String> getReference() {
92             return schemaNode.getReference();
93         }
94
95         @Override
96         public Status getStatus() {
97             return schemaNode.getStatus();
98         }
99
100         @Override
101         public Collection<? extends @NonNull MustDefinition> getMustConstraints() {
102             return ImmutableList.of();
103         }
104
105         @Override
106         public Optional<? extends QualifiedBound> getWhenCondition() {
107             return Optional.empty();
108         }
109     }
110
111     private static final class RpcContainerSchemaNode extends AbstractContainerSchemaNode<RpcDefinition> {
112         RpcContainerSchemaNode(final RpcDefinition rpcDefinition) {
113             super(rpcDefinition);
114         }
115
116         @Override
117         public Collection<? extends GroupingDefinition> getGroupings() {
118             return schemaNode.getGroupings();
119         }
120
121         @Override
122         public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
123             return schemaNode.getTypeDefinitions();
124         }
125
126         @Override
127         public Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
128             return ImmutableSet.of();
129         }
130
131         @Override
132         public Collection<? extends DataSchemaNode> getChildNodes() {
133             // FIXME: input/output are always present, clean this up
134             final InputSchemaNode input = schemaNode.getInput();
135             final OutputSchemaNode output = schemaNode.getOutput();
136             if (input == null && output == null) {
137                 return ImmutableList.of();
138             } else if (input != null && output != null) {
139                 return ImmutableList.of(input, output);
140             } else if (input != null) {
141                 return ImmutableList.of(input);
142             } else {
143                 return ImmutableList.of(output);
144             }
145         }
146
147         @Override
148         public DataSchemaNode dataChildByName(final QName name) {
149             // FIXME: also check namespace
150             return switch (name.getLocalName()) {
151                 case "input" -> schemaNode.getInput();
152                 case "output" -> schemaNode.getOutput();
153                 default -> null;
154             };
155         }
156
157         @Override
158         @Deprecated(forRemoval = true)
159         public boolean isAddedByUses() {
160             return false;
161         }
162
163         @Override
164         public Collection<? extends ActionDefinition> getActions() {
165             return ImmutableSet.of();
166         }
167
168         @Override
169         public Collection<? extends NotificationDefinition> getNotifications() {
170             return ImmutableSet.of();
171         }
172     }
173
174     private static final class NotificationContainerSchemaNode
175             extends AbstractContainerSchemaNode<NotificationDefinition> {
176         private final ImmutableMap<QName, ? extends DataSchemaNode> mapNodes;
177
178         private NotificationContainerSchemaNode(final NotificationDefinition notification) {
179             super(notification);
180             mapNodes = Maps.uniqueIndex(notification.getChildNodes(), DataSchemaNode::getQName);
181         }
182
183         @Override
184         public Collection<? extends NotificationDefinition> getNotifications() {
185             return ImmutableSet.of(schemaNode);
186         }
187
188         @Override
189         public Collection<? extends AugmentationSchemaNode> getAvailableAugmentations() {
190             return schemaNode.getAvailableAugmentations();
191         }
192
193         @Override
194         public Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
195             return schemaNode.getTypeDefinitions();
196         }
197
198         @Override
199         public Collection<? extends DataSchemaNode> getChildNodes() {
200             return schemaNode.getChildNodes();
201         }
202
203         @Override
204         public Collection<? extends GroupingDefinition> getGroupings() {
205             return schemaNode.getGroupings();
206         }
207
208         @Override
209         public DataSchemaNode dataChildByName(final QName name) {
210             return mapNodes.get(requireNonNull(name));
211         }
212
213         @Override
214         @Deprecated(forRemoval = true)
215         public boolean isAddedByUses() {
216             // FIXME: reference to https://jira.opendaylight.org/browse/YANGTOOLS-685
217             return false;
218         }
219
220         @Override
221         public Collection<? extends ActionDefinition> getActions() {
222             return ImmutableSet.of();
223         }
224     }
225 }