*/
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 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
-import com.google.common.collect.Iterables
import java.util.Collection
import java.util.List
import java.util.Locale
import org.opendaylight.mdsal.binding.model.api.Restrictions
import org.opendaylight.mdsal.binding.model.api.Type
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.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
+import org.opendaylight.yangtools.yang.binding.BaseIdentity
@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();
new(GeneratedType type) {
super(type)
'''.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.localName).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>
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
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.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»
+ && «typeName».class.equals(((«typeName») obj).«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»