From 1126e263d9e40c0f558b18b9f40a926609be2383 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 23 Feb 2017 17:38:51 +0100 Subject: [PATCH] BUG-6315: use plugin-provided path resolution Rather than relying on SourceStreamAware, make sure we use the resolver provided by the plugin. Change-Id: Ia5ec8a739e10bb262f68b2838958d5111e538263 Signed-off-by: Robert Varga --- .../sal/api/gen/plugin/CodeGeneratorImpl.java | 22 ++++++++++--- .../generator/YangModuleInfoTemplate.xtend | 33 +++++++++++-------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java b/binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java index 6d7b125749..d6077e9514 100644 --- a/binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java +++ b/binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java @@ -21,7 +21,9 @@ import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; +import java.util.function.Function; import org.apache.maven.project.MavenProject; import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.sal.binding.generator.api.BindingGenerator; @@ -51,7 +53,8 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext @Override public Collection generateSources(final SchemaContext context, final File outputDir, - final Set yangModules) throws IOException { + final Set yangModules, final Function> moduleResourcePathResolver) + throws IOException { final File outputBaseDir; outputBaseDir = outputDir == null ? getDefaultOutputBaseDir() : outputDir; @@ -73,18 +76,19 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext List result = generator.generateToFile(outputBaseDir, persistentSourcesDir); - result.addAll(generateModuleInfos(outputBaseDir, yangModules, context)); + result.addAll(generateModuleInfos(outputBaseDir, yangModules, context, moduleResourcePathResolver)); return result; } private Collection generateModuleInfos(final File outputBaseDir, final Set yangModules, - final SchemaContext context) { + final SchemaContext context, final Function> moduleResourcePathResolver) { Builder result = ImmutableSet.builder(); Builder bindingProviders = ImmutableSet.builder(); for (Module module : yangModules) { Builder currentProvidersBuilder = ImmutableSet.builder(); // TODO: do not mutate parameters, output of a method is defined by its return value - Set moduleInfoProviders = generateYangModuleInfo(outputBaseDir, module, context, currentProvidersBuilder); + Set moduleInfoProviders = generateYangModuleInfo(outputBaseDir, module, context, + moduleResourcePathResolver, currentProvidersBuilder); ImmutableSet currentProviders = currentProvidersBuilder.build(); LOG.info("Adding ModuleInfo providers {}", currentProviders); bindingProviders.addAll(currentProviders); @@ -144,10 +148,11 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext } private Set generateYangModuleInfo(final File outputBaseDir, final Module module, final SchemaContext ctx, + final Function> moduleResourcePathResolver, final Builder providerSourceSet) { Builder generatedFiles = ImmutableSet. builder(); - final YangModuleInfoTemplate template = new YangModuleInfoTemplate(module, ctx); + final YangModuleInfoTemplate template = new YangModuleInfoTemplate(module, ctx, moduleResourcePathResolver); String moduleInfoSource = template.generate(); if (moduleInfoSource.isEmpty()) { throw new IllegalStateException("Generated code should not be empty!"); @@ -190,4 +195,11 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext return file; } + @Override + public Collection generateSources(final SchemaContext context, final File outputBaseDir, final Set currentModules) + throws IOException { + return generateSources(context, outputBaseDir, currentModules, + m -> Optional.of("/" + m.getModuleSourcePath().replace(File.separator, "/"))); + } + } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/YangModuleInfoTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/YangModuleInfoTemplate.xtend index cad96c65ab..eaecfd41ee 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/YangModuleInfoTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/YangModuleInfoTemplate.xtend @@ -7,11 +7,18 @@ */ package org.opendaylight.yangtools.sal.java.api.generator +import static org.opendaylight.yangtools.yang.binding.BindingMapping.getClassName +import static org.opendaylight.yangtools.yang.binding.BindingMapping.getRootPackageName +import static org.opendaylight.yangtools.yang.binding.BindingMapping.MODEL_BINDING_PROVIDER_CLASS_NAME +import static org.opendaylight.yangtools.yang.binding.BindingMapping.MODULE_INFO_CLASS_NAME + +import com.google.common.base.Preconditions +import com.google.common.collect.ImmutableSet import java.io.InputStream import java.io.IOException import java.text.DateFormat import java.text.SimpleDateFormat - +import java.util.Optional import java.util.Collections import java.util.Date import java.util.HashSet @@ -19,25 +26,22 @@ import java.util.LinkedHashMap import java.util.Map import java.util.Set import java.util.TreeMap - +import java.util.function.Function import org.opendaylight.yangtools.binding.generator.util.Types import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType import org.opendaylight.yangtools.sal.binding.model.api.Type import org.opendaylight.yangtools.sal.binding.model.api.WildcardType import org.opendaylight.yangtools.yang.binding.YangModuleInfo +import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider import org.opendaylight.yangtools.yang.model.api.Module import org.opendaylight.yangtools.yang.model.api.SchemaContext -import com.google.common.collect.ImmutableSet -import static org.opendaylight.yangtools.yang.binding.BindingMapping.* -import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider -import com.google.common.base.Preconditions - class YangModuleInfoTemplate { val Module module val SchemaContext ctx val Map importMap = new LinkedHashMap() + val Function> moduleFilePathResolver @Property val String packageName; @@ -45,10 +49,11 @@ class YangModuleInfoTemplate { @Property val String modelBindingProviderName; - new(Module module, SchemaContext ctx) { - Preconditions.checkArgument(module != null, "Module must not be null."); + new(Module module, SchemaContext ctx, Function> moduleFilePathResolver) { + Preconditions.checkArgument(module !== null, "Module must not be null."); this.module = module this.ctx = ctx + this.moduleFilePathResolver = moduleFilePathResolver _packageName = getRootPackageName(module.getQNameModule()); _modelBindingProviderName = '''«packageName».«MODEL_BINDING_PROVIDER_CLASS_NAME»'''; } @@ -63,7 +68,7 @@ class YangModuleInfoTemplate { private final «String.importedName» namespace = "«module.namespace.toString»"; «val DateFormat df = new SimpleDateFormat("yyyy-MM-dd")» private final «String.importedName» revision = "«df.format(module.revision)»"; - private final «String.importedName» resourcePath = "«sourcePath»"; + private final «String.importedName» resourcePath = "«sourcePath(module)»"; private final «Set.importedName» importedModules; @@ -186,8 +191,10 @@ class YangModuleInfoTemplate { ''' - def getSourcePath() { - return "/" + module.moduleSourcePath.replace(java.io.File.separatorChar, '/') + private def sourcePath(Module module) { + val opt = moduleFilePathResolver.apply(module) + Preconditions.checkState(opt.isPresent, "Module %s does not have a file path", module) + return opt.get } private def imports() ''' @@ -302,7 +309,7 @@ class YangModuleInfoTemplate { private final «String.importedName» namespace = "«submodule.namespace.toString»"; «val DateFormat df = new SimpleDateFormat("yyyy-MM-dd")» private final «String.importedName» revision = "«df.format(submodule.revision)»"; - private final «String.importedName» resourcePath = "/«submodule.moduleSourcePath.replace(java.io.File.separatorChar, '/')»"; + private final «String.importedName» resourcePath = "«sourcePath(submodule)»"; private final «Set.importedName» importedModules; -- 2.36.6