Bug 7064: yang-to-source error on description
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / BaseTemplate.xtend
index d3c2908c81224aaf072c16122e4965b93dd8d1d6..c729af79e0fa47bf1f3a1d0b476275e2f9af5b99 100644 (file)
@@ -18,13 +18,14 @@ import java.util.StringTokenizer
 import java.util.regex.Pattern
 import org.opendaylight.yangtools.binding.generator.util.Types
 import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType
+import org.opendaylight.yangtools.sal.binding.model.api.Constant
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions
 import org.opendaylight.yangtools.sal.binding.model.api.Type
-import org.opendaylight.yangtools.sal.binding.model.api.Constant
+import org.opendaylight.yangtools.sal.binding.model.api.TypeMember
 import org.opendaylight.yangtools.yang.common.QName
 
 abstract class BaseTemplate {
@@ -96,6 +97,10 @@ abstract class BaseTemplate {
         return getter.name.substring(prefix).toFirstLower;
     }
 
+    final protected def isAccessor(MethodSignature maybeGetter) {
+        return maybeGetter.name.startsWith("is") || maybeGetter.name.startsWith("get");
+    }
+
     /**
      * Template method which generates the getter method for <code>field</code>
      *
@@ -103,7 +108,7 @@ abstract class BaseTemplate {
      * generated property with data about field which is generated as the getter method
      * @return string with the getter method source code in JAVA format
      */
-    final protected def getterMethod(GeneratedProperty field) {
+    protected def getterMethod(GeneratedProperty field) {
         '''
             public «field.returnType.importedName» «field.getterMethodName»() {
                 «IF field.returnType.importedName.contains("[]")»
@@ -213,20 +218,15 @@ abstract class BaseTemplate {
     }
 
     private static final CharMatcher AMP_MATCHER = CharMatcher.is('&');
-    private static final CharMatcher GT_MATCHER = CharMatcher.is('>');
-    private static final CharMatcher LT_MATCHER = CharMatcher.is('<');
 
     def encodeJavadocSymbols(String description) {
         if (description.nullOrEmpty) {
             return description;
         }
 
-        var ret = description.replace("*/", "&#42;&#47;")
-
-        // FIXME: Use Guava's HtmlEscapers once we have it available
+        var ret = description.replace("*/", "&#42;&#47;");
         ret = AMP_MATCHER.replaceFrom(ret, "&amp;");
-        ret = GT_MATCHER.replaceFrom(ret, "&gt;");
-        ret = LT_MATCHER.replaceFrom(ret, "&lt;");
+
         return ret;
     }
 
@@ -247,6 +247,25 @@ abstract class BaseTemplate {
         '''.toString
     }
 
+    def protected String formatDataForJavaDoc(TypeMember type, String additionalComment) {
+        val StringBuilder typeDescriptionBuilder = new StringBuilder();
+        if (!type.comment.nullOrEmpty) {
+            typeDescriptionBuilder.append(formatToParagraph(type.comment))
+            typeDescriptionBuilder.append(NEW_LINE)
+            typeDescriptionBuilder.append(NEW_LINE)
+            typeDescriptionBuilder.append(NEW_LINE)
+        }
+        typeDescriptionBuilder.append(additionalComment)
+        var typeDescription = wrapToDocumentation(typeDescriptionBuilder.toString)
+        return '''
+            «typeDescription»
+        '''.toString
+    }
+
+    def asCode(String text) {
+        return "<code>" + text + "</code>"
+    }
+
     def asLink(String text) {
         val StringBuilder sb = new StringBuilder()
         var tempText = text
@@ -279,17 +298,17 @@ abstract class BaseTemplate {
         var StringBuilder lineBuilder = new StringBuilder();
         var boolean isFirstElementOnNewLineEmptyChar = false;
 
-        formattedText = formattedText.encodeJavadocSymbols
+        formattedText = encodeJavadocSymbols(formattedText)
         formattedText = NL_MATCHER.removeFrom(formattedText)
         formattedText = TAB_MATCHER.removeFrom(formattedText)
         formattedText = SPACES_PATTERN.matcher(formattedText).replaceAll(" ")
 
         val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true);
 
-        while(tokenizer.hasMoreElements) {
+        while (tokenizer.hasMoreElements) {
             val nextElement = tokenizer.nextElement.toString
 
-            if(lineBuilder.length + nextElement.length > 80) {
+            if (lineBuilder.length != 0 && lineBuilder.length + nextElement.length > 80) {
                 if (lineBuilder.charAt(lineBuilder.length - 1) == ' ') {
                     lineBuilder.setLength(0)
                     lineBuilder.append(lineBuilder.substring(0, lineBuilder.length - 1))
@@ -308,7 +327,7 @@ abstract class BaseTemplate {
                 }
             }
 
-            if(isFirstElementOnNewLineEmptyChar) {
+            if (isFirstElementOnNewLineEmptyChar) {
                 isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar
             }
 
@@ -391,8 +410,8 @@ abstract class BaseTemplate {
     def protected emitConstant(Constant c) '''
         «IF c.value instanceof QName»
             «val qname = c.value as QName»
-            public static final «c.type.importedName» «c.name» = «QName.name».cachedReference(
-                «QName.name».create("«qname.namespace.toString»", "«qname.formattedRevision»", "«qname.localName»"));
+            public static final «c.type.importedName» «c.name» = «QName.name».create("«qname.namespace.toString»",
+                "«qname.formattedRevision»", "«qname.localName»").intern();
         «ELSE»
             public static final «c.type.importedName» «c.name» = «c.value»;
         «ENDIF»