*/
package org.opendaylight.mdsal.binding.java.api.generator
-import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.encodeAngleBrackets
-import static extension org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil.replaceAllIllegalChars
+import static extension org.opendaylight.mdsal.binding.generator.BindingGeneratorUtil.encodeAngleBrackets
import com.google.common.base.CharMatcher
import com.google.common.base.Splitter
-import com.google.common.collect.ImmutableMap
-import com.google.common.collect.Iterables
-import java.math.BigInteger
import java.util.Collection
import java.util.List
import java.util.Locale
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.model.ri.TypeConstants
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
-import org.opendaylight.yangtools.yang.common.QName
-import org.opendaylight.yangtools.yang.common.Uint8
-import org.opendaylight.yangtools.yang.common.Uint16
-import org.opendaylight.yangtools.yang.common.Uint32
-import org.opendaylight.yangtools.yang.common.Uint64
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition
-import org.opendaylight.yangtools.yang.model.api.SchemaNode
-import org.opendaylight.yangtools.yang.model.api.YangStmtMapping
-import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement
-import org.opendaylight.yangtools.yang.model.export.DeclaredStatementFormatter
@SuppressModernizer
abstract class BaseTemplate extends JavaFileTemplate {
static final char NEW_LINE = '\n'
static final char SPACE = ' '
- static val AMP_MATCHER = CharMatcher.is('&')
static val WS_MATCHER = CharMatcher.anyOf("\n\t")
static val SPACES_PATTERN = Pattern.compile(" +")
static val NL_SPLITTER = Splitter.on(NEW_LINE)
- static val TAIL_COMMENT_PATTERN = Pattern.compile("*/", Pattern.LITERAL);
- static val YANG_FORMATTER = DeclaredStatementFormatter.builder()
- .addIgnoredStatement(YangStmtMapping.CONTACT)
- .addIgnoredStatement(YangStmtMapping.DESCRIPTION)
- .addIgnoredStatement(YangStmtMapping.REFERENCE)
- .addIgnoredStatement(YangStmtMapping.ORGANIZATION)
- .build();
-
- protected static val UINT_TYPES = ImmutableMap.of(
- Types.typeForClass(Uint8), Types.typeForClass(Short),
- Types.typeForClass(Uint16), Types.typeForClass(Integer),
- Types.typeForClass(Uint32), Types.typeForClass(Long),
- Types.typeForClass(Uint64), Types.typeForClass(BigInteger)
- );
new(GeneratedType type) {
super(type)
"_" + property.name
}
- final protected static 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»
+ }
+ '''
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»'''
}
/**
'''.toString
}
- def static encodeJavadocSymbols(String description) {
- if (description.nullOrEmpty) {
- return description;
- }
-
- return TAIL_COMMENT_PATTERN.matcher(AMP_MATCHER.replaceFrom(description, "&")).replaceAll("*/")
- }
-
def protected String formatDataForJavaDoc(GeneratedType type, String additionalComment) {
val comment = type.comment
if (comment === null) {
'''
}
- def private static void appendSnippet(StringBuilder sb, GeneratedType type) {
- val optDef = type.yangSourceDefinition
- if (optDef.present) {
- val def = optDef.get
- sb.append(NEW_LINE)
-
- if (def instanceof Single) {
- val node = def.node
- sb.append("<p>\n")
- .append("This class represents the following YANG schema fragment defined in module <b>")
- .append(def.module.argument).append("</b>\n")
- .append("<pre>\n")
- appendYangSnippet(sb, def.module, (node as EffectiveStatement<?, ?>).declared)
- sb.append("</pre>")
-
- if (node instanceof SchemaNode) {
- sb.append("The schema path to identify an instance is\n")
- .append("<i>")
- .append(formatSchemaPath(def.module.argument.localName, node.path.pathFromRoot))
- .append("</i>\n")
-
- if (hasBuilderClass(node)) {
- val builderName = type.name + "Builder";
-
- sb.append("\n<p>To create instances of this class use {@link ").append(builderName)
- .append("}.\n")
- .append("@see ").append(builderName).append('\n')
- if (node instanceof ListSchemaNode) {
- val keyDef = node.keyDefinition
- if (keyDef !== null && !keyDef.empty) {
- sb.append("@see ").append(type.name).append("Key")
- }
- sb.append('\n');
- }
- }
- }
- } else if (def instanceof Multiple) {
- sb.append("<pre>\n")
- for (SchemaNode node : def.nodes) {
- appendYangSnippet(sb, def.module, (node as EffectiveStatement<?, ?>).declared)
- }
- sb.append("</pre>\n")
- }
- }
- }
-
- def private static void appendYangSnippet(StringBuilder sb, ModuleEffectiveStatement module,
- DeclaredStatement<?> stmt) {
- for (String str : YANG_FORMATTER.toYangTextSnippet(module, stmt)) {
- sb.append(str.encodeJavadocSymbols.encodeAngleBrackets.replaceAllIllegalChars)
- }
- }
-
- def private static boolean hasBuilderClass(SchemaNode schemaNode) {
- return schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode
- || schemaNode instanceof RpcDefinition || schemaNode instanceof NotificationDefinition;
- }
-
- def private static String formatSchemaPath(String moduleName, Iterable<QName> schemaPath) {
- val sb = new StringBuilder().append(moduleName);
-
- var currentElement = Iterables.getFirst(schemaPath, null);
- for (QName pathElement : schemaPath) {
- sb.append('/')
- if (!currentElement.namespace.equals(pathElement.namespace)) {
- currentElement = pathElement
- sb.append(pathElement)
- } else {
- sb.append(pathElement.getLocalName())
- }
- }
- return sb.toString();
- }
-
def static formatReference(String reference) '''
«IF reference !== null»
<pre>