Code generator prototype - Binding specification v2 15/55815/1
authorMartin Ciglan <mciglan@cisco.com>
Fri, 21 Apr 2017 09:32:43 +0000 (11:32 +0200)
committerRobert Varga <nite@hq.sk>
Fri, 21 Apr 2017 13:04:41 +0000 (13:04 +0000)
- fixes all YangModuleInfo related stuff to make
generated code compilable

Change-Id: If33eb32af3540ade129d75cdca41b6a8eb62b97f
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
(cherry picked from commit 4060292325da1f053490b7bf0003427c58ee0b80)

binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/YangModuleInfoTemplateRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java
binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt
binding2/mdsal-binding2-maven-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/javav2/maven/api/gen/plugin/CodeGeneratorImpl.java

index 4e3f50b8ab40dfa268c94650196f697013f20795..66dd4d327ccaa9dc9a0441f77501e5661e04f1dc 100644 (file)
@@ -202,8 +202,8 @@ public final class JavaIdentifierNormalizer {
     private static final String RESERVED_KEYWORD = "reserved_keyword";
     private static final ListMultimap<String, String> PACKAGES_MAP = ArrayListMultimap.create();
     public static final Set<String> SPECIAL_RESERVED_PATHS =
-            ImmutableSet.of("org.opendaylight.yangtools.yang.common", "org.opendaylight.mdsal.binding.javav2.spec",
-                    "java", "com");
+            ImmutableSet.of("org.opendaylight.yangtools.yang.model","org.opendaylight.yangtools.concepts","org.opendaylight.yangtools.yang.common",
+                    "org.opendaylight.mdsal.binding.javav2.spec","java", "com");
 
     private JavaIdentifierNormalizer() {
         throw new UnsupportedOperationException("Util class");
index fda8f071c0c29026ffeb3f5372f7672540e70165..0d58154f199543a9fde6d13e862ace6f6d81969d 100644 (file)
@@ -8,9 +8,11 @@
 
 package org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers;
 
+import static org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer.normalizeFullPackageName;
 import static org.opendaylight.mdsal.binding.javav2.util.BindingMapping.MODEL_BINDING_PROVIDER_CLASS_NAME;
 import static org.opendaylight.mdsal.binding.javav2.util.BindingMapping.getRootPackageName;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
@@ -20,7 +22,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.function.Function;
@@ -32,8 +33,10 @@ import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.model.api.WildcardType;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.YangModelBindingProvider;
 import org.opendaylight.mdsal.binding.javav2.spec.runtime.YangModuleInfo;
+import org.opendaylight.yangtools.concepts.SemVer;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation;
 
 public class YangModuleInfoTemplateRenderer {
 
@@ -42,15 +45,15 @@ public class YangModuleInfoTemplateRenderer {
     private final Map<String, String> importMap = new HashMap<>();
     private final String packageName;
     private final String modelBindingProviderName;
-    private final Function<Module, Optional<String>> moduleFilePathResolver;
+    private final Function<Module, java.util.Optional<String>> moduleFilePathResolver;
 
-
-    public YangModuleInfoTemplateRenderer(final Module module, final SchemaContext ctx, final Function<Module, Optional<String>> moduleFilePathResolver) {
+    public YangModuleInfoTemplateRenderer(final Module module, final SchemaContext ctx, final Function<Module,
+            java.util.Optional<String>> moduleFilePathResolver) {
 
         Preconditions.checkArgument(module != null, "Module must not be null.");
         this.module = module;
         this.ctx = ctx;
-        this.packageName = getRootPackageName(module);
+        this.packageName = normalizeFullPackageName(getRootPackageName(module));
         this.moduleFilePathResolver = moduleFilePathResolver;
 
         final StringBuilder sb = new StringBuilder();
@@ -75,12 +78,15 @@ public class YangModuleInfoTemplateRenderer {
         importedNames.put("inputStream", importedName(InputStream.class));
         importedNames.put("iOException", importedName(IOException.class));
         importedNames.put("yangModuleInfo", importedName(YangModuleInfo.class));
+        importedNames.put("optional", importedName(Optional.class));
+        importedNames.put("semVer", importedName(SemVer.class));
+        importedNames.put("schemaSourceRepresentation", importedName(SchemaSourceRepresentation.class));
 
         return yangModuleInfoTemplate.render(module, ctx, importedNames).body();
     }
 
     /**
-     * builds template
+     * Builds template
      * @return generated final template
      */
     public String generateTemplate() {
@@ -89,7 +95,7 @@ public class YangModuleInfoTemplateRenderer {
         final String templateBody = body();
         sb.append("package ")
             .append(packageName)
-            .append(";\n")
+            .append(";\n\n")
             .append(imports())
             .append(templateBody);
         return sb.toString();
@@ -101,7 +107,7 @@ public class YangModuleInfoTemplateRenderer {
     }
 
     /**
-     * walks through map of imports
+     * Walks through map of imports
      * @return string of imports for template
      */
     private String imports() {
index c421b5de37dc38deea89f0a959c64e0849a8337a..2ea7eb27f0e6dc9c284e0ac67d8214f5ad413c79 100644 (file)
@@ -30,7 +30,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.TypeMember;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.model.api.Module;
 
-public class TextTemplateUtil {
+public final class TextTemplateUtil {
 
     public static final String DOT = ".";
     public static final String PATTERN_CONSTANT_NAME = "PATTERN_CONSTANTS";
@@ -46,7 +46,7 @@ public class TextTemplateUtil {
     private static final Splitter NL_SPLITTER = Splitter.on(NL_MATCHER);
 
     private TextTemplateUtil() {
-        throw new AssertionError("Instantiating utility class.");
+        throw new UnsupportedOperationException("Util class");
     }
 
     /**
index 94908b76cf3ed53977b8c72c40958de8d426e0ab..f212792e6a106a895503c560a6078e99b78551ac 100644 (file)
@@ -8,6 +8,7 @@
 
 @import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier.CLASS
 @import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer.normalizeSpecificIdentifier
+@import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer.normalizeFullPackageName
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil.getFormattedRevision
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.util.TextTemplateUtil.getSourcePath
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers.YangModuleInfoTemplateRenderer.getSortedQName
@@ -24,6 +25,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
 
     private final @{importedNames.get("string")} name = "@{module.getName}";
     private final @{importedNames.get("string")} namespace = "@{module.getNamespace.toString}";
+    private final @{importedNames.get("string")} semanticVersion = "@{module.getSemanticVersion}";
     private final @{importedNames.get("string")} revision = "@{getFormattedRevision(module.getRevision)}";
     private final @{importedNames.get("string")} resourcePath = "@{getSourcePath(module)}";
     private final @{importedNames.get("set")}<YangModuleInfo> importedModules;
@@ -43,6 +45,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
         private static final @{importedNames.get("yangModuleInfo")} INSTANCE = new @{normalizeSpecificIdentifier(submodule.getName, CLASS)}Info();
 
         private final @{importedNames.get("string")} name = "@{submodule.getName}";
+        private final @{importedNames.get("string")} semanticVersion = "@{submodule.getSemanticVersion}";
         private final @{importedNames.get("string")} namespace = "@{submodule.getNamespace.toString}";
         private final @{importedNames.get("string")} revision = "@{getFormattedRevision(submodule.getRevision)}";
         private final @{importedNames.get("string")} resourcePath = "@{getSourcePath(submodule)}";
@@ -65,9 +68,11 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
         @if(!module.getImports.isEmpty) {
             @for(moduleImport <- module.getImports) {
                 @if(moduleImport.getRevision == null) {
-                    set.add(@{getRootPackageName(getSortedQName(ctx.getModules, moduleImport.getModuleName))}.@{MODULE_INFO_CLASS_NAME}.getInstance());
+                    set.add(@{normalizeFullPackageName(getRootPackageName(getSortedQName(ctx.getModules, moduleImport
+                    .getModuleName)))}.@{MODULE_INFO_CLASS_NAME}.getInstance());
                 } else {
-                    set.add(@{getRootPackageName(ctx.findModuleByName(moduleImport.getModuleName, moduleImport.getRevision))}.@{MODULE_INFO_CLASS_NAME}.getInstance());
+                    set.add(@{normalizeFullPackageName(getRootPackageName(ctx.findModuleByName(moduleImport
+                    .getModuleName, moduleImport.getRevision)))}.@{MODULE_INFO_CLASS_NAME}.getInstance());
                 }
             }
         }
@@ -76,7 +81,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
                 set.add(@{normalizeSpecificIdentifier(submodule.getName, CLASS)}Info.getInstance());
             }
         }
-        @if(!module.getImports.isEmpty && !module.getSubmodules.isEmpty) {
+        @if(module.getImports.isEmpty && module.getSubmodules.isEmpty) {
             importedModules = @{importedNames.get("collections")}.emptySet();
         } else {
             importedModules = @{importedNames.get("immutableSet")}.copyOf(set);
@@ -109,16 +114,18 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
     }
 
     @@Override
-    public @{importedNames.get("inputStream")} getModuleSourceStream() throws IOException {
-        @{importedNames.get("inputStream")} stream = @{MODULE_INFO_CLASS_NAME}.class.getResourceAsStream(resourcePath);
-        if (stream == null) {
-            throw new @{importedNames.get("iOException")}("Resource " + resourcePath + " is missing");
-        }
-        return stream;
+    public @{importedNames.get("optional")}<@{importedNames.get("semVer")}> getSemanticVersion() {
+        return Optional.of(@{importedNames.get("semVer")}.valueOf(semanticVersion));
+    }
+
+    @@Override
+    public @{importedNames.get("schemaSourceRepresentation")} getModuleSourceRepresentation() {
+        //TODO implement
+        return null;
     }
 
     @@Override
-    public @{importedNames.get("set")}<@{importedNames.get("YangModuleInfo")}> getImportedModules() {
+    public @{importedNames.get("set")}<@{importedNames.get("yangModuleInfo")}> getImportedModules() {
         return importedModules;
     }
 
@@ -128,6 +135,7 @@ public final class @{MODULE_INFO_CLASS_NAME} implements @{importedNames.get("yan
         sb.append("[");
         sb.append("name = " + name);
         sb.append(", namespace = " + namespace);
+        sb.append(", semanticVersion = " + semanticVersion);
         sb.append(", revision = " + revision);
         sb.append(", resourcePath = " + resourcePath);
         sb.append(", imports = " + importedModules);
index d57917fa689342877f6327dce8315bea17bb14a4..9b2a2caeb0dcdd9bbed9fd8a450cbc625a7ce267 100644 (file)
@@ -8,6 +8,9 @@
 
 package org.opendaylight.mdsal.binding.javav2.maven.api.gen.plugin;
 
+import static org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer.normalizeFullPackageName;
+import static org.opendaylight.mdsal.binding.javav2.util.BindingMapping.getRootPackageName;
+
 import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -160,7 +163,7 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext
         String providerSource = template.generateModelProvider();
 
         final File packageDir = GeneratorJavaFile.packageToDirectory(outputBaseDir,
-                BindingMapping.getRootPackageName(module));
+                normalizeFullPackageName(getRootPackageName(module)));
 
         generatedFiles.add(writeJavaSource(packageDir, BindingMapping.MODULE_INFO_CLASS_NAME, moduleInfoSource));
         generatedFiles