6c0e9a34605b8b7ce4ec21a259d07fc517b4bd8e
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / AbstractTypeAwareGenerator.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 org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
13 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
14 import org.opendaylight.mdsal.binding.model.api.Type;
15 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
16 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
17 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
18 import org.opendaylight.yangtools.odlext.model.api.ContextReferenceEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.TypeAware;
20 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 /**
28  * Common base class for {@link LeafGenerator} and {@link LeafListGenerator}.
29  */
30 abstract class AbstractTypeAwareGenerator<T extends DataTreeEffectiveStatement<?>>
31         extends AbstractTypeObjectGenerator<T> {
32     private static final Logger LOG = LoggerFactory.getLogger(AbstractTypeAwareGenerator.class);
33
34     private IdentityGenerator contextType;
35
36     AbstractTypeAwareGenerator(final T statement, final AbstractCompositeGenerator<?> parent) {
37         super(statement, parent);
38         verify(statement instanceof TypeAware, "Unexpected statement %s", statement);
39     }
40
41     @Override
42     final void pushToInference(final SchemaInferenceStack dataTree) {
43         dataTree.enterDataTree(statement().getIdentifier());
44     }
45
46     @Override
47     final void bindDerivedGenerators(final TypeReference reference) {
48         // No-op
49     }
50
51     @Override
52     final void bindTypeDefinition(final GeneratorContext context) {
53         super.bindTypeDefinition(context);
54         contextType = statement().findFirstEffectiveSubstatementArgument(ContextReferenceEffectiveStatement.class)
55             .map(context::resolveIdentity)
56             .orElse(null);
57     }
58
59     @Override
60     final TypeDefinition<?> extractTypeDefinition() {
61         return ((TypedDataSchemaNode) statement()).getType();
62     }
63
64     @Override
65     final JavaTypeName createTypeName() {
66         // FIXME: we should be be assigning a non-conflict name here
67         return getParent().typeName().createEnclosed(assignedName(), "$");
68     }
69
70     @Override
71     final GeneratedTransferObject createDerivedType(final TypeBuilderFactory builderFactory,
72             final GeneratedTransferObject baseType) {
73         throw new UnsupportedOperationException();
74     }
75
76     @Override
77     final MethodSignatureBuilder constructGetter(final GeneratedTypeBuilderBase<?> builder, final Type returnType) {
78         final MethodSignatureBuilder ret = super.constructGetter(builder, returnType);
79
80         if (contextType != null) {
81             ret.addAnnotation(BindingTypes.ROUTING_CONTEXT)
82                 .addParameter("value", contextType.typeName().toString() + ".class");
83         }
84
85         return ret;
86     }
87
88     @Override
89     final void constructRequire(final GeneratedTypeBuilderBase<?> builder, final Type returnType) {
90         constructRequireImpl(builder, returnType);
91     }
92 }