35a70e5824649f992ae495afc7e9351badc4429a
[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.opendaylight.mdsal.binding.model.api.ConcreteType;
13 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
14 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
15 import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType;
16 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
17 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
18
19 /**
20  * Generator corresponding to an {@code input} or an {@code output} statement.
21  */
22 abstract class OperationContainerGenerator<S extends DataTreeEffectiveStatement<?>, R extends CompositeRuntimeType>
23         extends CompositeSchemaTreeGenerator<S, R> {
24     private final ConcreteType baseInterface;
25
26     OperationContainerGenerator(final S statement, final AbstractCompositeGenerator<?, ?> parent,
27             final ConcreteType baseInterface) {
28         super(statement, parent);
29         this.baseInterface = requireNonNull(baseInterface);
30     }
31
32     @Override
33     final void pushToInference(final SchemaInferenceStack dataTree) {
34         dataTree.enterSchemaTree(statement().getIdentifier());
35     }
36
37     @Override
38     final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
39         final AbstractCompositeGenerator<?, ?> parent = getParent();
40         if (parent instanceof ActionGenerator && ((ActionGenerator) parent).isAddedByUses()) {
41             //        final ActionDefinition orig = findOrigAction(parentSchema, action).get();
42             //        // Original definition may live in a different module, make sure we account for that
43             //        final ModuleContext origContext = moduleContext(
44             //            orig.getPath().getPathFromRoot().iterator().next().getModule());
45             //        input = context.addAliasType(origContext, orig.getInput(), action.getInput());
46             //        output = context.addAliasType(origContext, orig.getOutput(), action.getOutput());
47
48             throw new UnsupportedOperationException("Lookup in original");
49         }
50
51         final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
52         builder.addImplementsType(baseInterface);
53         addAugmentable(builder);
54
55         addUsesInterfaces(builder, builderFactory);
56         addConcreteInterfaceMethods(builder);
57         addGetterMethods(builder, builderFactory);
58
59         final ModuleGenerator module = currentModule();
60         module.addQNameConstant(builder, localName());
61
62         annotateDeprecatedIfNecessary(builder);
63         builderFactory.addCodegenInformation(module, statement(), builder);
64 //                builder.setSchemaPath(schemaNode.getPath());
65         builder.setModuleName(module.statement().argument().getLocalName());
66
67         return builder.build();
68     }
69 }