package ca.uhn.fhir.narrative.template.filters;
import ca.uhn.fhir.narrative.template.LValue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Output markup takes filters. Filters are simple methods. The first
* parameter is always the output of the left side of the filter. The
* return value of the filter will be the new left value when the next
* filter is run. When there are no more filters, the template will
* receive the resulting string.
* <p/>
* -- https://github.com/Shopify/liquid/wiki/Liquid-for-Designers
*/
public abstract class Filter extends LValue {
/**
* A map holding all filters.
*/
private static final Map<String, Filter> FILTERS = new HashMap<String, Filter>();
static {
// Initialize all standard filters.
registerFilter(new Append());
registerFilter(new Capitalize());
registerFilter(new Date());
registerFilter(new Divided_By());
registerFilter(new Downcase());
registerFilter(new Escape());
registerFilter(new Escape_Once());
registerFilter(new First());
registerFilter(new H());
registerFilter(new Join());
registerFilter(new Last());
registerFilter(new ca.uhn.fhir.narrative.template.filters.Map());
registerFilter(new Minus());
registerFilter(new Modulo());
registerFilter(new Newline_To_Br());
registerFilter(new Plus());
registerFilter(new Prepend());
registerFilter(new Remove());
registerFilter(new Remove_First());
registerFilter(new Replace());
registerFilter(new Replace_First());
registerFilter(new Size());
registerFilter(new Sort());
registerFilter(new Split());
registerFilter(new Strip_HTML());
registerFilter(new Strip_Newlines());
registerFilter(new Times());
registerFilter(new Truncate());
registerFilter(new Truncatewords());
registerFilter(new Upcase());
}
/**
* The name of the filter.
*/
public final String name;
/**
* Used for all package protected filters in the liqp.filters-package
* whose name is their class name lower cased.
*/
protected Filter() {
this.name = this.getClass().getSimpleName().toLowerCase();
}
/**
* Creates a new instance of a Filter.
*
* @param name
* the name of the filter.
*/
public Filter(String name) {
this.name = name;
}
/**
* Applies the filter on the 'value'.
*
* @param value
* the string value `AAA` in: `{{ 'AAA' | f:1,2,3 }}`
* @param params
* the values [1, 2, 3] in: `{{ 'AAA' | f:1,2,3 }}`
*
* @return the result of the filter.
*/
public abstract Object apply(Object value, Object... params);
/**
* Check the number of parameters and throws an exception if needed.
*
* @param params
* the parameters to check.
* @param expected
* the expected number of parameters.
*/
public final void checkParams(Object[] params, int expected) {
if(params == null || params.length != expected) {
throw new RuntimeException("Liquid error: wrong number of arguments (" +
(params == null ? 0 : params.length + 1) + " for " + (expected + 1) + ")");
}
}
/**
* Returns a value at a specific index from an array of parameters.
* If no such index exists, a RuntimeException is thrown.
*
* @param index
* the index of the value to be retrieved.
* @param params
* the values.
*
* @return a value at a specific index from an array of
* parameters.
*/
protected Object get(int index, Object... params) {
if (index >= params.length) {
throw new RuntimeException("error in filter '" + name +
"': cannot get param index: " + index +
" from: " + Arrays.toString(params));
}
return params[index];
}
/**
* Retrieves a filter with a specific name.
*
* @param name
* the name of the filter to retrieve.
*
* @return a filter with a specific name.
*/
public static Filter getFilter(String name) {
Filter filter = FILTERS.get(name);
if (filter == null) {
throw new RuntimeException("unknown filter: " + name);
}
return filter;
}
/**
* Returns all default filters.
*
* @return all default filters.
*/
public static Map<String, Filter> getFilters() {
return new HashMap<String, Filter>(FILTERS);
}
/**
* Registers a new filter.
*
* @param filter
* the filter to be registered.
*/
public static void registerFilter(Filter filter) {
FILTERS.put(filter.name, filter);
}
}