Maven: <build> ... </plugins> ... <plugin> <groupId>org.codehaus.groovy.maven</groupId> <artifactId>gmaven-plugin</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.codehaus.groovy.maven.runtime</groupId> <artifactId>gmaven-runtime-1.6</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.6.9</version> </dependency> </dependencies> <executions> <execution> <id>generate java keys for all properties</id> <phase>generate-sources</phase> <goals> <goal>execute</goal> </goals> <configuration> <source>${PROJECT_HOME}/KeyGenerator.groovy</source> </configuration> </execution> </executions> </plugin> </plugins> </build>
Java: public interface IKey { String getKey(); }
Groovy ( KeyGenerator.groovy ): import org.apache.maven.project.MavenProject import org.apache.maven.model.Resource MavenProject mvnProject = project File generatedDir = new File(mvnProject.basedir, "src/main/java/ru/scartel/paymentsystems/generated/") for (Resource resource: mvnProject.resources) { File dir = new File(resource.directory) // filter only l10n*.properties files for (File file: dir.listFiles( { return it != null && it.exists() && !it.isDirectory() && it.name.substring(it.name.lastIndexOf('.') + 1, it.name.length()) == "properties" && it.name.startsWith("l10n") } as FileFilter )) { if (!generatedDir.exists()) { if (!generatedDir.mkdirs()) { println "Directory $generatedDir coudn't be created." System.exit(1) } } Properties props = new Properties() file.withReader { reader -> props.load(reader) } String className = toClassName(file.name) println "Generate properties class $className" new File(generatedDir, className + ".java").withWriter { out -> out.println("package ru.scartel.paymentsystems.generated;") out.println() out.println("// Class generated from $file.name") out.println() // if (file.name.startsWith("l10n")) { out.println("import ru.scartel.paymentsystems.common.locale.LocalizedResource;") out.println() out.println("public enum $className implements IKey {") // } else { // out.println("import ru.scartel.paymentsystems.common.IKey;") // out.println() // out.println("public enum $className implements IKey {") // } Iterator iter = props.keySet().iterator(); while (iter.hasNext()) { String key = (String) iter.next() String enumName = toEnumName(key) out.print(" $enumName(\"$key\")") out.println(iter.hasNext() ? "," : ";") } out.println() out.println(" public static String PROPERTIES_FILE=\"$file.name\";") out.println() out.println(" String key;") out.println() out.println(" $className(String key) {") out.println(" this.key = key;") out.println(" }") out.println() out.println(" @Override") out.println(" public String getKey() {") out.println(" return key;") out.println(" }") out.println("}") } } } String toClassName(String fileName) { StringBuilder sb = new StringBuilder(); boolean isUpper = true; int idx = fileName.lastIndexOf('.') for (int i = 0; i < idx; i++) { Character c = fileName.charAt(i); if (c == '_') { isUpper = true; } else { sb.append(isUpper ? c.toUpperCase() : c) isUpper = false; } } return sb.toString(); } String toEnumName(String name) { StringBuilder sb = new StringBuilder(); boolean isLower = false; for (int i = 0; i < name.length(); i++) { Character c = name.charAt(i); if (new Character(c).isUpperCase() && isLower) { sb.append('_'); } if (c == '.') { sb.append('_'); } else { sb.append(c.toUpperCase()); } isLower = c.isLowerCase() } return sb.toString(); }
Example of property file: PS.fileParse.fileNameFormatError=File {0} name format error. PS.fileParse.successParse=File {0} successfully parsed. Lines: {1}. PS.fileParse.formatError=File {0} format error at line {1}. PS.fileParse.formatErrorWithColumn=File {0} format error at line {1}, column {2}. PS.fileParse.fileReadError=File {0} read error at line {1}. PS.fileParse.readError=Read error at line {0}. PS.fileParse.headerError=File {0} header format error.
Generated form this property enum: package ru.scartel.paymentsystems.generated; // Class generated from l10n_FileParse.properties import ru.scartel.paymentsystems.common.IKey; public enum L10nFileParse implements IKey { PS_FILE_PARSE_HEADER_ERROR("PS.fileParse.headerError"), PS_FILE_PARSE_SUCCESS_PARSE("PS.fileParse.successParse"), PS_FILE_PARSE_FILE_READ_ERROR("PS.fileParse.fileReadError"), PS_FILE_PARSE_FORMAT_ERROR_WITH_COLUMN("PS.fileParse.formatErrorWithColumn"), PS_FILE_PARSE_FORMAT_ERROR("PS.fileParse.formatError"), PS_FILE_PARSE_READ_ERROR("PS.fileParse.readError"), PS_FILE_PARSE_FILE_NAME_FORMAT_ERROR("PS.fileParse.fileNameFormatError"); public static String PROPERTIES_FILE="l10n_FileParse.properties"; String key; L10nFileParse(String key) { this.key = key; } @Override public String getKey() { return key; } }