This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository i18n. See https://gitlab.nuiton.org/nuiton/i18n.git commit 985c6ca6605728847b1a869cbb4b5af1aae3ff8d Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Sep 1 17:40:58 2016 +0200 Be able to generate enums i18n keys even if enum is not still compiled (Fixes #4011) --- .../i18n/plugin/GenerateI18nEnumHelperMojo.java | 118 +++++++++++++++++---- 1 file changed, 100 insertions(+), 18 deletions(-) diff --git a/i18n-maven-plugin/src/main/java/org/nuiton/i18n/plugin/GenerateI18nEnumHelperMojo.java b/i18n-maven-plugin/src/main/java/org/nuiton/i18n/plugin/GenerateI18nEnumHelperMojo.java index cd4d793..7930345 100644 --- a/i18n-maven-plugin/src/main/java/org/nuiton/i18n/plugin/GenerateI18nEnumHelperMojo.java +++ b/i18n-maven-plugin/src/main/java/org/nuiton/i18n/plugin/GenerateI18nEnumHelperMojo.java @@ -24,15 +24,26 @@ package org.nuiton.i18n.plugin; import com.google.common.base.Charsets; import com.google.common.io.Files; +import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.misc.NotNull; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; +import org.nuiton.i18n.plugin.parser.java.Java8BaseVisitor; +import org.nuiton.i18n.plugin.parser.java.Java8Lexer; +import org.nuiton.i18n.plugin.parser.java.Java8Parser; import org.nuiton.plugin.PluginHelper; +import org.nuiton.util.FileUtil; import java.io.BufferedWriter; import java.io.File; +import java.io.IOException; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -79,8 +90,8 @@ public class GenerateI18nEnumHelperMojo extends AbstractI18nMojo { * * Example with enum {@code enum E { A,B }}, will generate i18n keys: * <ul> - * <li>prefixA</li> - * <li>prefixB</li> + * <li>prefixA</li> + * <li>prefixB</li> * </ul> */ @Parameter(property = "i18n.enumsWithLabel", required = true) @@ -91,10 +102,10 @@ public class GenerateI18nEnumHelperMojo extends AbstractI18nMojo { * * Example with enum {@code enum E { A,B }}, will generate i18n keys: * <ul> - * <li>prefixA</li> - * <li>prefixA.description</li> - * <li>prefixB</li> - * <li>prefixB.description</li> + * <li>prefixA</li> + * <li>prefixA.description</li> + * <li>prefixB</li> + * <li>prefixB.description</li> * </ul> */ @Parameter(property = "i18n.enumsWithLabelAndDescription", required = true) @@ -105,8 +116,8 @@ public class GenerateI18nEnumHelperMojo extends AbstractI18nMojo { * * Example with enum {@code enum E { A,B }}, will generate i18n keys: * <ul> - * <li>prefixA.description</li> - * <li>prefixB.description</li> + * <li>prefixA.description</li> + * <li>prefixB.description</li> * </ul> */ @Parameter(property = "i18n.enumsWithLabelAndDescription", required = true) @@ -190,22 +201,15 @@ public class GenerateI18nEnumHelperMojo extends AbstractI18nMojo { for (String anEnumType : allEnums) { - Class aClass = Class.forName(anEnumType); - getLog().info("Scan enum: " + aClass.getName()); - if (!aClass.isEnum()) { - throw new IllegalStateException("Type " + aClass.getName() + " is not an enum."); - } - boolean generateLabel = allLabelEnums.contains(anEnumType); boolean generateDescription = allDescriptionEnums.contains(anEnumType); - for (Object o : aClass.getEnumConstants()) { - Enum e = (Enum) o; + for (String name : getEnumConstants(anEnumType)) { if (generateLabel) { - writer.write(" n(\"" + prefix + aClass.getName() + "." + e.name() + "\");\n"); + writer.write(" n(\"" + prefix + anEnumType + "." + name + "\");\n"); } if (generateDescription) { - writer.write(" n(\"" + prefix + aClass.getName() + "." + e.name() + ".description\");\n"); + writer.write(" n(\"" + prefix + anEnumType + "." + name + ".description\");\n"); } } writer.write("\n"); @@ -222,4 +226,82 @@ public class GenerateI18nEnumHelperMojo extends AbstractI18nMojo { } + private Set<String> getEnumConstants(String anEnumType) throws ClassNotFoundException, IOException { + + getLog().info("Scan enum: " + anEnumType); + + Set<String> result = new TreeSet<>(); + + try { + Class aClass = Class.forName(anEnumType); + + if (!aClass.isEnum()) { + throw new IllegalStateException("Type " + aClass.getName() + " is not an enum."); + } + + for (Object o : aClass.getEnumConstants()) { + result.add(((Enum) o).name()); + } + + + } catch (ClassNotFoundException e) { + + // try with antlr4 + + File basedir = new File(new File(new File(getProject().getBasedir(), "src"), "main"), "java"); + File file = FileUtil.getFileFromFQN(basedir, anEnumType); + File javaFile = new File(file.getParentFile(), file.getName() + ".java"); + + if (javaFile.exists()) { + + String content = FileUtils.readFileToString(javaFile, "UTF-8"); + TokenStream tokenStream = new CommonTokenStream(new Java8Lexer(new ANTLRInputStream(content))); + Java8Parser parser = new Java8Parser(tokenStream); + + + // see http://stackoverflow.com/a/32918434/2038100 + //parser.setErrorHandler(new BailErrorStrategy()); + //parser.getInterpreter().setPredictionMode(PredictionMode.SLL); + //parser.getInterpreter().tail_call_preserves_sll = false; + parser.getInterpreter().enable_global_context_dfa = true; + + JavaParserVisitor visitor = new JavaParserVisitor(javaFile); + parser.compilationUnit().accept(visitor); + + Set<String> names = visitor.getNames(); + result.addAll(names); + + } + + } + + + return result; + + } + + protected class JavaParserVisitor extends Java8BaseVisitor<Void> { + + protected final Set<String> names; + + protected final File file; + + private JavaParserVisitor(File file) { + this.file = file; + names = new HashSet<String>(); + } + + public Set<String> getNames() { + return names; + } + + @Override + public Void visitEnumConstant(@NotNull Java8Parser.EnumConstantContext ctx) { + String text = ctx.getText(); + names.add(text); + return super.visitEnumConstant(ctx); + } + + } + } -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.