4

StringTemplate allows programmers to fetch data through getters(a function with no arguments).

I would like to know that Is it possible to call Java function with arguments from String Template?

2
  • Not really. That would allow "executing code" and violating separations. However, the attribute format support -- e.g. format="1,2,3,4" could be abused... Commented Jun 13, 2012 at 6:29
  • 1
    It's also possible to artificially simulate function-like behaviour by creating a map and putting into it some values and expected results. Then you can use such a map like a function in the template: <object.map.("value")> Commented Jun 22, 2012 at 9:31

1 Answer 1

0

There is a workaround by abusing dictionaries. Here is an example of implementing "function" for limiting item count in a List (issue on github).

In your code add dictionary:

group.defineDictionary("max", new MaxListItemsLimiter());

Usage (in this example first item in array is max. items count):

<max.(["50",myObject.items]):{msg|<msg.something>}>

final class MaxListItemsLimiter extends AbstractMap<String, Object> {

    @Override
    public Object get(Object key) {
        List items = (List) key;
        if (!items.isEmpty()) {
            //First item is max. count
            Integer limit = NumberUtils.toInt(items.get(0).toString(), -1); //use Integer.parseInt
            if (limit != -1) {
                return items.subList(1, Math.min(items.size(), limit + 1));
            } else {
                throw new AssertionError("First parameter in max must be number");
            }
        } else {
            return super.get(key);
        }
    }

    @Override
    public Set<Map.Entry<String, Object>> entrySet() {
        return Collections.emptySet();
    }

    @Override
    public boolean containsKey(Object key) {
        if (key instanceof List) {
            return true;
        } else {
            throw new AssertionError("You can use max only on Lists.");
        }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.