Rehost BindingMapping in yang.binding.contract.Naming
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / FeatureTemplate.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.java.api.generator;
9
10 import static java.util.Objects.requireNonNull;
11
12 import org.eclipse.jdt.annotation.NonNull;
13 import org.opendaylight.mdsal.binding.model.api.Constant;
14 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
15 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
16 import org.opendaylight.mdsal.binding.model.api.Type;
17 import org.opendaylight.yangtools.yang.binding.YangFeature;
18 import org.opendaylight.yangtools.yang.binding.contract.Naming;
19 import org.opendaylight.yangtools.yang.common.QName;
20
21 final class FeatureTemplate extends ClassTemplate {
22     private static final @NonNull JavaTypeName QNAME = JavaTypeName.create(QName.class);
23     private static final @NonNull JavaTypeName YANG_FEATURE = JavaTypeName.create(YangFeature.class);
24
25     private final @NonNull Type dataRoot;
26
27     FeatureTemplate(final GeneratedTransferObject genType, final Type dataRoot) {
28         super(genType);
29         this.dataRoot = requireNonNull(dataRoot);
30     }
31
32     @Override
33     protected String generateClassDeclaration(final boolean isInnerClass) {
34         final var typeName = type().getName();
35
36         return "@" + importedName(NONNULL_BY_DEFAULT) + '\n'
37             + "public final class " + typeName + " extends " + importedName(YANG_FEATURE) + '<' + typeName + ", "
38             + importedName(dataRoot) + '>';
39     }
40
41     @Override
42     protected String constructors() {
43         final var typeName = type().getName();
44
45         return "private " + typeName + "() {\n"
46             + "    // Hidden on purpose\n"
47             + "}";
48     }
49
50     @SuppressWarnings("checkstyle:ParameterName")
51     @Override
52     protected CharSequence emitConstant(final Constant c) {
53         if (!Naming.VALUE_STATIC_FIELD_NAME.equals(c.getName()) || !YangFeature.class.equals(c.getValue())) {
54             return super.emitConstant(c);
55         }
56
57         final var type = type();
58         final var typeName = type.getName();
59         return "/**\n"
60             + " * {@link " + typeName + "} singleton instance.\n"
61             + " */\n"
62             + "public static final " + importedName(type) + ' ' + Naming.VALUE_STATIC_FIELD_NAME + " = new "
63             + type.getName() + "();";
64     }
65
66     @Override
67     protected String propertyMethods() {
68         final var override = importedName(OVERRIDE);
69         final var typeName = type().getName();
70         final var clazz = importedName(CLASS);
71         final var rootName = importedName(dataRoot);
72
73         return '@' + override + '\n'
74             + "public " + clazz + '<' + typeName + "> " + Naming.BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME + "() {\n"
75             + "    return " + typeName + ".class;\n"
76             + "}\n"
77             + '\n'
78             + '@' + override + '\n'
79             + "public " + importedName(QNAME) + " qname() {\n"
80             + "    return " + Naming.QNAME_STATIC_FIELD_NAME + ";\n"
81             + "}\n"
82             + '\n'
83             + '@' + override + '\n'
84             + "public " + clazz + '<' + rootName + "> definingModule() {\n"
85             + "    return " + rootName + ".class;\n"
86             + "}\n";
87     }
88 }