From b55a6828f7740e29d2e87bbcf8a73867c3d4efe3 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 7 Sep 2020 11:02:42 +0200 Subject: [PATCH] Allow module to be represented in different formats We may need to allow for different source packaging. The default is YangTextSchemaSource, which we always packaged. We may introduce additional types at a later point. Change-Id: I46dcde1052c36fbc5105a320ac3ec58186d24f61 Signed-off-by: Robert Varga --- .../yang2sources/spi/BasicCodeGenerator.java | 4 +-- .../spi/ModuleResourceResolver.java | 32 +++++++++++++++++++ .../spi/CodeGeneratorTestImpl.java | 4 +-- .../yang2sources/plugin/ContextHolder.java | 26 +++++++++------ .../plugin/YangToSourcesMojo.java | 17 +++++----- .../plugin/YangToSourcesProcessor.java | 2 +- .../plugin/GenerateSourcesTest.java | 5 ++- 7 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/ModuleResourceResolver.java diff --git a/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/BasicCodeGenerator.java b/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/BasicCodeGenerator.java index d6695099ef..cac397db4d 100644 --- a/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/BasicCodeGenerator.java +++ b/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/BasicCodeGenerator.java @@ -11,9 +11,7 @@ import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Map; -import java.util.Optional; import java.util.Set; -import java.util.function.Function; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; @@ -50,7 +48,7 @@ public interface BasicCodeGenerator { * @return collection of files that were generated from schema context */ Collection generateSources(EffectiveModelContext context, File outputBaseDir, Set currentModules, - Function> moduleResourcePathResolver) throws IOException; + ModuleResourceResolver moduleResourcePathResolver) throws IOException; /** * Provided map contains all configuration that was set in pom for code diff --git a/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/ModuleResourceResolver.java b/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/ModuleResourceResolver.java new file mode 100644 index 0000000000..2162eebc3a --- /dev/null +++ b/yang/yang-maven-plugin-spi/src/main/java/org/opendaylight/yangtools/yang2sources/spi/ModuleResourceResolver.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang2sources.spi; + +import com.google.common.annotations.Beta; +import java.util.Optional; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; + +/** + * An SPI-level interface to find the schema source for a particular YANG module, as packaged in the final artifact. + * The module must be part of the current resolution context. + */ +@Beta +@FunctionalInterface +public interface ModuleResourceResolver { + /** + * Find the path of the packaged resource which corresponds to the specified module in the specified representation. + * + * @param module Requested module + * @param representation Requested representation + * @return Path to packaged resource + * @throws NullPointerException if any argument is null + * @throws IllegalArgumentException if the requested representation is not supported by this resolver + */ + Optional findModuleResourcePath(Module module, Class representation); +} diff --git a/yang/yang-maven-plugin-spi/src/test/java/org/opendaylight/yangtools/yang2sources/spi/CodeGeneratorTestImpl.java b/yang/yang-maven-plugin-spi/src/test/java/org/opendaylight/yangtools/yang2sources/spi/CodeGeneratorTestImpl.java index 1dea8426b5..bfb5abb8bb 100644 --- a/yang/yang-maven-plugin-spi/src/test/java/org/opendaylight/yangtools/yang2sources/spi/CodeGeneratorTestImpl.java +++ b/yang/yang-maven-plugin-spi/src/test/java/org/opendaylight/yangtools/yang2sources/spi/CodeGeneratorTestImpl.java @@ -11,9 +11,7 @@ import java.io.File; import java.io.IOException; import java.util.Collection; 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.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; @@ -26,7 +24,7 @@ public class CodeGeneratorTestImpl implements BasicCodeGenerator, MavenProjectAw @Override public Collection generateSources(final EffectiveModelContext context, final File outputBaseDir, - final Set currentModules, final Function> moduleResourcePathResolver) + final Set currentModules, final ModuleResourceResolver moduleResourcePathResolver) throws IOException { LOG.debug("{} generateSources:context: {}", getClass().getCanonicalName(), context); LOG.debug("{} generateSources:outputBaseDir: {}", getClass().getCanonicalName(), outputBaseDir); diff --git a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/ContextHolder.java b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/ContextHolder.java index 83d1c4c526..a26b0fec1d 100644 --- a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/ContextHolder.java +++ b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/ContextHolder.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang2sources.plugin; +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableSet; @@ -15,9 +16,12 @@ import java.util.Set; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang2sources.spi.ModuleResourceResolver; -final class ContextHolder implements Immutable { +final class ContextHolder implements Immutable, ModuleResourceResolver { private final EffectiveModelContext context; private final Set modules; private final Set sources; @@ -28,6 +32,17 @@ final class ContextHolder implements Immutable { this.sources = ImmutableSet.copyOf(sources); } + @Override + public Optional findModuleResourcePath(final Module module, + final Class representation) { + checkArgument(YangTextSchemaSource.class.equals(requireNonNull(representation)), + "Unsupported representation %s", representation); + final SourceIdentifier id = Util.moduleToIdentifier(module); + return sources.contains(id) + ? Optional.of("/" + YangToSourcesProcessor.META_INF_YANG_STRING_JAR + "/" + id.toYangFilename()) + : Optional.empty(); + } + EffectiveModelContext getContext() { return context; } @@ -35,11 +50,4 @@ final class ContextHolder implements Immutable { Set getYangModules() { return modules; } - - Optional moduleToResourcePath(final Module mod) { - final SourceIdentifier id = Util.moduleToIdentifier(mod); - return sources.contains(id) - ? Optional.of("/" + YangToSourcesProcessor.META_INF_YANG_STRING_JAR + "/" + id.toYangFilename()) - : Optional.empty(); - } -} \ No newline at end of file +} diff --git a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojo.java b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojo.java index b2515e92a2..0974a773e3 100644 --- a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojo.java +++ b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesMojo.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; -import java.util.function.Function; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -38,13 +37,15 @@ import org.sonatype.plexus.build.incremental.BuildContext; * Generate sources from yang files using user provided set of * {@link BasicCodeGenerator}s. Steps of this process: *
    - *
  1. List yang files from {@link #yangFilesRootDir}
  2. - *
  3. Process yang files using Yang Parser
  4. - *
  5. For each {@link BasicCodeGenerator} from {@link #codeGenerators}: - *
      - *
    1. Instantiate using default constructor
    2. - *
    3. Call {@link BasicCodeGenerator#generateSources(EffectiveModelContext, File, Set, Function)}
    4. - *
  6. + *
  7. List yang files from {@link #yangFilesRootDir}
  8. + *
  9. Process yang files using Yang Parser
  10. + *
  11. For each {@link BasicCodeGenerator} from {@link #codeGenerators}: + *
      + *
    1. Instantiate using default constructor
    2. + *
    3. Call {@link BasicCodeGenerator#generateSources(EffectiveModelContext, File, Set, + * org.opendaylight.yangtools.yang2sources.spi.ModuleResourceResolver)}
    4. + *
    + *
  12. *
*/ @Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES, diff --git a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java index ce884c15c4..9cf4412984 100644 --- a/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java +++ b/yang/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java @@ -393,7 +393,7 @@ class YangToSourcesProcessor { } final Stopwatch watch = Stopwatch.createStarted(); Collection generated = codeGenerator.generateSources(context.getContext(), outputDir, - context.getYangModules(), context::moduleToResourcePath); + context.getYangModules(), context); LOG.debug("{} Sources generated by {}: {}", LOG_PREFIX, codeGeneratorCfg.getCodeGeneratorClass(), generated); LOG.info("{} Sources generated by {}: {} in {}", LOG_PREFIX, codeGeneratorCfg.getCodeGeneratorClass(), diff --git a/yang/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/GenerateSourcesTest.java b/yang/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/GenerateSourcesTest.java index 17299b321c..a6adaf9107 100644 --- a/yang/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/GenerateSourcesTest.java +++ b/yang/yang-maven-plugin/src/test/java/org/opendaylight/yangtools/yang2sources/plugin/GenerateSourcesTest.java @@ -23,9 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Map; -import java.util.Optional; import java.util.Set; -import java.util.function.Function; import org.apache.maven.model.Build; import org.apache.maven.model.Plugin; import org.apache.maven.project.MavenProject; @@ -38,6 +36,7 @@ import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang2sources.plugin.ConfigArg.CodeGeneratorArg; import org.opendaylight.yangtools.yang2sources.spi.BasicCodeGenerator; import org.opendaylight.yangtools.yang2sources.spi.MavenProjectAware; +import org.opendaylight.yangtools.yang2sources.spi.ModuleResourceResolver; public class GenerateSourcesTest { @@ -110,7 +109,7 @@ public class GenerateSourcesTest { @Override public Collection generateSources(final EffectiveModelContext context, final File outputBaseDir, - final Set currentModules, final Function> moduleResourcePathResolver) + final Set currentModules, final ModuleResourceResolver moduleResourcePathResolver) throws IOException { called++; outputDir = outputBaseDir; -- 2.36.6