Rename binding-lib
[yangtools.git] / binding / binding-ri / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / ChoiceGenerator.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, 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.mdsal.binding.generator.impl.reactor;
9
10 import static com.google.common.base.Verify.verify;
11
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultChoiceRuntimeType;
15 import org.opendaylight.yangtools.binding.contract.StatementNamespace;
16 import org.opendaylight.yangtools.binding.model.api.GeneratedType;
17 import org.opendaylight.yangtools.binding.model.api.Type;
18 import org.opendaylight.yangtools.binding.model.api.type.builder.GeneratedTypeBuilder;
19 import org.opendaylight.yangtools.binding.model.ri.BindingTypes;
20 import org.opendaylight.yangtools.binding.runtime.api.AugmentRuntimeType;
21 import org.opendaylight.yangtools.binding.runtime.api.CaseRuntimeType;
22 import org.opendaylight.yangtools.binding.runtime.api.ChoiceRuntimeType;
23 import org.opendaylight.yangtools.binding.runtime.api.RuntimeType;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
27
28 /**
29  * Generator corresponding to a {@code choice} statement.
30  */
31 final class ChoiceGenerator extends CompositeSchemaTreeGenerator<ChoiceEffectiveStatement, ChoiceRuntimeType> {
32     static final class ChoiceBuilder extends CompositeRuntimeTypeBuilder<ChoiceEffectiveStatement, ChoiceRuntimeType> {
33         private final List<CaseRuntimeType> augmentedCases = new ArrayList<>();
34
35         ChoiceBuilder(final ChoiceEffectiveStatement statement) {
36             super(statement);
37         }
38
39         @Override
40         void processAugment(final AugmentResolver resolver, final AbstractAugmentGenerator augment) {
41             augment.fillRuntimeCasesIn(resolver, statement(), augmentedCases);
42         }
43
44         @Override
45         boolean isAugmentedChild(final QName qname) {
46             for (var augmented : augmentedCases) {
47                 if (qname.equals(augmented.statement().argument())) {
48                     return true;
49                 }
50             }
51             return false;
52         }
53
54         @Override
55         ChoiceRuntimeType build(final GeneratedType type, final ChoiceEffectiveStatement statement,
56                 final List<RuntimeType> children, final List<AugmentRuntimeType> augments) {
57             verify(augments.isEmpty(), "Unexpected augments %s", augments);
58             children.addAll(augmentedCases);
59             return new DefaultChoiceRuntimeType(type, statement, children);
60         }
61     }
62
63     ChoiceGenerator(final ChoiceEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
64         super(statement, parent);
65     }
66
67     @Override
68     StatementNamespace namespace() {
69         return StatementNamespace.CHOICE;
70     }
71
72     @Override
73     void pushToInference(final SchemaInferenceStack dataTree) {
74         // No-op
75     }
76
77     @Override
78     GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
79         final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
80         builder.addImplementsType(BindingTypes.choiceIn(Type.of(getParent().typeName())));
81
82         final ModuleGenerator module = currentModule();
83         module.addQNameConstant(builder, localName());
84
85         annotateDeprecatedIfNecessary(builder);
86         builderFactory.addCodegenInformation(module, statement(), builder);
87 //      newType.setSchemaPath(schemaNode.getPath());
88         builder.setModuleName(module.statement().argument().getLocalName());
89
90         return builder.build();
91     }
92
93     @Override
94     ChoiceBuilder createBuilder(final ChoiceEffectiveStatement statement) {
95         return new ChoiceBuilder(statement);
96     }
97 }