import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
+import be.nikiroo.utils.resources.Meta.Format;
+
/**
* This class encapsulate a {@link ResourceBundle} in UTF-8. It allows to
* retrieve values associated to an enumeration, and allows some additional
setBundle(name, Locale.getDefault(), false);
}
+ /**
+ * Check if the setting is set into this {@link Bundle}.
+ *
+ * @param id
+ * the id of the setting to check
+ * @param includeDefaultValue
+ * TRUE to only return false when the setting is not set AND
+ * there is no default value
+ *
+ * @return TRUE if the setting is set
+ */
+ public boolean isSet(E id, boolean includeDefaultValue) {
+ return isSet(id.name(), includeDefaultValue);
+ }
+
+ /**
+ * Check if the setting is set into this {@link Bundle}.
+ *
+ * @param id
+ * the id of the setting to check
+ * @param includeDefaultValue
+ * TRUE to only return false when the setting is not set AND
+ * there is no default value
+ *
+ * @return TRUE if the setting is set
+ */
+ protected boolean isSet(String name, boolean includeDefaultValue) {
+ if (getString(name, null) == null) {
+ if (!includeDefaultValue || getString(name, "") == null) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
/**
* Return the value associated to the given id as a {@link String}.
*
* resource file)
*/
public String getString(E id) {
- return getString(id.name());
+ return getString(id, null);
+ }
+
+ /**
+ * Return the value associated to the given id as a {@link String}.
+ * <p>
+ * If no value is associated, take the default one if any.
+ *
+ * @param id
+ * the id of the value to get
+ * @param def
+ * the default value when it is not present in the config file
+ *
+ * @return the associated value, or NULL if not found (not present in the
+ * resource file)
+ */
+ public String getString(E id, String def) {
+ String rep = getString(id.name(), null);
+ if (rep == null) {
+ try {
+ Meta meta = type.getDeclaredField(id.name()).getAnnotation(
+ Meta.class);
+ rep = meta.def();
+ } catch (NoSuchFieldException e) {
+ } catch (SecurityException e) {
+ }
+ }
+
+ if (rep == null) {
+ rep = def;
+ }
+
+ return rep;
}
/**
* with the runtime value "_suffix" (that is, "_" and suffix).
* <p>
* Will only accept suffixes that form an existing id.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
/**
* Return the value associated to the given id as a {@link Boolean}.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
/**
* Return the value associated to the given id as a {@link Boolean}.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
return def;
}
-
+
/**
* Set the value associated to the given id as a {@link Boolean}.
*
setString(id.name(), BundleHelper.fromBoolean(value));
}
-
/**
* Return the value associated to the given id as an {@link Integer}.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
/**
* Return the value associated to the given id as an int.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
public void setInteger(E id, int value) {
setString(id.name(), BundleHelper.fromInteger(value));
}
-
+
/**
* Return the value associated to the given id as a {@link Character}.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
/**
* Return the value associated to the given id as a {@link Character}.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
* and can be parsed.
* <p>
* The returned value is an ARGB value.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
/**
* Return the value associated to the given id as a list of values if it is
* found and can be parsed.
+ * <p>
+ * If no value is associated, take the default one if any.
*
* @param id
* the id of the value to get
}
/**
- * Get the value for the given key if it exists in the internal map, or NULL
- * if not.
+ * Get the value for the given key if it exists in the internal map, or
+ * <tt>def</tt> if not.
*
* @param key
* the key to check for
+ * @param def
+ * the default value when it is not present in the internal map
*
- * @return the value, or NULL
+ * @return the value, or <tt>def</tt> if not found
*/
- protected String getString(String key) {
+ protected String getString(String key, String def) {
if (changeMap.containsKey(key)) {
return changeMap.get(key);
}
return map.get(key);
}
- return null;
+ return def;
}
/**
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() + def.length() == 0
- && !group && nullable && format == Meta.Format.STRING) {
+ if (desc.length() + list.length + def.length() == 0 && !group
+ && nullable && format == Format.STRING) {
return null;
}
StringBuilder builder = new StringBuilder();
- builder.append("# ").append(desc);
- if (desc.length() > 20) {
- builder.append("\n#");
+ for (String line : desc.split("\n")) {
+ builder.append("# ").append(line).append("\n");
}
if (group) {
- builder.append("This item is used as a group, its content is not expected to be used.");
+ builder.append("# This item is used as a group, its content is not expected to be used.");
} else {
- builder.append(" (FORMAT: ").append(format)
- .append(nullable ? "" : " (required)");
- builder.append(") ").append(info);
+ builder.append("# (FORMAT: ").append(format)
+ .append(nullable ? "" : ", required");
+ builder.append(") ");
if (list.length > 0) {
- builder.append("\n# ALLOWED VALUES:");
+ builder.append("\n# ALLOWED VALUES: ");
+ boolean first = true;
for (String value : list) {
- builder.append(" \"").append(value).append("\"");
+ if (!first) {
+ builder.append(", ");
+ }
+ builder.append(BundleHelper.escape(value));
+ first = false;
}
}
if (array) {
- builder.append("\n# (This item accept a list of comma-separated values)");
+ builder.append("\n# (This item accepts a list of escaped comma-separated values)");
}
}
}
/**
- * Write the given id to the config file, i.e., "MY_ID = my_curent_value"
- * followed by a new line
+ * Write the given data to the config file, i.e., "MY_ID = my_curent_value"
+ * followed by a new line.
+ * <p>
+ * Will prepend a # sign if the is is not set (see
+ * {@link Bundle#isSet(Enum, boolean)}).
*
* @param writer
* the {@link Writer} to write into
* in case of IO error
*/
protected void writeValue(Writer writer, E id) throws IOException {
- writeValue(writer, id.name(), getString(id));
+ boolean set = isSet(id, false);
+ writeValue(writer, id.name(), getString(id), set);
}
/**
* Write the given data to the config file, i.e., "MY_ID = my_curent_value"
- * followed by a new line
+ * followed by a new line.
+ * <p>
+ * Will prepend a # sign if the is is not set.
*
* @param writer
* the {@link Writer} to write into
* the id to write
* @param value
* the id's value
+ * @param set
+ * the value is set in this {@link Bundle}
*
* @throws IOException
* in case of IO error
*/
- protected void writeValue(Writer writer, String id, String value)
- throws IOException {
+ protected void writeValue(Writer writer, String id, String value,
+ boolean set) throws IOException {
+
+ if (!set) {
+ writer.write('#');
+ }
+
writer.write(id);
writer.write(" = ");
File file = getPropertyFile(dir, name.name(), locale);
if (file != null) {
Reader reader = new InputStreamReader(new FileInputStream(
- file), "UTF8");
+ file), "UTF-8");
resetMap(new PropertyResourceBundle(reader));
found = true;
}
/**
* Reset the backing map to the content of the given bundle, or with default
- * valiues if bundle is NULL.
+ * values if bundle is NULL.
*
* @param bundle
* the bundle to copy