Add ability to pass CharSequence instead of forcing String for context variable.
java.lang.String is immutable and cannot be overwritten by user. When passing sensitive data as context variable String remains in memory until GC removes it. CharSequence allows user to provide his own implementation and overwrite data as needed.
This commit is contained in:
@@ -203,10 +203,25 @@ public class Mustache {
|
||||
* then empty strings are considered falsey. If {@link #zeroIsFalse} is true, then zero
|
||||
* values are considered falsey. */
|
||||
public boolean isFalsey (Object value) {
|
||||
return ((emptyStringIsFalse && "".equals(formatter.format(value))) ||
|
||||
return ((emptyStringIsFalse && isEmptyCharSequence(formatter.format(value))) ||
|
||||
(zeroIsFalse && (value instanceof Number) && ((Number)value).longValue() == 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces "".equals(value). E.g. only not null values with length 0
|
||||
*/
|
||||
private boolean isEmptyCharSequence(Object value) {
|
||||
if (value == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(value instanceof CharSequence) {
|
||||
return ((CharSequence) value).length() == 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Loads and compiles the template {@code name} using this compiler's configured template
|
||||
* loader. Note that this does no caching: the caller should cache the loaded template if
|
||||
* they expect to use it multiple times.
|
||||
@@ -255,8 +270,8 @@ public class Mustache {
|
||||
/** Handles converting objects to strings when rendering templates. */
|
||||
public interface Formatter {
|
||||
|
||||
/** Converts {@code value} to a string for inclusion in a template. */
|
||||
String format (Object value);
|
||||
/** Converts {@code value} to a CharSequence for inclusion in a template. */
|
||||
CharSequence format (Object value);
|
||||
}
|
||||
|
||||
/** Handles lambdas. */
|
||||
@@ -295,6 +310,11 @@ public class Mustache {
|
||||
|
||||
/** Returns {@code raw} with the appropriate characters replaced with escape sequences. */
|
||||
String escape (String raw);
|
||||
|
||||
/** Returns {@code raw} with the appropriate characters replaced with escape sequences. **/
|
||||
default CharSequence escape (CharSequence raw) {
|
||||
return escape(raw.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/** Handles loading partial templates. */
|
||||
|
||||
@@ -384,9 +384,9 @@ public class Template {
|
||||
|
||||
abstract void visit (Mustache.Visitor visitor);
|
||||
|
||||
protected static void write (Writer out, String data) {
|
||||
protected static void write (Writer out, CharSequence data) {
|
||||
try {
|
||||
out.write(data);
|
||||
out.append(data);
|
||||
} catch (IOException ioe) {
|
||||
throw new MustacheException(ioe);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user