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 302629bdf2e90f5deb2486adccadcf524d2f785e Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Sep 30 17:13:38 2016 +0200 Generate also config provider by convention --- nuiton-config-example/pom.xml | 32 +++++- .../example/MyApplicationConfigProvider.java | 56 ---------- ...MyApplication.java => NuitonConfigExample.java} | 9 +- .../example/NuitonConfigExampleConfigAction.java | 49 +++++++++ ...n.java => NuitonConfigExampleConfigOption.java} | 14 +-- .../org.nuiton.config.ApplicationConfigProvider | 1 - .../i18n/nuiton-config-example_en_GB.properties | 1 + .../i18n/nuiton-config-example_fr_FR.properties | 1 + .../org/nuiton/config/plugin/GenerateMojo.java | 56 +++++++--- .../templates/ApplicationConfigTransformer.java | 113 ++++++++++++++++++--- pom.xml | 8 +- 11 files changed, 242 insertions(+), 98 deletions(-) diff --git a/nuiton-config-example/pom.xml b/nuiton-config-example/pom.xml index a307b73..1a3ed52 100644 --- a/nuiton-config-example/pom.xml +++ b/nuiton-config-example/pom.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> @@ -28,6 +29,10 @@ <artifactId>nuiton-config</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.nuiton.i18n</groupId> + <artifactId>nuiton-i18n</artifactId> + </dependency> </dependencies> @@ -42,10 +47,6 @@ <executions> <execution> <phase>generate-sources</phase> - <id>generate-config</id> - <configuration> - <modelName>MyApplication</modelName> - </configuration> <goals> <goal>generate</goal> </goals> @@ -53,6 +54,27 @@ </executions> </plugin> + <plugin> + <groupId>org.nuiton.i18n</groupId> + <artifactId>i18n-maven-plugin</artifactId> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>parserJava</goal> + <goal>gen</goal> + </goals> + <configuration> + <entries> + <entry> + <basedir>${project.build.directory}/generated-sources/java</basedir> + </entry> + </entries> + </configuration> + </execution> + </executions> + </plugin> + </plugins> </build> diff --git a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigProvider.java b/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigProvider.java deleted file mode 100644 index dc08a02..0000000 --- a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.nuiton.config.example; - -/*- - * #%L - * Nuiton Config :: Example - * %% - * Copyright (C) 2016 Code Lutin, Tony Chemit - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ - -import org.nuiton.config.ApplicationConfigProvider; -import org.nuiton.config.ConfigActionDef; - -import java.util.Locale; - -/** - * Created on 30/09/16. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class MyApplicationConfigProvider implements ApplicationConfigProvider { - - @Override - public String getName() { - return "application"; - } - - @Override - public String getDescription(Locale locale) { - return "Configuration"; - } - - @Override - public MyApplicationConfigOption[] getOptions() { - return MyApplicationConfigOption.values(); - } - - @Override - public ConfigActionDef[] getActions() { - return new ConfigActionDef[0]; - } -} diff --git a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplication.java b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExample.java similarity index 88% rename from nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplication.java rename to nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExample.java index ca3bcfc..a1daa3e 100644 --- a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplication.java +++ b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExample.java @@ -29,11 +29,12 @@ import org.nuiton.config.ArgumentsParserException; * * @author Tony Chemit - chemit@codelutin.com */ -public class MyApplication { +public class NuitonConfigExample { public static void main(String... args) throws ArgumentsParserException { - MyApplicationConfig config = new MyApplicationConfig(); + NuitonConfigExampleConfig config = new NuitonConfigExampleConfig(); + config.get().parse(args); System.out.println("Configuration file name : " + config.getConfigFile()); @@ -42,4 +43,8 @@ public class MyApplication { } + public void help() { + System.out.println("Aide."); + } + } diff --git a/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigAction.java b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigAction.java new file mode 100644 index 0000000..935823e --- /dev/null +++ b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigAction.java @@ -0,0 +1,49 @@ +package org.nuiton.config.example; + +import org.nuiton.config.ConfigActionDef; + +import static org.nuiton.i18n.I18n.n; +import static org.nuiton.i18n.I18n.t; + +/** + * Les actions appellables en ligne de commande. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public enum NuitonConfigExampleConfigAction implements ConfigActionDef { + + /** + * Afficher l'aide dans la console. + * + * @since 1.0 + */ + HELP( + "Aide", + "org.nuiton.config.example.NuitonConfigExample#help", "-h", "--help"); + + + public final String description; + + public final String action; + + public final String[] aliases; + + NuitonConfigExampleConfigAction(String description, String action, String... aliases) { + this.description = description; + this.action = action; + this.aliases = aliases; + } + + public String getDescription() { + return description; + } + + public String getAction() { + return action; + } + + public String[] getAliases() { + return aliases; + } + +} diff --git a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigOption.java b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigOption.java similarity index 89% rename from nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigOption.java rename to nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigOption.java index f69f9b2..19d4620 100644 --- a/nuiton-config-example/src/main/java/org/nuiton/config/example/MyApplicationConfigOption.java +++ b/nuiton-config-example/src/main/java/org/nuiton/config/example/NuitonConfigExampleConfigOption.java @@ -27,7 +27,7 @@ import org.nuiton.config.ConfigOptionDef; import java.io.File; -public enum MyApplicationConfigOption implements ConfigOptionDef { +public enum NuitonConfigExampleConfigOption implements ConfigOptionDef { /** * le nom du fichier de configuration (sans le prefix .) @@ -95,12 +95,12 @@ public enum MyApplicationConfigOption implements ConfigOptionDef { */ protected boolean _final; - MyApplicationConfigOption(Class<?> type, - String key, - String description, - String defaultValue, - boolean _transient, - boolean _final) { + NuitonConfigExampleConfigOption(Class<?> type, + String key, + String description, + String defaultValue, + boolean _transient, + boolean _final) { this.key = key; this.description = description; this.defaultValue = defaultValue; diff --git a/nuiton-config-example/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider b/nuiton-config-example/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider deleted file mode 100644 index 499f119..0000000 --- a/nuiton-config-example/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider +++ /dev/null @@ -1 +0,0 @@ -org.nuiton.config.example.MyApplicationConfigProvider \ No newline at end of file diff --git a/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_en_GB.properties b/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_en_GB.properties new file mode 100644 index 0000000..874cc75 --- /dev/null +++ b/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_en_GB.properties @@ -0,0 +1 @@ +NuitonConfigExampleConfig.description=Example configuration diff --git a/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_fr_FR.properties b/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_fr_FR.properties new file mode 100644 index 0000000..a7eb816 --- /dev/null +++ b/nuiton-config-example/src/main/resources/i18n/nuiton-config-example_fr_FR.properties @@ -0,0 +1 @@ +NuitonConfigExampleConfig.description=Configuration d'exemple 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 0dbf67a..d74663c 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 @@ -24,6 +24,7 @@ package org.nuiton.config.plugin; import com.google.common.base.Joiner; import com.google.common.collect.Iterables; +import com.google.common.io.Files; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.TokenStream; @@ -35,6 +36,7 @@ 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.parser.java.Java8BaseVisitor; import org.nuiton.config.plugin.parser.java.Java8Lexer; import org.nuiton.config.plugin.parser.java.Java8Parser; @@ -88,23 +90,28 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { * example with gav * <pre>org.nuiton:nuiton-config</pre> * <p> - * the package name will be {@code org.nuiton.config} and not {@code org.nuiton.nuiton.config}. + * the package name will be {@code org.nuiton.config} and not {@code org.nuiton.nuiton.config}. * </p> - * */ @Parameter(property = "config.packageName") private String packageName; /** * Model name (will prefix the generated files names with it). + * <p> + * By default, will use artifactId in camelCase format ( example: Model name for artifact id + * {@code nuiton-config-example} is {@code NuitonConfigExample} ). + * </p> */ - @Parameter(property = "config.modelName", required = true) + @Parameter(property = "config.modelName") private String modelName; /** * The fully qualified name of the enum class of options to scan to generate the configuration java files. * <p> - * By default, will use groupId.artifactId (with {@code -} replaced by {@code .}) plus {@code .config.modelNameOption}. + * By default, will use groupId.artifactId (with {@code -} replaced by {@code .}) plus {@code .modelNameConfigOption}. + * </p> + * Example: {@code org.nuiton:nuiton-config-example} gives {@code org.nuiton.config.example.NuitonConfigExampleConfigOption} */ @Parameter(property = "config.optionsClassName") private String optionsClassName; @@ -113,6 +120,8 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { * The fully qualified name of the enum class of actions to scan to generate the configuration java files. * <p> * By default, will use groupId.artifactId (with {@code -} replaced by {@code .}) plus {@code .config.modelNameAction}. + * </p> + * Example: {@code org.nuiton:nuiton-config-example} gives {@code org.nuiton.config.example.NuitonConfigExampleConfigAction} */ @Parameter(property = "config.actionsClassName") private String actionsClassName; @@ -130,6 +139,12 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { private File outputdirectory; /** + * Pour générer le provider de configuration. + */ + @Parameter(property = "config.generateProvider", defaultValue = "true") + private boolean generateProvider; + + /** * Pour activer le mode verbeux. */ @Parameter(property = "config.verbose", defaultValue = "${maven.verbose}") @@ -145,12 +160,6 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { private String encoding; /** - * - */ - @Parameter(property = "config.prefix", defaultValue = "Config") - private String prefix; - - /** * Maven project. */ @Parameter(defaultValue = "${project}", readonly = true) @@ -159,6 +168,7 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { private ObjectModelImpl model; private ApplicationConfigTransformer template; + private String configClassName; @Override protected void init() throws Exception { @@ -177,6 +187,17 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { getLog().info("Use package name: " + packageName); } + 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 model name: " + modelName); + + } + String prefix = "Config"; + if (optionsClassName == null) { optionsClassName = packageName + "." + modelName + prefix + "Option"; @@ -227,8 +248,8 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { model.setName(modelName); - String className = modelName + prefix; - getLog().info("Config class name: " + className); + configClassName = modelName + prefix; + getLog().info("Config class name: " + configClassName); File file = PluginHelper.getFile(sourceDirectory, optionsClassName.split("\\.")); File javaFile = new File(file.getParentFile(), file.getName() + ".java"); @@ -250,7 +271,7 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { Map<String, String> names = visitor.getNames(); ObjectModelClassImpl aClass = new ObjectModelClassImpl(); - aClass.setName(className); + aClass.setName(configClassName); aClass.setPackage(packageName); model.addClass(aClass); @@ -267,6 +288,7 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { templateProperties.put(Template.PROP_VERBOSE, verbose); templateProperties.put(Template.PROP_OVERWRITE, true); templateProperties.put(Template.PROP_CLASS_LOADER, loader); + templateProperties.put(ApplicationConfigTransformer.PROP_GENERATE_PROVIDER, generateProvider + ""); templateProperties.put(ApplicationConfigTransformer.PROP_OPTION_CLASS_NAME, optionsClassName); if (actionsClassName != null) { templateProperties.put(ApplicationConfigTransformer.PROP_ACTION_CLASS_NAME, actionsClassName); @@ -290,6 +312,14 @@ public class GenerateMojo extends AbstractPlugin implements PluginWithEncoding { template.applyTemplate(model, outputdirectory); + if (generateProvider) { + + String content = packageName + "." + configClassName + "Provider"; + 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); + } } @Override diff --git a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/templates/ApplicationConfigTransformer.java b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/templates/ApplicationConfigTransformer.java index 7960111..9315ccf 100644 --- a/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/templates/ApplicationConfigTransformer.java +++ b/nuiton-config-maven-plugin/src/main/java/org/nuiton/config/plugin/templates/ApplicationConfigTransformer.java @@ -27,6 +27,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.plexus.util.StringUtils; import org.nuiton.config.ApplicationConfig; +import org.nuiton.config.ApplicationConfigProvider; +import org.nuiton.config.ConfigActionDef; import org.nuiton.eugene.GeneratorUtil; import org.nuiton.eugene.java.JavaGeneratorUtil; import org.nuiton.eugene.java.ObjectModelTransformerToJava; @@ -34,7 +36,9 @@ import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelJavaModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; +import org.nuiton.i18n.I18n; +import java.util.Locale; import java.util.Set; /*{generator option: parentheses = false}*/ @@ -53,6 +57,7 @@ public class ApplicationConfigTransformer extends ObjectModelTransformerToJava { private static final Log log = LogFactory.getLog(ApplicationConfigTransformer.class); public static final String PROP_OPTION_CLASS_NAME = "optionClassName"; public static final String PROP_ACTION_CLASS_NAME = "actionClassName"; + public static final String PROP_GENERATE_PROVIDER = "generateProvider"; @Override public void transformFromClass(ObjectModelClass clazz) { @@ -60,17 +65,10 @@ public class ApplicationConfigTransformer extends ObjectModelTransformerToJava { String packageName = clazz.getPackageName(); String abstractClassName = "Generated" + clazz.getName(); - if (canGenerate(packageName + "." + abstractClassName)) { - - generateAbstractClass(packageName, abstractClassName, clazz); - - } else { + String optionClassName = getProperty(PROP_OPTION_CLASS_NAME); + String actionClassName = getProperty(PROP_ACTION_CLASS_NAME); - if (log.isDebugEnabled()) { - log.debug("Skip generation for " + abstractClassName); - } - - } + generateAbstractClass(packageName, abstractClassName, clazz, optionClassName, actionClassName); String className = clazz.getName(); if (canGenerate(packageName + "." + className)) { @@ -84,14 +82,103 @@ public class ApplicationConfigTransformer extends ObjectModelTransformerToJava { } } + + String generateProvider = getProperty(PROP_GENERATE_PROVIDER); + if (generateProvider != null && Boolean.TRUE.equals(Boolean.valueOf(generateProvider))) { + + String abstractProviderClassName = "Generated" + className + "Provider"; + generateAbstractProvider(packageName, abstractProviderClassName, optionClassName, actionClassName); + + String providerClassName = className + "Provider"; + if (canGenerate(providerClassName)) { + + generateProvider(packageName, abstractProviderClassName, providerClassName, className); + + } + } } - private void generateAbstractClass(String packageName, String abstractClassName, ObjectModelClass input) { + private void generateAbstractProvider(String packageName, String providerClassName, String optionClassName, String actionClassName) { + + ObjectModelClass output = createAbstractClass(providerClassName, packageName); + addInterface(output, ApplicationConfigProvider.class); + + if (log.isInfoEnabled()) { + log.info("Generate " + output.getQualifiedName()); + } - String optionClassName = getProperty(PROP_OPTION_CLASS_NAME); String optionClassSimpleName = GeneratorUtil.getSimpleName(optionClassName); - String actionClassName = getProperty(PROP_ACTION_CLASS_NAME); + ObjectModelOperation getOptions = addOperation( + output, "getOptions", optionClassName + "[]", ObjectModelJavaModifier.PUBLIC); + addAnnotation(output, getOptions, Override.class); + setOperationBody(getOptions, "" + /*{ + return <%=optionClassSimpleName%>.values(); + }*/ + ); + + if (actionClassName == null) { + + addImport(output, ConfigActionDef.class); + ObjectModelOperation getActions = addOperation( + output, "getActions", "ConfigActionDef[]", ObjectModelJavaModifier.PUBLIC); + addAnnotation(output, getActions, Override.class); + setOperationBody(getActions, "" + /*{ + return new ConfigActionDef[0]; + }*/ + ); + } else { + + String actionClassSimpleName = GeneratorUtil.getSimpleName(actionClassName); + + ObjectModelOperation getActions = addOperation( + output, "getActions", actionClassName + "[]", ObjectModelJavaModifier.PUBLIC); + addAnnotation(output, getActions, Override.class); + setOperationBody(getActions, "" + /*{ + return <%=actionClassSimpleName%>.values(); + }*/ + ); + } + + } + + private void generateProvider(String packageName, String abstractProviderClassName, String providerClassName, String className) { + + ObjectModelClass output = createClass(providerClassName, packageName); + setSuperClass(output, abstractProviderClassName); + addImport(output, I18n.class); + + if (log.isInfoEnabled()) { + log.info("Generate " + output.getQualifiedName()); + } + + ObjectModelOperation getName = addOperation( + output, "getName", String.class, ObjectModelJavaModifier.PUBLIC); + addAnnotation(output, getName, Override.class); + setOperationBody(getName, "" + /*{ + return "<%=className%>"; + }*/ + ); + + ObjectModelOperation getDescription = addOperation( + output, "getDescription", String.class, ObjectModelJavaModifier.PUBLIC); + addParameter(getDescription, Locale.class, "locale"); + addAnnotation(output, getDescription, Override.class); + setOperationBody(getDescription, "" + /*{ + return I18n.l(locale, "<%=className%>.description"); + }*/ + ); + + } + + private void generateAbstractClass(String packageName, String abstractClassName, ObjectModelClass input, String optionClassName, String actionClassName) { + + String optionClassSimpleName = GeneratorUtil.getSimpleName(optionClassName); ObjectModelClass output = createAbstractClass(abstractClassName, packageName); diff --git a/pom.xml b/pom.xml index d971623..d83df1a 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,7 @@ <mavenVersion>3.3.9</mavenVersion> <doxiaVersion>1.7</doxiaVersion> + <nuitonI18nVersion>3.6.2</nuitonI18nVersion> <!-- Documentation is in apt format --> <siteSourcesType>apt</siteSourcesType> @@ -98,7 +99,7 @@ <dependency> <groupId>org.nuiton.i18n</groupId> <artifactId>nuiton-i18n</artifactId> - <version>3.6.2</version> + <version>${nuitonI18nVersion}</version> </dependency> <dependency> @@ -296,6 +297,11 @@ <artifactId>processor-maven-plugin</artifactId> <version>1.3</version> </plugin> + <plugin> + <groupId>org.nuiton.i18n</groupId> + <artifactId>i18n-maven-plugin</artifactId> + <version>${nuitonI18nVersion}</version> + </plugin> </plugins> </pluginManagement> -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.