in velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java [1475:1566]
public boolean render(Context context, Writer writer,
String logTag, SimpleNode nodeTree)
{
/*
* we want to init then render
*/
InternalContextAdapterImpl ica =
new InternalContextAdapterImpl(context);
ica.pushCurrentTemplateName(logTag);
try
{
try
{
nodeTree.init(ica, this);
}
catch (TemplateInitException pex)
{
throw new ParseErrorException(pex, null);
}
/*
* pass through application level runtime exceptions
*/
catch(RuntimeException e)
{
throw e;
}
catch(Exception e)
{
String msg = "RuntimeInstance.render(): init exception for tag = "+logTag;
log.error(msg, e);
throw new VelocityException(msg, e, getLogContext().getStackTrace());
}
try
{
if (isScopeControlEnabled(evaluateScopeName))
{
Object previous = ica.get(evaluateScopeName);
context.put(evaluateScopeName, new Scope(this, previous));
}
/*
* optionally put the context in itself if asked so
*/
String self = getString(CONTEXT_AUTOREFERENCE_KEY);
if (self != null) context.put(self, context);
nodeTree.render(ica, writer);
}
catch (StopCommand stop)
{
if (!stop.isFor(this))
{
throw stop;
}
else
{
log.debug(stop.getMessage());
}
}
catch (IOException e)
{
throw new VelocityException("IO Error in writer: " + e.getMessage(), e, getLogContext().getStackTrace());
}
}
finally
{
ica.popCurrentTemplateName();
if (isScopeControlEnabled(evaluateScopeName))
{
Object obj = ica.get(evaluateScopeName);
if (obj instanceof Scope)
{
Scope scope = (Scope)obj;
if (scope.getParent() != null)
{
ica.put(evaluateScopeName, scope.getParent());
}
else if (scope.getReplaced() != null)
{
ica.put(evaluateScopeName, scope.getReplaced());
}
else
{
ica.remove(evaluateScopeName);
}
}
}
}
return true;
}