Получаване на списък със запазени места от шаблон Velocity

да предположим, че имам шаблон Velocity като този:

Hi!, my name is ${name} and I'm ${age} years old.

Обърнете внимание, че шаблонът няма цикли или условни изрази.

Бих искал да получа списък с тези стойности

["name", "age"]

Проверих API, но изглежда, че класът Template няма метод за това: https://velocity.apache.org/engine/releases/velocity-1.7/apidocs/org/apache/velocity/Template.html

Как мога да получа този списък с помощта на velocity, без сам да анализирам шаблона?


person ordago    schedule 30.04.2013    source източник
comment
Направих това, но в момента не разполагам с източника. Мисля, че в крайна сметка използвах посетителите, но не мога да си спомня подробностите.   -  person Dave Newton    schedule 30.04.2013
comment
Вие може да успеете да внедрите свой собствен Context, който добавя ключовете на извиквания към containsKey или get към Set<String>, и да го използвате заедно с NullWriter (commons-io) в стъпка на предварителна обработка. Освен че някак си се чувства зле, това също страда от теоретичния недостатък, че никой не гарантира (въпреки че трябва да работи, мисля), че Velocity ще извика някой от двата метода, защото не намира никакви ключове появява се в getKeys().   -  person misberner    schedule 30.04.2013


Отговори (1)


Търсих начин да извлека списък с всички ключове, използвани и в шаблон Velocity. Както бе споменато в един от коментарите, можете да внедрите свой собствен посетител, който да преминава през всички възли в шаблона Velocity.

Ето един фрагмент, който съхранява ключовете, които се срещат в шаблона, и ги отпечатва след това:

VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
props.put("resource.loader", "class");
ve.init(props);
Template t = ve.getTemplate("templates/my-template.vm");

final List<String> keys = new ArrayList<String>();
SimpleNode sn = (SimpleNode)t.getData();
BaseVisitor myVisitor = new BaseVisitor(){
    @Override
    public Object visit(ASTReference node, Object data){
        String key = node.literal();
        keys.add(key);
        return super.visit(node, data);
    }
};
sn.jjtAccept(myVisitor, new Object());
for (String key : keys) {
    System.out.println(key);
}

Например, ако вашият шаблон Velocity има следното съдържание:

<p>Dear ${user.name}, the ordered package has been sent to ${user.address}.</p>

Следното ще бъде отпечатано:

${user.name}
${user.address}
person Yannick De Turck    schedule 16.12.2014