Fix a typo in UnionTemplate
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / EnumTemplate.xtend
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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 extension org.opendaylight.mdsal.binding.generator.BindingGeneratorUtil.encodeAngleBrackets
11 import static org.opendaylight.mdsal.binding.model.ri.Types.STRING;
12
13 import com.google.common.collect.ImmutableMap
14 import com.google.common.collect.ImmutableMap.Builder
15 import java.util.Optional
16 import org.opendaylight.mdsal.binding.model.api.Enumeration
17 import org.opendaylight.mdsal.binding.model.api.GeneratedType
18
19 /**
20  * Template for generating JAVA enumeration type.
21  */
22 class EnumTemplate extends BaseTemplate {
23     /**
24      * Enumeration which will be transformed to JAVA source code for enumeration
25      */
26     val Enumeration enums
27
28     /**
29      * Constructs instance of this class with concrete <code>enums</code>.
30      *
31      * @param enums enumeration which will be transformed to JAVA source code
32      */
33     new(AbstractJavaGeneratedType javaType, Enumeration enums) {
34         super(javaType, enums as GeneratedType)
35         this.enums = enums
36     }
37
38     /**
39      * Constructs instance of this class with concrete <code>enums</code>.
40      *
41      * @param enums enumeration which will be transformed to JAVA source code
42      */
43     new(Enumeration enums) {
44         super(enums as GeneratedType)
45         this.enums = enums
46     }
47
48     /**
49      * Generates only JAVA enumeration source code.
50      *
51      * @return string with JAVA enumeration source code
52      */
53     def generateAsInnerClass() {
54         return body
55     }
56
57     def writeEnumItem(String name, String mappedName, int value, String description) '''
58         «IF description !== null»
59             «description.trim.encodeAngleBrackets.encodeJavadocSymbols.wrapToDocumentation»
60         «ENDIF»
61         «mappedName»(«value», "«name»")
62     '''
63
64     /**
65      * Template method which generates enumeration body (declaration + enumeration items).
66      *
67      * @return string with the enumeration body
68      */
69     override body() '''
70         «enums.formatDataForJavaDoc.wrapToDocumentation»
71         «generatedAnnotation»
72         public enum «enums.name» implements «org.opendaylight.yangtools.yang.binding.Enumeration.importedName» {
73             «writeEnumeration(enums)»
74
75             private static final «JU_MAP.importedName»<«STRING.importedName», «enums.name»> NAME_MAP;
76             private static final «JU_MAP.importedName»<«Integer.importedName», «enums.name»> VALUE_MAP;
77
78             static {
79                 final «Builder.importedName»<«STRING.importedName», «enums.name»> nb = «ImmutableMap.importedName».builder();
80                 final «Builder.importedName»<«Integer.importedName», «enums.name»> vb = «ImmutableMap.importedName».builder();
81                 for («enums.name» enumItem : «enums.name».values()) {
82                     vb.put(enumItem.value, enumItem);
83                     nb.put(enumItem.name, enumItem);
84                 }
85
86                 NAME_MAP = nb.build();
87                 VALUE_MAP = vb.build();
88             }
89
90             private final «STRING.importedName» name;
91             private final int value;
92
93             private «enums.name»(int value, «STRING.importedName» name) {
94                 this.value = value;
95                 this.name = name;
96             }
97
98             @«OVERRIDE.importedName»
99             public «STRING.importedName» getName() {
100                 return name;
101             }
102
103             @«OVERRIDE.importedName»
104             public int getIntValue() {
105                 return value;
106             }
107
108             /**
109              * Return the enumeration member whose {@link #getName()} matches specified value.
110              *
111              * @param name YANG assigned name
112              * @return corresponding «enums.name» item, if present
113              * @throws NullPointerException if name is null
114              */
115             public static «Optional.importedName»<«enums.name»> forName(«STRING.importedName» name) {
116                 return «Optional.importedName».ofNullable(NAME_MAP.get(«JU_OBJECTS.importedName».requireNonNull(name)));
117             }
118
119             /**
120              * Return the enumeration member whose {@link #getIntValue()} matches specified value.
121              *
122              * @param intValue integer value
123              * @return corresponding «enums.name» item, or null if no such item exists
124              */
125             public static «enums.name» forValue(int intValue) {
126                 return VALUE_MAP.get(intValue);
127             }
128         }
129     '''
130
131     def writeEnumeration(Enumeration enumeration)
132     '''
133     «FOR v : enumeration.values SEPARATOR ",\n" AFTER ";"»
134     «writeEnumItem(v.name, v.mappedName, v.value, v.description.orElse(null))»«
135     ENDFOR»
136     '''
137 }