BUG-6315: use plugin-provided path resolution 21/52221/5
authorRobert Varga <rovarga@cisco.com>
Thu, 23 Feb 2017 16:38:51 +0000 (17:38 +0100)
committerRobert Varga <nite@hq.sk>
Mon, 27 Feb 2017 13:08:33 +0000 (13:08 +0000)
Rather than relying on SourceStreamAware, make sure we use
the resolver provided by the plugin.

Change-Id: Ia5ec8a739e10bb262f68b2838958d5111e538263
Signed-off-by: Robert Varga <rovarga@cisco.com>
binding/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/YangModuleInfoTemplate.xtend

index 6d7b125749432b06bdccc2d7e008056e1e6e36de..d6077e95147baf6dea23bf38f9f3927487bdd121 100644 (file)
@@ -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<File> generateSources(final SchemaContext context, final File outputDir,
-            final Set<Module> yangModules) throws IOException {
+            final Set<Module> yangModules, final Function<Module, Optional<String>> moduleResourcePathResolver)
+                    throws IOException {
         final File outputBaseDir;
 
         outputBaseDir = outputDir == null ? getDefaultOutputBaseDir() : outputDir;
@@ -73,18 +76,19 @@ public final class CodeGeneratorImpl implements BasicCodeGenerator, BuildContext
 
         List<File> result = generator.generateToFile(outputBaseDir, persistentSourcesDir);
 
-        result.addAll(generateModuleInfos(outputBaseDir, yangModules, context));
+        result.addAll(generateModuleInfos(outputBaseDir, yangModules, context, moduleResourcePathResolver));
         return result;
     }
 
     private Collection<? extends File> generateModuleInfos(final File outputBaseDir, final Set<Module> yangModules,
-                                                           final SchemaContext context) {
+            final SchemaContext context, final Function<Module, Optional<String>> moduleResourcePathResolver) {
         Builder<File> result = ImmutableSet.builder();
         Builder<String> bindingProviders = ImmutableSet.builder();
         for (Module module : yangModules) {
             Builder<String> currentProvidersBuilder = ImmutableSet.builder();
             // TODO: do not mutate parameters, output of a method is defined by its return value
-            Set<File> moduleInfoProviders = generateYangModuleInfo(outputBaseDir, module, context, currentProvidersBuilder);
+            Set<File> moduleInfoProviders = generateYangModuleInfo(outputBaseDir, module, context,
+                moduleResourcePathResolver, currentProvidersBuilder);
             ImmutableSet<String> 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<File> generateYangModuleInfo(final File outputBaseDir, final Module module, final SchemaContext ctx,
+            final Function<Module, Optional<String>> moduleResourcePathResolver,
             final Builder<String> providerSourceSet) {
         Builder<File> generatedFiles = ImmutableSet.<File> 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<File> generateSources(final SchemaContext context, final File outputBaseDir, final Set<Module> currentModules)
+            throws IOException {
+        return generateSources(context, outputBaseDir, currentModules,
+            m -> Optional.of("/" + m.getModuleSourcePath().replace(File.separator, "/")));
+    }
+
 }
index cad96c65abdbdeac5a2387f674ca194b47a2350b..eaecfd41ee864ffd3dc0cb59fa20fc099177d214 100644 (file)
@@ -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<String, String> importMap = new LinkedHashMap()
+    val Function<Module, Optional<String>> 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<Module, Optional<String>> 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»<YangModuleInfo> 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»<YangModuleInfo> importedModules;