RFC8040 'rc:yang-data' support for mdsal binding generator
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / BaseTemplate.xtend
index ec31b7db03cb67c1bfea9d138322942ae7684fcb..2728e7c8b0d04bc66062f5a447d9038839b4c595 100644 (file)
@@ -8,6 +8,8 @@
 package org.opendaylight.mdsal.binding.java.api.generator
 
 import static extension org.opendaylight.mdsal.binding.generator.BindingGeneratorUtil.encodeAngleBrackets
+import static org.opendaylight.mdsal.binding.model.ri.Types.STRING;
+import static org.opendaylight.mdsal.binding.model.ri.Types.objectType;
 
 import com.google.common.base.CharMatcher
 import com.google.common.base.Splitter
@@ -18,7 +20,6 @@ import java.util.Map.Entry
 import java.util.StringTokenizer
 import java.util.regex.Pattern
 import org.eclipse.jdt.annotation.NonNull;
-import org.gaul.modernizer_maven_annotations.SuppressModernizer
 import org.opendaylight.mdsal.binding.model.api.AnnotationType
 import org.opendaylight.mdsal.binding.model.api.ConcreteType
 import org.opendaylight.mdsal.binding.model.api.Constant
@@ -31,8 +32,8 @@ import org.opendaylight.mdsal.binding.model.api.Type
 import org.opendaylight.mdsal.binding.model.api.TypeMemberComment
 import org.opendaylight.mdsal.binding.model.ri.TypeConstants
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
+import org.opendaylight.yangtools.yang.binding.BaseIdentity
 
-@SuppressModernizer
 abstract class BaseTemplate extends JavaFileTemplate {
     static final char NEW_LINE = '\n'
     static final char SPACE = ' '
@@ -85,7 +86,11 @@ abstract class BaseTemplate extends JavaFileTemplate {
     '''
 
     final protected def getterMethodName(GeneratedProperty field) {
-        return '''«BindingMapping.GETTER_PREFIX»«field.name.toFirstUpper»'''
+        return field.name.getterMethodName
+    }
+
+    final protected def getterMethodName(String propName) {
+        return '''«BindingMapping.GETTER_PREFIX»«propName.toFirstUpper»'''
     }
 
     /**
@@ -229,13 +234,9 @@ abstract class BaseTemplate extends JavaFileTemplate {
             lastChar = text.charAt(text.length - 1)
             badEnding = true
         }
-        sb.append("<a href = \"")
-        sb.append(tempText)
-        sb.append("\">")
-        sb.append(tempText)
-        sb.append("</a>")
+        sb.append("<a href = \"").append(tempText).append("\">").append(tempText).append("</a>")
 
-        if(badEnding)
+        if (badEnding)
             sb.append(lastChar)
 
         return sb.toString
@@ -264,7 +265,7 @@ abstract class BaseTemplate extends JavaFileTemplate {
                 sb.append(lineBuilder).append(NEW_LINE)
                 lineBuilder.setLength(0)
 
-                if (nextElement == " ") {
+                if (" ".equals(nextElement)) {
                     isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar;
                 }
             }
@@ -296,7 +297,44 @@ abstract class BaseTemplate extends JavaFileTemplate {
     def protected emitConstant(Constant c) '''
         «IF BindingMapping.QNAME_STATIC_FIELD_NAME.equals(c.name)»
             «val entry = c.value as Entry<JavaTypeName, String>»
+            /**
+             * YANG identifier of the statement represented by this class.
+             */
             public static final «c.type.importedNonNull» «c.name» = «entry.key.importedName».«BindingMapping.MODULE_INFO_QNAMEOF_METHOD_NAME»("«entry.value»");
+        «ELSEIF BindingMapping.NAME_STATIC_FIELD_NAME.equals(c.name)»
+            «val entry = c.value as Entry<JavaTypeName, String>»
+            /**
+             * Yang Data template name of the statement represented by this class.
+             */
+            public static final «c.type.importedNonNull» «c.name» = «entry.key.importedName».«BindingMapping.MODULE_INFO_YANGDATANAMEOF_METHOD_NAME»("«entry.value»");
+        «ELSEIF BindingMapping.VALUE_STATIC_FIELD_NAME.equals(c.name) && BaseIdentity.equals(c.value)»
+            «val typeName = c.type.importedName»
+            «val override = OVERRIDE.importedName»
+            /**
+             * Singleton value representing the {@link «typeName»} identity.
+             */
+            public static final «c.type.importedNonNull» «c.name» = new «typeName»() {
+                @«override»
+                public «CLASS.importedName»<«typeName»> «BindingMapping.BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME»() {
+                    return «typeName».class;
+                }
+
+                @«override»
+                public int hashCode() {
+                    return «typeName».class.hashCode();
+                }
+
+                @«override»
+                public boolean equals(final «objectType.importedName» obj) {
+                    return obj == this || obj instanceof «typeName» other
+                        && «typeName».class.equals(other.«BindingMapping.BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME»());
+                }
+
+                @«override»
+                public «STRING.importedName» toString() {
+                    return «MOREOBJECTS.importedName».toStringHelper("«c.type.name»").add("qname", QNAME).toString();
+                }
+            };
         «ELSE»
             public static final «c.type.importedName» «c.name» = «c.value»;
         «ENDIF»
@@ -338,14 +376,6 @@ abstract class BaseTemplate extends JavaFileTemplate {
        «ENDFOR»
     '''
 
-    def protected hashCodeResult(Collection<? extends GeneratedProperty> properties) '''
-        final int prime = 31;
-        int result = 1;
-        «FOR property : properties»
-            result = prime * result + «property.importedUtilClass».hashCode(«property.fieldName»);
-        «ENDFOR»
-    '''
-
     def protected final generateAnnotation(AnnotationType annotation) '''
         @«annotation.importedName»
         «IF annotation.parameters !== null && !annotation.parameters.empty»