I had to externalize GUI messages in an application that I have been working on, I have come up with a remarkably simple and clean approach for loading key:value
pairs from an external XML file or stream.
My implementation also transparently allows for String interpolation, should it be required.
Implementation
import java.io.File; import java.util.Properties; public class SymbolMap { private Properties symbolmap; public SymbolMap( File file ) { symbolmap = new Properties(); try { // Populate the symbol map from the XML file symbolmap.loadFromXML( file.toURI().toURL().openStream() ); } catch ( Exception e ) { } } /* variable length arguments are packed into an array which can be accessed and passed just like any array */ public String lookupSymbol( String symbol, String... variables ) { // Retrieve the value of the associated key String message = symbolmap.getProperty( symbol ); if( message == null ) { return ""; } // Interpolate parameters if necessary and return the message return String.format( message, variables ); } }
I leverage Java’s Properties Class to back the SymbolMap implementation, hiding all of the stream reading and XML processing concerns, as well as providing a map-based structure to access the values with their respective keys.
To use this implementation, your XML file must follow a specific DTD – you will find the DTD for the required XML format in the Properties Class documentation.
Example use of SymbolMap
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>example pairs</comment> <entry key="MOTD">Hello, world!</entry> <entry key="FAVOURITE_FRUIT">Mango</entry> <entry key="THE_COW_SAYS">The cow says %s</entry> </properties>
import java.io.File; public class Example { public static void main( String[] args ) throws Exception { SymbolMap symbolmap = new SymbolMap( new File( "example.xml" ) ); print( "> " + symbolmap.lookupSymbol( "MOTD" ) ); print( "> " + symbolmap.lookupSymbol( "NOT_FOUND" ) ); print( "> " + symbolmap.lookupSymbol( "THE_COW_SAYS", "mooooo" ) ); } public static void print(String s) { System.out.println( s ); } }
The output:
> Hello, world!
>
> The cow says mooooo