Bump upstreams
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / YangModuleInfoTemplate.xtend
index c6840aa3ccc9adcf95be0f58cf956bd506c56c20..f355724d6790564a6326d9cc99ff8beed26d7ab9 100644 (file)
@@ -7,11 +7,12 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator
 
-import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.getClassName
-import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.getRootPackageName
-import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.MODEL_BINDING_PROVIDER_CLASS_NAME
-import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.MODULE_INFO_CLASS_NAME
-import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.MODULE_INFO_QNAMEOF_METHOD_NAME
+import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.getClassName
+import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.getServicePackageName
+import static org.opendaylight.yangtools.yang.binding.contract.Naming.MODEL_BINDING_PROVIDER_CLASS_NAME
+import static org.opendaylight.yangtools.yang.binding.contract.Naming.MODULE_INFO_CLASS_NAME
+import static org.opendaylight.yangtools.yang.binding.contract.Naming.MODULE_INFO_QNAMEOF_METHOD_NAME
+import static org.opendaylight.yangtools.yang.binding.contract.Naming.MODULE_INFO_YANGDATANAMEOF_METHOD_NAME
 
 import com.google.common.base.Preconditions
 import com.google.common.collect.ImmutableSet
@@ -22,6 +23,7 @@ import java.util.Set
 import java.util.TreeMap
 import java.util.function.Function
 import org.eclipse.xtend.lib.annotations.Accessors
+import org.opendaylight.yangtools.rfc8040.model.api.YangDataSchemaNode
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo
 import org.opendaylight.yangtools.yang.common.Revision
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext
@@ -64,6 +66,7 @@ final class YangModuleInfoTemplate {
     val Module module
     val EffectiveModelContext ctx
     val Function<ModuleLike, Optional<String>> moduleFilePathResolver
+    val boolean hasYangData
 
     var importedTypes = CORE_IMPORT_STR
 
@@ -78,8 +81,9 @@ final class YangModuleInfoTemplate {
         this.module = module
         this.ctx = ctx
         this.moduleFilePathResolver = moduleFilePathResolver
-        packageName = module.QNameModule.rootPackageName;
+        packageName = module.QNameModule.getServicePackageName;
         modelBindingProviderName = '''«packageName».«MODEL_BINDING_PROVIDER_CLASS_NAME»'''
+        hasYangData = module.unknownSchemaNodes.stream.anyMatch([s | s instanceof YangDataSchemaNode])
     }
 
     def String generate() {
@@ -93,7 +97,7 @@ final class YangModuleInfoTemplate {
             @«JavaFileTemplate.GENERATED»("mdsal-binding-generator")
             public final class «MODULE_INFO_CLASS_NAME» extends ResourceYangModuleInfo {
                 «val rev = module.revision»
-                private static final @NonNull QName NAME = QName.create("«module.QNameModule.namespace.toString»", «IF rev.present»"«rev.get.toString»", «ENDIF»"«module.name»").intern();
+                private static final @NonNull QName NAME = QName.create("«module.QNameModule.namespace().toString»", «IF rev.present»"«rev.orElseThrow.toString»", «ENDIF»"«module.name»").intern();
                 private static final @NonNull YangModuleInfo INSTANCE = new «MODULE_INFO_CLASS_NAME»();
 
                 private final @NonNull ImmutableSet<YangModuleInfo> importedModules;
@@ -113,12 +117,27 @@ final class YangModuleInfoTemplate {
                  *
                  * @param localName local name
                  * @return A QName
-                 * @throws NullPointerException if {@code localName} is null
-                 * @throws IllegalArgumentException if localName is not a valid YANG identifier
+                 * @throws NullPointerException if {@code localName} is {@code null}
+                 * @throws IllegalArgumentException if {@code localName} is not a valid YANG identifier
                  */
                 public static @NonNull QName «MODULE_INFO_QNAMEOF_METHOD_NAME»(final String localName) {
                     return QName.create(NAME, localName).intern();
                 }
+            «IF hasYangData»
+
+                /**
+                 * Create an interned {@link YangDataName} with specified {@code templateName} and namespace/revision of
+                 * this module.
+                 *
+                 * @param templateName template name
+                 * @return A YangDataName
+                 * @throws NullPointerException if {@code templateName} is {@code null}
+                 * @throws IllegalArgumentException if {@code templateName} is empty
+                 */
+                public static @NonNull YangDataName «MODULE_INFO_YANGDATANAMEOF_METHOD_NAME»(final String templateName) {
+                    return new YangDataName(NAME.getModule(), templateName).intern();
+                }
+            «ENDIF»
 
                 «classBody(module, MODULE_INFO_CLASS_NAME, submodules)»
             }
@@ -127,6 +146,9 @@ final class YangModuleInfoTemplate {
             package «packageName»;
 
             «importedTypes»
+            «IF hasYangData»
+            import org.opendaylight.yangtools.yang.common.YangDataName;
+            «ENDIF»
 
             «body»
         '''.toString
@@ -178,16 +200,16 @@ final class YangModuleInfoTemplate {
                 «FOR imp : m.imports»
                     «val name = imp.moduleName.localName»
                     «val rev = imp.revision»
-                    «IF !rev.present»
+                    «IF rev.empty»
                         «val TreeMap<Optional<Revision>, Module> sorted = new TreeMap(REVISION_COMPARATOR)»
                         «FOR module : ctx.modules»
                             «IF name.equals(module.name)»
                                 «sorted.put(module.revision, module)»
                             «ENDIF»
                         «ENDFOR»
-                        set.add(«sorted.lastEntry().value.QNameModule.rootPackageName».«MODULE_INFO_CLASS_NAME».getInstance());
+                        set.add(«sorted.lastEntry().value.QNameModule.getServicePackageName».«MODULE_INFO_CLASS_NAME».getInstance());
                     «ELSE»
-                        set.add(«(ctx.findModule(name, rev).orElseThrow.QNameModule).rootPackageName».«MODULE_INFO_CLASS_NAME».getInstance());
+                        set.add(«(ctx.findModule(name, rev).orElseThrow.QNameModule).getServicePackageName».«MODULE_INFO_CLASS_NAME».getInstance());
                     «ENDIF»
                 «ENDFOR»
             «ENDIF»
@@ -225,7 +247,7 @@ final class YangModuleInfoTemplate {
     private def sourcePath(ModuleLike module) {
         val opt = moduleFilePathResolver.apply(module)
         Preconditions.checkState(opt.isPresent, "Module %s does not have a file path", module)
-        return opt.get
+        return opt.orElseThrow
     }
 
     private def generateSubInfo(Set<Submodule> submodules) '''
@@ -234,8 +256,8 @@ final class YangModuleInfoTemplate {
 
             private static final class «className»Info extends ResourceYangModuleInfo {
                 «val rev = submodule.revision»
-                private final @NonNull QName NAME = QName.create("«submodule.QNameModule.namespace.toString»", «
-                IF rev.present»"«rev.get.toString»", «ENDIF»"«submodule.name»").intern();
+                private final @NonNull QName NAME = QName.create("«submodule.QNameModule.namespace().toString»", «
+                IF rev.present»"«rev.orElseThrow.toString»", «ENDIF»"«submodule.name»").intern();
                 private static final @NonNull YangModuleInfo INSTANCE = new «className»Info();
 
                 private final @NonNull ImmutableSet<YangModuleInfo> importedModules;