From 10a278e99ab4365cacdce5a17657cff7e4e59ec5 Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Fri, 21 Apr 2017 11:32:43 +0200 Subject: [PATCH] Code generator prototype - Binding specification v2 - fixes all YangModuleInfo related stuff to make generated code compilable Change-Id: If33eb32af3540ade129d75cdca41b6a8eb62b97f Signed-off-by: Martin Ciglan (cherry picked from commit 4060292325da1f053490b7bf0003427c58ee0b80) --- .../util/JavaIdentifierNormalizer.java | 4 +-- .../YangModuleInfoTemplateRenderer.java | 22 +++++++++------ .../api/generator/util/TextTemplateUtil.java | 4 +-- .../yangModuleInfoTemplate.scala.txt | 28 ++++++++++++------- .../api/gen/plugin/CodeGeneratorImpl.java | 5 +++- 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java index 4e3f50b8ab..66dd4d327c 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java @@ -202,8 +202,8 @@ public final class JavaIdentifierNormalizer { private static final String RESERVED_KEYWORD = "reserved_keyword"; private static final ListMultimap PACKAGES_MAP = ArrayListMultimap.create(); public static final Set 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"); diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/YangModuleInfoTemplateRenderer.java b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/YangModuleInfoTemplateRenderer.java index fda8f071c0..0d58154f19 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/YangModuleInfoTemplateRenderer.java +++ b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/YangModuleInfoTemplateRenderer.java @@ -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 importMap = new HashMap<>(); private final String packageName; private final String modelBindingProviderName; - private final Function> moduleFilePathResolver; + private final Function> moduleFilePathResolver; - - public YangModuleInfoTemplateRenderer(final Module module, final SchemaContext ctx, final Function> moduleFilePathResolver) { + public YangModuleInfoTemplateRenderer(final Module module, final SchemaContext ctx, final Function> 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() { diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java index c421b5de37..2ea7eb27f0 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java +++ b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java @@ -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"); } /** diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt index 94908b76cf..f212792e6a 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt +++ b/binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/yangModuleInfoTemplate.scala.txt @@ -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")} 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); diff --git a/binding2/mdsal-binding2-maven-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/javav2/maven/api/gen/plugin/CodeGeneratorImpl.java b/binding2/mdsal-binding2-maven-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/javav2/maven/api/gen/plugin/CodeGeneratorImpl.java index d57917fa68..9b2a2caeb0 100644 --- a/binding2/mdsal-binding2-maven-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/javav2/maven/api/gen/plugin/CodeGeneratorImpl.java +++ b/binding2/mdsal-binding2-maven-api-gen-plugin/src/main/java/org/opendaylight/mdsal/binding/javav2/maven/api/gen/plugin/CodeGeneratorImpl.java @@ -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 -- 2.36.6