This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository nuiton-config. See https://gitlab.nuiton.org/nuiton/nuiton-config.git commit a90f02f8ace46effe61440f4165c4ce7451ddf7a Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Oct 2 13:44:51 2016 +0200 Improve mojo design --- .../nuiton/config/plugin/ConfigMojoSupport.java | 104 ++++++++++++++++++ .../org/nuiton/config/plugin/DescribeMojo.java | 94 +++++----------- .../org/nuiton/config/plugin/GenerateMojo.java | 119 +++++++-------------- .../src/main/resources/log4j.properties | 1 - 4 files changed, 167 insertions(+), 151 deletions(-) diff --git a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/ConfigMojoSupport.java b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/ConfigMojoSupport.java new file mode 100644 index 0000000..b7a95f7 --- /dev/null +++ b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/ConfigMojoSupport.java @@ -0,0 +1,104 @@ +package org.nuiton.config.plugin; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.nuiton.config.plugin.io.ConfigModelIO; +import org.nuiton.plugin.AbstractPlugin; +import org.nuiton.plugin.PluginHelper; + +import java.io.File; +import java.util.Map; + +/** + * Created on 02/10/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.0 + */ +abstract class ConfigMojoSupport extends AbstractPlugin { + + /** + * Output format {@code toml} or {@code yml}. + * + * Default value is {@code toml}. + */ + @Parameter(property = "config.format", defaultValue = "toml") + private String format; + + /** + * The path of model file. + * + * <p>Default value is </p> + * <pre>${modelDirectory}/${modelName}.${format}</pre> + */ + @Parameter(property = "config.modelFile") + private File modelFile; + + /** + * The source directory where to scan model file. + */ + @Parameter(property = "config.modelDirectory", defaultValue = "${basedir}/src/main/config", required = true) + private File modelDirectory; + + /** + * Pour activer le mode verbeux. + */ + @Parameter(property = "config.verbose", defaultValue = "${maven.verbose}") + private boolean verbose; + + /** + * Maven project. + */ + @Parameter(defaultValue = "${project}", readonly = true) + private MavenProject project; + + @Component(role = ConfigModelIO.class) + private Map<String, ConfigModelIO> configModelIs; + + @Override + protected void init() throws Exception { + + if (!configModelIs.containsKey(format)) { + throw new MojoExecutionException("Don't know format: " + format + ", use one of these: " + configModelIs.keySet()); + } + + if (isVerbose()) { + getLog().info("Use format: " + format); + } + + } + + @Override + public boolean isVerbose() { + return verbose; + } + + @Override + public void setVerbose(boolean verbose) { + this.verbose = verbose; + } + + @Override + public MavenProject getProject() { + return project; + } + + @Override + public void setProject(MavenProject project) { + this.project = project; + } + + void setModelFile(String name) { + modelFile = PluginHelper.getFile(modelDirectory, name + "." + format); + } + + ConfigModelIO getIO() { + return configModelIs.get(format); + } + + File getModelFile() { + return modelFile; + } +} diff --git a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/DescribeMojo.java b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/DescribeMojo.java index 23a84d7..8c86c17 100644 --- a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/DescribeMojo.java +++ b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/DescribeMojo.java @@ -30,17 +30,13 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; import org.nuiton.config.ApplicationConfigHelper; import org.nuiton.config.ApplicationConfigProvider; import org.nuiton.config.ConfigActionDef; import org.nuiton.config.ConfigOptionDef; import org.nuiton.config.plugin.model.ActionModel; import org.nuiton.config.plugin.model.ConfigModel; -import org.nuiton.config.plugin.model.ConfigModelUtil; import org.nuiton.config.plugin.model.OptionModel; -import org.nuiton.plugin.AbstractPlugin; -import org.nuiton.plugin.PluginHelper; import java.io.File; import java.nio.file.Files; @@ -60,7 +56,7 @@ import java.util.Locale; */ @Mojo(name = "describe", requiresDirectInvocation = true, defaultPhase = LifecyclePhase.COMPILE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) @Execute(phase = LifecyclePhase.COMPILE) -public class DescribeMojo extends AbstractPlugin { +public class DescribeMojo extends ConfigMojoSupport { /** * The name of provider to describe. @@ -70,47 +66,16 @@ public class DescribeMojo extends AbstractPlugin { * * @see ApplicationConfigProvider */ - @Parameter(property = "config.providerName") + @Parameter(property = "providerName") private String providerName; - /** - * The path of model file. - * - * <p>Default value is </p> - * <pre>config.sourceDirectory/config.modelName.yml</pre> - */ - @Parameter(property = "config.modelFile") - private File modelFile; - - /** - * The source directory where to scan model file. - */ - @Parameter(property = "config.modelDirectory", defaultValue = "${basedir}/src/main/config", required = true) - private File modelDirectory; - - /** - * The source directory where to scan options java file. - */ - @Parameter(property = "config.sourceDirectory", defaultValue = "${project.build.outputDirectory}", required = true) - private File sourceDirectory; - - /** - * Pour activer le mode verbeux. - */ - @Parameter(property = "config.verbose", defaultValue = "${maven.verbose}") - private boolean verbose; - - /** - * Maven project. - */ - @Parameter(defaultValue = "${project}", readonly = true) - private MavenProject project; - private ConfigModel configModel; @Override protected void init() throws Exception { + super.init(); + if (providerName == null) { List<String> artifactIdPaths = new ArrayList<>(); @@ -121,24 +86,33 @@ public class DescribeMojo extends AbstractPlugin { } - getLog().info("Use provider name: " + providerName); + if (isVerbose()) { + getLog().info("Use provider name: " + providerName); + } + ClassLoader loader = initClassLoader(getProject(), new File(getProject().getBuild().getOutputDirectory()), true, false, true, true, true); - ClassLoader loader = this.initClassLoader(getProject(), sourceDirectory, true, false, false, true, true); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - ApplicationConfigProvider provider = ApplicationConfigHelper.getProvider(loader, providerName); + ApplicationConfigProvider provider; + try { + Thread.currentThread().setContextClassLoader(loader); + provider = ApplicationConfigHelper.getProvider(loader, providerName); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } if (provider == null) { throw new MojoExecutionException("Could not find provider with name: " + providerName); } String modelName = StringUtils.removeEnd(provider.getName(), "Config"); - getLog().info("Use model name: " + modelName); - - if (modelFile == null) { - modelFile = PluginHelper.getFile(modelDirectory, modelName + ".yml"); + if (isVerbose()) { + getLog().info("Use model name: " + modelName); } - - Files.createDirectories(modelFile.getParentFile().toPath()); + if (getModelFile() == null) { + setModelFile(modelName); + } + Files.createDirectories(getModelFile().getParentFile().toPath()); String description = provider.getDescription(Locale.FRANCE); @@ -162,30 +136,10 @@ public class DescribeMojo extends AbstractPlugin { @Override protected void doAction() throws Exception { - getLog().info("Generate file to: " + modelFile); + getLog().info("Generate file to: " + getModelFile()); - ConfigModelUtil.write(configModel, modelFile.toPath()); + getIO().write(configModel, getModelFile().toPath()); } - @Override - public boolean isVerbose() { - return verbose; - } - - @Override - public void setVerbose(boolean verbose) { - this.verbose = verbose; - } - - @Override - public MavenProject getProject() { - return project; - } - - @Override - public void setProject(MavenProject project) { - this.project = project; - } - } diff --git a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/GenerateMojo.java b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/GenerateMojo.java index 7a31fe0..be5cd5b 100644 --- a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/GenerateMojo.java +++ b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/GenerateMojo.java @@ -32,16 +32,13 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; import org.nuiton.config.ApplicationConfigProvider; import org.nuiton.config.plugin.model.ConfigModel; -import org.nuiton.config.plugin.model.ConfigModelUtil; import org.nuiton.config.plugin.templates.ApplicationConfigTransformer; import org.nuiton.config.plugin.templates.ApplicationConfigTransformerConfig; import org.nuiton.eugene.DefaultTemplateConfiguration; import org.nuiton.eugene.Template; import org.nuiton.eugene.models.object.xml.ObjectModelImpl; -import org.nuiton.plugin.AbstractPlugin; import org.nuiton.plugin.PluginHelper; import java.io.File; @@ -63,7 +60,7 @@ import static java.util.Arrays.asList; * @since 3.0 */ @Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) -public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTransformerConfig { +public class GenerateMojo extends ConfigMojoSupport implements ApplicationConfigTransformerConfig { /** * To set the package fully qualified name of the generated class. @@ -122,21 +119,6 @@ public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTra private boolean useNuitonI18n; /** - * The path of model file. - * - * <p>Default value is </p> - * <pre>config.sourceDirectory/config.modelName.yml</pre> - */ - @Parameter(property = "config.modelFile") - private File modelFile; - - /** - * The source directory where to scan model file. - */ - @Parameter(property = "config.modelDirectory", defaultValue = "${basedir}/src/main/config", required = true) - private File modelDirectory; - - /** * The source directory where to scan options java file. */ @Parameter(property = "config.sourceDirectory", defaultValue = "${basedir}/src/main/java", required = true) @@ -145,22 +127,8 @@ public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTra /** * The root directory where to generated. */ - @Parameter(property = "config.outputdirectory", defaultValue = "${basedir}/target/generated-sources/java", required = true) - private File outputdirectory; - - /** - * Pour activer le mode verbeux. - */ - @Parameter(property = "config.verbose", defaultValue = "${maven.verbose}") - private boolean verbose; - - /** - * Maven project. - */ - @Parameter(defaultValue = "${project}", readonly = true) - private MavenProject project; - - private ObjectModelImpl objectModel; + @Parameter(property = "config.outputDirectory", defaultValue = "${project.build.directory}/generated-sources/java", required = true) + private File outputDirectory; private ApplicationConfigTransformer template; private String configClassName; @@ -170,22 +138,25 @@ public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTra @Override protected void init() throws Exception { + super.init(); + if (modelName == null) { List<String> artifactIdPaths = new ArrayList<>(); for (String artifactIdPath : Arrays.asList(getProject().getArtifactId().replaceAll("-", ".").split("\\."))) { artifactIdPaths.add(StringUtils.capitalize(artifactIdPath)); } modelName = Joiner.on("").join(artifactIdPaths); - getLog().info("Use objectModel name: " + modelName); - + if (isVerbose()) { + getLog().info("Use model name: " + modelName); + } } - if (modelFile == null) { - modelFile = new File(modelDirectory, modelName + ".yml"); + if (getModelFile() == null) { + setModelFile(modelName); } + File modelFile = getModelFile(); if (!modelFile.exists()) { - throw new MojoExecutionException("No model file found at: " + modelFile); } @@ -200,45 +171,48 @@ public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTra groupIdPaths.addAll(artifactIdPaths); packageName = Joiner.on(".").join(groupIdPaths); - getLog().info("Use package name: " + packageName); + if (isVerbose()) { + getLog().info("Use package name: " + packageName); + } } if (optionsClassName == null) { optionsClassName = modelName + "ConfigOption"; - getLog().info("Configuration options class: " + optionsClassName); + if (isVerbose()) { + getLog().info("Configuration options class: " + optionsClassName); + } } if (actionsClassName == null) { actionsClassName = modelName + "ConfigAction"; - getLog().info("Configuration actions class: " + actionsClassName); - + if (isVerbose()) { + getLog().info("Configuration actions class: " + actionsClassName); + } } ClassLoader loader = this.initClassLoader(getProject(), sourceDirectory, true, false, false, true, true); // get options - objectModel = new ObjectModelImpl(); - objectModel.setName(modelName); - - configClassName = modelName + "Config"; getLog().info("Config class name: " + configClassName); if (generateProvider) { configProviderClassName = configClassName + "Provider"; - getLog().info("Config provider class name: " + configClassName); + if (isVerbose()) { + getLog().info("Config provider class name: " + configClassName); + } } - configModel = ConfigModelUtil.read(modelFile.toPath()); + configModel = getIO().read(modelFile.toPath()); Properties templateProperties = new Properties(); templateProperties.put(Template.PROP_ENCODING, StandardCharsets.UTF_8.name()); - templateProperties.put(Template.PROP_VERBOSE, verbose); + templateProperties.put(Template.PROP_VERBOSE, isVerbose()); templateProperties.put(Template.PROP_OVERWRITE, true); templateProperties.put(Template.PROP_CLASS_LOADER, loader); templateProperties.put(ApplicationConfigTransformer.PROP_CONFIG, this); @@ -246,56 +220,41 @@ public class GenerateMojo extends AbstractPlugin implements ApplicationConfigTra template = new ApplicationConfigTransformer(); template.setConfiguration(new DefaultTemplateConfiguration(templateProperties)); - if (!project.getCompileSourceRoots().contains(outputdirectory.getPath())) { + if (!getProject().getCompileSourceRoots().contains(outputDirectory.getPath())) { if (isVerbose()) { - getLog().info("Add compile source root : " + outputdirectory); + getLog().info("Add compile source root : " + outputDirectory); } - project.addCompileSourceRoot(outputdirectory.getPath()); + getProject().addCompileSourceRoot(outputDirectory.getPath()); } } @Override protected void doAction() throws Exception { - getLog().info("Generate file(s) to: " + outputdirectory); + getLog().info("Generate file(s) to: " + outputDirectory); + + ObjectModelImpl objectModel = new ObjectModelImpl(); + objectModel.setName(modelName); - template.applyTemplate(objectModel, outputdirectory); + template.applyTemplate(objectModel, outputDirectory); if (generateProvider) { String content = packageName + "." + configClassName + "Provider"; - File serviceLoaderFile = PluginHelper.getFile(outputdirectory, "META-INF", "services", ApplicationConfigProvider.class.getName()); + File serviceLoaderFile = PluginHelper.getFile(outputDirectory, "META-INF", "services", ApplicationConfigProvider.class.getName()); Files.createParentDirs(serviceLoaderFile); Files.write(content.getBytes(), serviceLoaderFile); - getLog().info("Generate serviceLoader provider file: " + serviceLoaderFile); + if (isVerbose()) { + getLog().info("Generate serviceLoader provider file: " + serviceLoaderFile); + } Resource resource = new Resource(); - resource.setDirectory(outputdirectory.getAbsolutePath()); + resource.setDirectory(outputDirectory.getAbsolutePath()); resource.setIncludes(Collections.singletonList("**/" + ApplicationConfigProvider.class.getName())); - project.addResource(resource); + getProject().addResource(resource); } } @Override - public boolean isVerbose() { - return verbose; - } - - @Override - public void setVerbose(boolean verbose) { - this.verbose = verbose; - } - - @Override - public MavenProject getProject() { - return project; - } - - @Override - public void setProject(MavenProject project) { - this.project = project; - } - - @Override public String getPackageName() { return packageName; } diff --git a/nuiton-config-maven-plugin/src/main/resources/log4j.properties b/nuiton-config-maven-plugin/src/main/resources/log4j.properties index 61f28db..c592a7b 100644 --- a/nuiton-config-maven-plugin/src/main/resources/log4j.properties +++ b/nuiton-config-maven-plugin/src/main/resources/log4j.properties @@ -26,5 +26,4 @@ log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n # package level -log4j.logger.org.nuiton=INFO log4j.logger.org.nuiton.config=INFO -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.