X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FBundle.java;h=f01aa445be5b36f8640f9b313a772301e6629581;hb=7c192d3ccc7966cc26625f79cf7e97d565506f77;hp=3c448efacf8f3bce0ef62341f0d6368e54d64e05;hpb=805005449dacb1e7b825db63836bf100e472ddd0;p=fanfix.git diff --git a/src/be/nikiroo/utils/resources/Bundle.java b/src/be/nikiroo/utils/resources/Bundle.java index 3c448ef..f01aa44 100644 --- a/src/be/nikiroo/utils/resources/Bundle.java +++ b/src/be/nikiroo/utils/resources/Bundle.java @@ -258,9 +258,9 @@ public class Bundle> { * @return the associated value */ public char getCharacter(E id, char def) { - String s = getString(id).trim(); - if (s.length() > 0) { - return s.charAt(0); + String s = getString(id); + if (s != null && s.length() > 0) { + return s.trim().charAt(0); } return def; @@ -387,6 +387,101 @@ public class Bundle> { setString(id, "#" + rs + gs + bs + as); } + /** + * Return the value associated to the given id as a list of values if it is + * found and can be parsed. + * + * @param id + * the id of the value to get + * + * @return the associated list, empty if the value is empty, NULL if it is + * not found or cannot be parsed as a list + */ + public List getList(E id) { + List list = new ArrayList(); + String raw = getString(id); + try { + boolean inQuote = false; + boolean prevIsBackSlash = false; + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < raw.length(); i++) { + char car = raw.charAt(i); + + if (prevIsBackSlash) { + builder.append(car); + prevIsBackSlash = false; + } else { + switch (car) { + case '"': + if (inQuote) { + list.add(builder.toString()); + builder.setLength(0); + } + + inQuote = !inQuote; + break; + case '\\': + prevIsBackSlash = true; + break; + case ' ': + case '\n': + case '\r': + if (inQuote) { + builder.append(car); + } + break; + + case ',': + if (!inQuote) { + break; + } + // continue to default + default: + if (!inQuote) { + // Bad format! + return null; + } + + builder.append(car); + break; + } + } + } + + if (inQuote || prevIsBackSlash) { + // Bad format! + return null; + } + + } catch (Exception e) { + return null; + } + + return list; + } + + /** + * Set the value associated to the given id as a list of values. + * + * @param id + * the id of the value to set + * @param list + * the new list of values + */ + public void setList(E id, List list) { + StringBuilder builder = new StringBuilder(); + for (String item : list) { + if (builder.length() > 0) { + builder.append(", "); + } + builder.append('"')// + .append(item.replace("\\", "\\\\").replace("\"", "\\\""))// + .append('"'); + } + + setString(id, builder.toString()); + } + /** * Create/update the .properties file. *

@@ -446,6 +541,40 @@ public class Bundle> { writer.close(); } + /** + * Delete 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). + *

+ * Will delete the files in {@link Bundles#getDirectory()}; it MUST + * be set. + * + * @return TRUE if the file was deleted + */ + public boolean deleteFile() { + return deleteFile(Bundles.getDirectory()); + } + + /** + * Delete 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, MUST NOT be + * NULL + * + * @return TRUE if the file was deleted + */ + public boolean deleteFile(String path) { + File file = getUpdateFile(path); + return file.delete(); + } + /** * The description {@link TransBundle}, that is, a {@link TransBundle} * dedicated to the description of the values of the given {@link Bundle} @@ -530,12 +659,13 @@ public class Bundle> { Meta.Format format = meta.format(); String[] list = meta.list(); boolean nullable = meta.nullable(); + String def = meta.def(); String info = meta.info(); boolean array = meta.array(); // Default, empty values -> NULL - if (desc.length() + list.length + info.length() == 0 && !group - && nullable && format == Meta.Format.STRING) { + if (desc.length() + list.length + info.length() + def.length() == 0 + && !group && nullable && format == Meta.Format.STRING) { return null; } @@ -667,9 +797,11 @@ public class Bundle> { protected void setBundle(Enum name, Locale locale, boolean resetToDefault) { changeMap.clear(); String dir = Bundles.getDirectory(); + String bname = type.getPackage().getName() + "." + name.name(); boolean found = false; if (!resetToDefault && dir != null) { + // Look into Bundles.getDirectory() for .properties files try { File file = getPropertyFile(dir, name.name(), locale); if (file != null) { @@ -684,37 +816,50 @@ public class Bundle> { } if (!found) { - String bname = type.getPackage().getName() + "." + name.name(); + // Look into the package itself for resources try { resetMap(ResourceBundle .getBundle(bname, locale, type.getClassLoader(), new FixedResourceBundleControl())); + found = true; + } catch (MissingResourceException e) { } catch (Exception e) { - // We have no bundle for this Bundle - System.err.println("No bundle found for: " + bname); - resetMap(null); + e.printStackTrace(); } } + + if (!found) { + // We have no bundle for this Bundle + System.err.println("No bundle found for: " + bname); + resetMap(null); + } } /** - * Reset the backing map to the content of the given bundle, or empty if - * bundle is NULL. + * Reset the backing map to the content of the given bundle, or with default + * valiues if bundle is NULL. * * @param bundle * the bundle to copy */ protected void resetMap(ResourceBundle bundle) { this.map.clear(); - - if (bundle != null) { - for (E field : type.getEnumConstants()) { - try { - String value = bundle.getString(field.name()); - this.map.put(field.name(), - value == null ? null : value.trim()); - } catch (MissingResourceException e) { + for (Field field : type.getDeclaredFields()) { + try { + Meta meta = field.getAnnotation(Meta.class); + if (meta != null) { + E id = Enum.valueOf(type, field.getName()); + + String value; + if (bundle != null) { + value = bundle.getString(id.name()); + } else { + value = meta.def(); + } + + this.map.put(id.name(), value == null ? null : value.trim()); } + } catch (MissingResourceException e) { } } }