2014-09-25 3 views
0

Я использую Apache Velocity для замены токенов через шаблоны который выглядит следующим образом:Проверьте маркеры были заменены

<batch> 
    #set($appName = "helloworld") 
    #set($appDisplayName = "Hello World App") 
    #set($appVersion = "1.0") 
    <registerapplication> 
     <appkey>$appkey</appkey> 
     <appname>$appName</appname> 
     <appversion>$appVersion</appversion> 
     <appdescriptiondefault>$appDisplayName</appdescriptiondefault> 
    </registerapplication> 
</batch> 

Следующие три строки кода, сделать трюк:

Velocity.init(); 
StringWriter w = new StringWriter(); 
Velocity.evaluate(new VelocityContext(), w, "", new InputStreamReader(inputStream); 

Он работает отлично, но у меня есть дополнительное требование. Если некоторые замены действительно сделаны, пользователь должен получить уведомление. В противном случае, т. Е. Если шаблон выглядит как

<batch> 
    #set($appName = "helloworld") 
    #set($appDisplayName = "Hello World App") 
    #set($appVersion = "1.0") 
    <registerapplication> 
     <appkey>$appkey</appkey> 
     <appname>helloworld</appname> 
     <appdescriptiondefault>Hello World App</appdescriptiondefault> 
    </registerapplication> 
</batch> 

не следует предпринимать никаких действий.

Любая идея, как достичь этого?

upd Благодаря Клоду Бриссон. Мое решение выглядит следующим образом:

VelocityContext velocityContext = new VelocityContext(); 
EventCartridge eventCartridge = new EventCartridge(); 
velocityContext.attachEventCartridge(eventCartridge); 
eventCartridge.addReferenceInsertionEventHandler(new ReferenceInsertionEventHandler() 
{ 
     @Override 
    public Object referenceInsert(String reference, Object value) 
    { 
     if (!varSubsituted && value != null) 
     { 
      varSubsituted = true; 
     } 
     return value; 
    } 
}); 

ответ

0

Вы можете использовать обработчик ссылки.

Во-первых, создать класс обработчика:

package mypackage; 
import org.apache.velocity.app.event.ReferenceInsertionEventHandler; 

public class MyHandler implements ReferenceInsertionEventHandler 
{ 
    public Object referenceInsert(String reference, Object value ) 
    { 
     // ...notify user... 
    } 
} 

Вы можете зарегистрировать обработчик в ваших velocity.properties файл, с:

eventhandler.referenceinsertion.class = mypackage.UserNotifyHandler 

В многопоточном приложении к, так как Velocity является однопоточным, вы можете использовать глобальную переменную, зависящую от потока, чтобы содержать информацию о пользователе, так как она вам понадобится из вашего обработчика.

Смежные вопросы