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;
@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;
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);
}
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!");
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, "/")));
+ }
+
}
*/
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
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;
@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»''';
}
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;
'''
- 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() '''
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;