Override Rpc/Action invoke method
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / AbstractInvokableGenerator.java
1 /*
2  * Copyright (c) 2022 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 org.opendaylight.mdsal.binding.model.api.GeneratedType;
11 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
12 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
13 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
14 import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType;
15 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
16 import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
19
20 abstract class AbstractInvokableGenerator<S extends SchemaTreeEffectiveStatement<?>, R extends CompositeRuntimeType>
21         extends CompositeSchemaTreeGenerator<S, R> {
22     private static final JavaTypeName FUNCTIONAL_INTERFACE_ANNOTATION = JavaTypeName.create(FunctionalInterface.class);
23
24     AbstractInvokableGenerator(final S statement, final AbstractCompositeGenerator<?, ?> parent) {
25         super(statement, parent);
26     }
27
28     @Override
29     final void pushToInference(final SchemaInferenceStack dataTree) {
30         dataTree.enterSchemaTree(statement().argument());
31     }
32
33     @Override
34     final void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
35         // RPCs/Actions are a separate concept
36     }
37
38     @Override
39     final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
40         final var builder = builderFactory.newGeneratedTypeBuilder(typeName());
41         final var inputType = getChild(this, InputEffectiveStatement.class).getOriginal()
42             .getGeneratedType(builderFactory);
43         final var outputType = getChild(this, OutputEffectiveStatement.class).getOriginal()
44             .getGeneratedType(builderFactory);
45         addImplementedType(builderFactory, builder, inputType, outputType);
46         builder.addAnnotation(FUNCTIONAL_INTERFACE_ANNOTATION);
47         defaultImplementedInterace(builder);
48
49         final var module = currentModule();
50         module.addQNameConstant(builder, statement().argument());
51
52         annotateDeprecatedIfNecessary(builder);
53         builderFactory.addCodegenInformation(module, statement(), builder);
54
55         return builder.build();
56     }
57
58     abstract void addImplementedType(TypeBuilderFactory builderFactory, GeneratedTypeBuilder builder,
59         GeneratedType input, GeneratedType output);
60 }