X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Fresources%2FBundles.java;h=04b6f707d1dcaeb1935d036d7fcd2f3cf5ff6597;hb=a73a906356c971b080c36368e71a15d87e8b8d31;hp=e105b7117e64a6aed042b8c22adaf40919c2823a;hpb=1c03abafc3987d93fa682e7b8758e51bed8a4faf;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/resources/Bundles.java b/src/be/nikiroo/jvcard/resources/Bundles.java index e105b71..04b6f70 100644 --- a/src/be/nikiroo/jvcard/resources/Bundles.java +++ b/src/be/nikiroo/jvcard/resources/Bundles.java @@ -1,5 +1,12 @@ package be.nikiroo.jvcard.resources; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.lang.reflect.Field; import java.util.Locale; import java.util.ResourceBundle; @@ -10,38 +17,46 @@ import java.util.ResourceBundle; * */ public class Bundles { + /** + * The configuration directory where we try to get the .properties + * in priority, or NULL to get the information from the compiled resources. + */ static private String confDir = getConfDir(); - // TODO: rename to bundle, use it as base for i18n.Trans, create one for - // each resource - private int TODO; - /** - * Return the non-localised bundle of the given name. + * The type of configuration information the associated {@link Bundle} will + * convey. * - * @param name - * the name of the bundle to load - * - * @return the bundle + * @author niki + * */ - static public ResourceBundle getBundle(String name) { - return ResourceBundle.getBundle(Bundles.class.getPackage().getName() - + "." + name, new FixedResourceBundleControl(confDir)); + public enum Target { + colors, display, jvcard, remote, resources } /** - * Return the localised bundle of the given name and {@link Locale}. - * - * @param name - * the name of the bundle to load - * @param locale - * the {@link Locale} to use + * Return the configuration directory where to try to find the + * .properties files in priority. * - * @return the localised bundle + * @return the configuration directory */ - static public ResourceBundle getBundle(String name, Locale locale) { - return ResourceBundle.getBundle(Bundles.class.getPackage().getName() - + "." + name, locale, new FixedResourceBundleControl(confDir)); + static private String getConfDir() { + // Do not override user-supplied config directory (see --help) + if (Bundles.confDir != null) + return Bundles.confDir; + + try { + ResourceBundle bundle = ResourceBundle.getBundle(Bundles.class + .getPackage().getName() + "." + "jvcard", + Locale.getDefault(), new FixedResourceBundleControl(null)); + + String configDir = bundle.getString("CONFIG_DIR"); + if (configDir != null && configDir.trim().length() > 0) + return configDir; + } catch (Exception e) { + } + + return null; } /** @@ -59,28 +74,334 @@ public class Bundles { } /** - * Return the configuration directory where to try to find the - * .properties files in priority. + * Get the primary configuration directory to look for .properties + * files in. * - * @return the configuration directory + * @return the directory */ - static private String getConfDir() { - // Do not override user-supplied config directory (see --help) - if (Bundles.confDir != null) - return Bundles.confDir; + static public String getDirectory() { + return Bundles.confDir; + } - try { - ResourceBundle bundle = ResourceBundle.getBundle(Bundles.class - .getPackage().getName() + "." + "jvcard", - Locale.getDefault(), new FixedResourceBundleControl(null)); + /** + * This class encapsulate a {@link ResourceBundle} in UTF-8. It only allows + * to retrieve values associated to an enumeration, and allows some + * additional methods. + * + * @author niki + * + * @param + * the enum to use to get values out of this class + */ + public class Bundle> { + private Class type; + protected Target name; + protected ResourceBundle map; - String configDir = bundle.getString("CONFIG_DIR"); - if (configDir != null && configDir.trim().length() > 0) - return configDir; - } catch (Exception e) { + /** + * Create a new {@link Bundles} of the given name. + * + * @param type + * a runtime instance of the class of E + * + * @param name + * the name of the {@link Bundles} + */ + protected Bundle(Class type, Target name) { + this.type = type; + this.name = name; + this.map = getBundle(name); } - return null; - } + /** + * Return the value associated to the given id as a {@link String}. + * + * @param mame + * the id of the value to get + * + * @return the associated value + */ + public String getString(E id) { + if (map.containsKey(id.name())) { + return map.getString(id.name()).trim(); + } + return ""; + } + + /** + * Return the value associated to the given id as a {@link Boolean}. + * + * @param mame + * the id of the value to get + * + * @return the associated value + */ + public Boolean getBoolean(E id) { + String str = getString(id); + if (str != null && str.length() > 0) { + if (str.equalsIgnoreCase("true") || str.equalsIgnoreCase("on") + || str.equalsIgnoreCase("yes")) + return true; + if (str.equalsIgnoreCase("false") + || str.equalsIgnoreCase("off") + || str.equalsIgnoreCase("no")) + return false; + + } + + return null; + } + + /** + * Return the value associated to the given id as a {@link boolean}. + * + * @param mame + * the id of the value to get + * @param def + * the default value when it is not present in the config + * file or if it is not a boolean value + * + * @return the associated value + */ + public boolean getBoolean(E id, boolean def) { + Boolean b = getBoolean(id); + if (b != null) + return b; + + return def; + } + + /** + * Return the value associated to the given id as an {@link Integer}. + * + * @param mame + * the id of the value to get + * + * @return the associated value + */ + public Integer getInteger(E id) { + try { + return Integer.parseInt(getString(id)); + } catch (Exception e) { + } + + return null; + } + + /** + * Return the value associated to the given id as a {@link int}. + * + * @param mame + * the id of the value to get + * @param def + * the default value when it is not present in the config + * file or if it is not a int value + * + * @return the associated value + */ + public int getInteger(E id, int def) { + Integer i = getInteger(id); + if (i != null) + return i; + + return def; + } + + /** + * Create/update the .properties file. Will use the most likely + * candidate as base if the file does not already exists and this + * resource is translatable (for instance, "en_US" will use "en" as a + * base if the resource is a translation file). + * + * @param path + * the path where the .properties files are + * + * @throws IOException + * in case of IO errors + */ + public void updateFile(String path) throws IOException { + File file = getUpdateFile(path); + + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(file), "UTF-8")); + + writeHeader(writer); + writer.write("\n"); + writer.write("\n"); + + for (Field field : type.getDeclaredFields()) { + Meta meta = field.getAnnotation(Meta.class); + if (meta != null) { + E id = E.valueOf(type, field.getName()); + String info = getMetaInfo(meta); + + if (info != null) { + writer.write(info); + writer.write("\n"); + } + + writeValue(writer, id); + } + } + + writer.close(); + } + + /** + * Return formated, display-able information from the {@link Meta} field + * given. Each line will always starts with a "#" character. + * + * @param meta + * the {@link Meta} field + * + * @return the information to display or NULL if none + */ + protected String getMetaInfo(Meta meta) { + String what = meta.what(); + String where = meta.where(); + String format = meta.format(); + String info = meta.info(); + + int opt = what.length() + where.length() + format.length(); + if (opt + info.length() == 0) + return null; + + StringBuilder builder = new StringBuilder(); + builder.append("# "); + + if (opt > 0) { + builder.append("("); + if (what.length() > 0) { + builder.append("WHAT: " + what); + if (where.length() + format.length() > 0) + builder.append(", "); + } + + if (where.length() > 0) { + builder.append("WHERE: " + where); + if (format.length() > 0) + builder.append(", "); + } + + if (format.length() > 0) { + builder.append("FORMAT: " + format); + } + + builder.append(")"); + if (info.length() > 0) { + builder.append("\n# "); + } + } + + builder.append(info); + + return builder.toString(); + } + + /** + * Write the header found in the configuration .properties file + * of this {@link Bundles}. + * + * @param writer + * the {@link Writer} to write the header in + * + * @throws IOException + * in case of IO error + */ + protected void writeHeader(Writer writer) throws IOException { + writer.write("# " + name + "\n"); + writer.write("#\n"); + } + + /** + * Write the given id to the config file, i.e., + * "MY_ID = my_curent_value" followed by a new line + * + * @param writer + * the {@link Writer} to write into + * @param id + * the id to write + * + * @throws IOException + * in case of IO error + */ + protected void writeValue(Writer writer, E id) throws IOException { + writeValue(writer, id.name(), getString(id)); + } + + /** + * Write the given data to the config file, i.e., + * "MY_ID = my_curent_value" followed by a new line + * + * @param writer + * the {@link Writer} to write into + * @param id + * the id to write + * @param value + * the id's value + * + * @throws IOException + * in case of IO error + */ + protected void writeValue(Writer writer, String id, String value) + throws IOException { + writer.write(id); + writer.write(" = "); + + String[] lines = value.replaceAll("\\\t", "\\\\\\t").split("\n"); + for (int i = 0; i < lines.length; i++) { + writer.write(lines[i]); + if (i < lines.length - 1) { + writer.write("\\n\\"); + } + writer.write("\n"); + } + } + + /** + * Return the non-localised bundle of the given name. + * + * @param name + * the name of the bundle to load + * + * @return the bundle + */ + protected ResourceBundle getBundle(Target name) { + return ResourceBundle.getBundle(Bundles.class.getPackage() + .getName() + "." + name.name(), + new FixedResourceBundleControl(confDir)); + } + + /** + * Return the localised bundle of the given name and {@link Locale}. + * + * @param name + * the name of the bundle to load + * @param locale + * the {@link Locale} to use + * + * @return the localised bundle + */ + protected ResourceBundle getBundle(Target name, Locale locale) { + return ResourceBundle.getBundle(Bundles.class.getPackage() + .getName() + "." + name.name(), locale, + new FixedResourceBundleControl(confDir)); + } + + /** + * Return the source file for this {@link Bundles} from the given path. + * + * @param path + * the path where the .properties files are + * + * @return the source {@link File} + * + * @throws IOException + * in case of IO errors + */ + protected File getUpdateFile(String path) { + return new File(path, name.name() + ".properties"); + } + } }