*/
package org.opendaylight.mdsal.binding.java.api.generator
-import static org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
+import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
+import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.replaceAllIllegalChars
import com.google.common.base.CharMatcher
-import com.google.common.base.MoreObjects
import com.google.common.base.Splitter
import com.google.common.collect.ImmutableMap
import com.google.common.collect.Iterables
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.MethodSignature
import org.opendaylight.mdsal.binding.model.api.Restrictions
import org.opendaylight.mdsal.binding.model.api.Type
-import org.opendaylight.mdsal.binding.model.api.TypeMember
+import org.opendaylight.mdsal.binding.model.api.TypeMemberComment
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Single
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Multiple
import org.opendaylight.mdsal.binding.model.util.TypeConstants
import org.opendaylight.mdsal.binding.model.util.Types
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
-import org.opendaylight.yangtools.yang.binding.CodeHelpers
import org.opendaylight.yangtools.yang.common.QName
import org.opendaylight.yangtools.yang.common.Uint8
import org.opendaylight.yangtools.yang.common.Uint16
"_" + property.name
}
- final protected def propertyNameFromGetter(MethodSignature getter) {
- var String prefix;
- if (getter.name.startsWith(BindingMapping.BOOLEAN_GETTER_PREFIX)) {
- prefix = BindingMapping.BOOLEAN_GETTER_PREFIX
- } else if (getter.name.startsWith(BindingMapping.GETTER_PREFIX)) {
- prefix = BindingMapping.GETTER_PREFIX
- } else if (getter.name.startsWith(BindingMapping.NONNULL_PREFIX)) {
- prefix = BindingMapping.NONNULL_PREFIX
- } else {
- throw new IllegalArgumentException(getter + " is not a getter")
- }
- return getter.name.substring(prefix.length).toFirstLower;
- }
-
/**
* Template method which generates the getter method for <code>field</code>
*
* generated property with data about field which is generated as the getter method
* @return string with the getter method source code in JAVA format
*/
- protected def getterMethod(GeneratedProperty field) {
- '''
- public «field.returnType.importedName» «field.getterMethodName»() {
- «val fieldName = field.fieldName»
- «IF field.returnType.name.endsWith("[]")»
- return «fieldName» == null ? null : «fieldName».clone();
- «ELSE»
- return «fieldName»;
- «ENDIF»
- }
- '''
- }
+ protected def getterMethod(GeneratedProperty field) '''
+ «val methodName = field.getterMethodName»
+ public «field.returnType.importedName» «methodName»() {
+ «val fieldName = field.fieldName»
+ «IF field.returnType.name.endsWith("[]")»
+ return «fieldName» == null ? null : «fieldName».clone();
+ «ELSE»
+ return «fieldName»;
+ «ENDIF»
+ }
+ «IF field.returnType == Types.BOOLEAN»
+
+ @«DEPRECATED.importedName»(forRemoval = true)
+ public final «field.returnType.importedName» «BindingMapping.BOOLEAN_GETTER_PREFIX»«field.name.toFirstUpper»() {
+ return «methodName»();
+ }
+ «ENDIF»
+ '''
final protected def getterMethodName(GeneratedProperty field) {
- val prefix = if(field.returnType.equals(Types.BOOLEAN)) "is" else "get"
- return '''«prefix»«field.name.toFirstUpper»'''
+ return '''«BindingMapping.GETTER_PREFIX»«field.name.toFirstUpper»'''
}
/**
def final protected asArgumentsDeclaration(Iterable<GeneratedProperty> parameters) '''«IF !parameters.empty»«FOR parameter : parameters SEPARATOR ", "»«parameter.
returnType.importedName» «parameter.fieldName»«ENDFOR»«ENDIF»'''
+ /**
+ * Template method which generates method parameters with their types from <code>parameters</code>, annotating them
+ * with {@link NonNull}.
+ *
+ * @param parameters group of generated property instances which are transformed to the method parameters
+ * @return string with the list of the method parameters with their types in JAVA format
+ */
+ def final protected asNonNullArgumentsDeclaration(Iterable<GeneratedProperty> parameters) '''«IF !parameters.empty»
+ «FOR parameter : parameters SEPARATOR ", "»«parameter.returnType.importedNonNull» «parameter
+ .fieldName»«ENDFOR»«ENDIF»'''
+
/**
* Template method which generates sequence of the names of the class attributes from <code>parameters</code>.
*
* @param comment string with the comment for whole JAVA class
* @return string with comment in JAVA format
*/
- def protected CharSequence asJavadoc(String comment) {
+ def final protected asJavadoc(TypeMemberComment comment) {
if (comment === null) {
return ''
}
- return '''
- «wrapToDocumentation(formatToParagraph(comment.trim))»
- '''
+ return wrapToDocumentation('''
+ «comment.contractDescription»
+
+ «comment.referenceDescription.formatReference»
+
+ «comment.typeSignature»
+ ''')
}
def static String wrapToDocumentation(String text) {
if (node instanceof SchemaNode) {
sb.append("The schema path to identify an instance is\n")
.append("<i>")
- .append(formatSchemaPath(def.module.argument, node.path.pathFromRoot))
+ .append(formatSchemaPath(def.module.argument.localName, node.path.pathFromRoot))
.append("</i>\n")
if (hasBuilderClass(node)) {
def private static void appendYangSnippet(StringBuilder sb, ModuleEffectiveStatement module,
DeclaredStatement<?> stmt) {
for (String str : YANG_FORMATTER.toYangTextSnippet(module, stmt)) {
- sb.append(encodeAngleBrackets(encodeJavadocSymbols(str)))
+ sb.append(str.encodeJavadocSymbols.encodeAngleBrackets.replaceAllIllegalChars)
}
}
return sb.toString();
}
- def protected static 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 static formatReference(String reference) '''
+ «IF reference !== null»
+ <pre>
+ <code>
+ «reference.encodeAngleBrackets.formatToParagraph»
+ </code>
+ </pre>
- def asCode(String text) {
- return "<code>" + text + "</code>"
- }
+ «ENDIF»
+ '''
def asLink(String text) {
val StringBuilder sb = new StringBuilder()
return sb.toString
}
- protected static def formatToParagraph(String text) {
- if(text === null || text.isEmpty)
- return text
-
- var formattedText = text
+ protected static def formatToParagraph(String inputText) {
val StringBuilder sb = new StringBuilder();
var StringBuilder lineBuilder = new StringBuilder();
var boolean isFirstElementOnNewLineEmptyChar = false;
- formattedText = encodeJavadocSymbols(formattedText)
- formattedText = WS_MATCHER.replaceFrom(formattedText, SPACE)
+ var formattedText = WS_MATCHER.replaceFrom(inputText.encodeJavadocSymbols, SPACE)
formattedText = SPACES_PATTERN.matcher(formattedText).replaceAll(" ")
- val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true);
-
+ val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true)
while (tokenizer.hasMoreTokens) {
val nextElement = tokenizer.nextToken
isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar;
}
}
-
if (isFirstElementOnNewLineEmptyChar) {
isFirstElementOnNewLineEmptyChar = !isFirstElementOnNewLineEmptyChar
} else {
return sb.append(lineBuilder).append(NEW_LINE).toString
}
- def protected generateToString(Collection<GeneratedProperty> properties) '''
- «IF !properties.empty»
- @«Override.importedName»
- public «String.importedName» toString() {
- final «MoreObjects.importedName».ToStringHelper helper = «MoreObjects.importedName».toStringHelper(«type.importedName».class);
- «FOR property : properties»
- «CodeHelpers.importedName».appendValue(helper, "«property.fieldName»", «property.fieldName»);
- «ENDFOR»
- return helper.toString();
- }
- «ENDIF»
- '''
-
/**
* Template method which generates method parameters with their types from <code>parameters</code>.
*
«FOR currentConstant : type.getConstantDefinitions»
«IF currentConstant.getName.startsWith(TypeConstants.PATTERN_CONSTANT_NAME)
&& fieldUpperCase.equals(currentConstant.getName.substring(TypeConstants.PATTERN_CONSTANT_NAME.length))»
- «CodeHelpers.importedName».checkPattern(value, «Constants.MEMBER_PATTERN_LIST»«fieldName», «Constants.MEMBER_REGEX_LIST»«fieldName»);
+ «CODEHELPERS.importedName».checkPattern(value, «Constants.MEMBER_PATTERN_LIST»«fieldName», «Constants.MEMBER_REGEX_LIST»«fieldName»);
«ENDIF»
«ENDFOR»
'''
- def protected hashCodeResult(Collection<GeneratedProperty> properties) '''
+ def protected hashCodeResult(Collection<? extends GeneratedProperty> properties) '''
final int prime = 31;
int result = 1;
«FOR property : properties»