Re: Apache Velocity : Verify if all substitutions are made

Christopher Schultz <[email protected]> Tue, 13 Jun 2023 09:43:56 -0400
Newsgroups gmane.comp.jakarta.velocity.user
Message-ID <[email protected]>
Debraj,

On 6/13/23 05:38, Debraj Manna wrote:
> Can someone let me know how I can verify a velocity context against a
> template? Basically, I want to throw some error if all variables are not
> substituted in the velocity template.
> 
> For example, let's say I have a velocity template, card.vm
> 
>    card {
>      type: CREDIT
>      company: VISA
>      name: "${firstName} ${lastName}"
>    }
> 
> The substitution is done like below
> 
> VelocityEngine velocityEngine = new VelocityEngine();
> velocityEngine.init();
> 
> Template t = velocityEngine.getTemplate("card.vm");
> 
> VelocityContext context = new VelocityContext();
> context.put("firstName", "tuk");
> StringWriter writer = new StringWriter();
> t.merge( context, writer );
> 
> In this case, I want to throw some error specifying that lastName is not
> replaced in template.
> 
> Does velocity provide anything for this?

No, but it would be easy to do. Instead of using the basic 
VelocityContext, wrap it in a custom one, something like this:

public class WarningVelocityContext
     extends VelocityContext
{
     public Object get(String key) {
         Object o = super.get(key);

         if(null == o) {
             throw new IllegalStateException("Key {" + key + "} has not 
been set");
         }
     }
}

Then in your code, wrap the context right before merging:

t.merge(new WarningVelocityContext(context), writer);

Note that this will throw exceptions for *anything* that's not found for 
any reason. If you try something like:

$someObject.method()

And "someObject" is null, then you'll get an error. It may be difficult 
to tell the difference between the things you "care about" and the 
things you do not. If you have a simple use-case, then probably this 
will work.

-chris