RFC8040 'rc:yang-data' support for mdsal binding generator
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / OperationContainerGenerator.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 java.util.Objects.requireNonNull;
11
12 import org.eclipse.jdt.annotation.NonNull;
13 import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member;
14 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
15 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
16 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
17 import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType;
18 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
20
21 /**
22  * Generator corresponding to an {@code input} or an {@code output} statement.
23  */
24 abstract sealed class OperationContainerGenerator<S extends DataTreeEffectiveStatement<?>,
25             R extends CompositeRuntimeType> extends CompositeSchemaTreeGenerator<S, R>
26         permits InputGenerator, OutputGenerator {
27     private final ConcreteType baseInterface;
28
29     OperationContainerGenerator(final S statement, final AbstractCompositeGenerator<?, ?> parent,
30             final ConcreteType baseInterface) {
31         super(statement, parent);
32         this.baseInterface = requireNonNull(baseInterface);
33     }
34
35     @Override
36     final CollisionDomain parentDomain() {
37         return getParent().parentDomain();
38     }
39
40     @Override
41     final AbstractCompositeGenerator<?, ?> getPackageParent() {
42         return getParent().getParent();
43     }
44
45     @Override
46     final Member createMember(final CollisionDomain domain) {
47         return createMember(domain, getParent().ensureMember());
48     }
49
50     abstract @NonNull Member createMember(@NonNull CollisionDomain domain, Member parent);
51
52     @Override
53     final void pushToInference(final SchemaInferenceStack dataTree) {
54         dataTree.enterSchemaTree(statement().argument());
55     }
56
57     @Override
58     final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
59         final AbstractCompositeGenerator<?, ?> parent = getParent();
60         if (parent instanceof ActionGenerator actionParent && actionParent.isAddedByUses()) {
61             //        final ActionDefinition orig = findOrigAction(parentSchema, action).get();
62             //        // Original definition may live in a different module, make sure we account for that
63             //        final ModuleContext origContext = moduleContext(
64             //            orig.getPath().getPathFromRoot().iterator().next().getModule());
65             //        input = context.addAliasType(origContext, orig.getInput(), action.getInput());
66             //        output = context.addAliasType(origContext, orig.getOutput(), action.getOutput());
67
68             throw new UnsupportedOperationException("Lookup in original");
69         }
70
71         final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
72         builder.addImplementsType(baseInterface);
73         addAugmentable(builder);
74
75         addUsesInterfaces(builder, builderFactory);
76         addConcreteInterfaceMethods(builder);
77         addGetterMethods(builder, builderFactory);
78
79         final ModuleGenerator module = currentModule();
80         module.addQNameConstant(builder, localName());
81
82         annotateDeprecatedIfNecessary(builder);
83         builderFactory.addCodegenInformation(module, statement(), builder);
84 //                builder.setSchemaPath(schemaNode.getPath());
85         builder.setModuleName(module.statement().argument().getLocalName());
86
87         return builder.build();
88     }
89 }