I'm using .properties files for message internationalization. For example:
HELLO_WORLD = Hello World
HELLO_UNIVERSE = Hello Universe
And then in Java code:
String foo = resourceBundle.getString("HELLO_WORLD");
String literals like "HELLO_WORLD"
are problematic because they're error-prone and can't be autocompleted. I'd like to generate code from the keys in the properties file like this:
public interface Messages { // Or abstract class with private constructor
public static final String HELLO_WORLD = "HELLO_WORLD";
public static final String HELLO_UNIVERSE = "HELLO_UNIVERSE";
}
And then use it like this:
String foo = resourceBundle.getString(Messages.HELLO_WORLD);
Is there a standard way to do this? I prefer a Maven plugin, but any stand-alone tool that I can run manually would be good enough for my needs.
Following code will generate interface MyProperties in your root directory of the project then after you can use that interface anywhere.
public class PropertiesToInterfaceGenerator {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
InputStream inputStream =PropertiesToInterfaceGenerator.class.getClassLoader().getResourceAsStream("xyz.properties");
if(null != inputStream ){
properties.load(inputStream);
}
generate(properties);
}
public static void generate(Properties properties) {
Enumeration e = properties.propertyNames();
try {
FileWriter aWriter = new FileWriter("MyProperties.java", true);
aWriter.write("public interface MyProperties{\n");
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String val = properties.getProperty(key);
aWriter.write("\tpublic static String "+key+" = \""+val+"\";\n");
}
aWriter.write(" }\n");
aWriter.flush();
aWriter.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}