/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.template.velocity.internal;
import com.liferay.portal.kernel.template.StringTemplateResource;
import com.liferay.portal.kernel.template.TemplateConstants;
import com.liferay.portal.kernel.template.TemplateException;
import com.liferay.portal.kernel.template.TemplateResource;
import com.liferay.portal.template.AbstractSingleResourceTemplate;
import com.liferay.portal.template.TemplateContextHelper;
import com.liferay.portal.template.TemplateResourceThreadLocal;
import java.io.Writer;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Map;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
/**
* @author Tina Tian
*/
public class VelocityTemplate extends AbstractSingleResourceTemplate {
public VelocityTemplate(
TemplateResource templateResource,
TemplateResource errorTemplateResource, Map<String, Object> context,
VelocityEngine velocityEngine,
TemplateContextHelper templateContextHelper,
int resourceModificationCheckInterval, boolean privileged) {
super(
templateResource, errorTemplateResource, context,
templateContextHelper, TemplateConstants.LANG_TYPE_VM,
resourceModificationCheckInterval);
_velocityContext = new VelocityContext(super.context);
_velocityEngine = velocityEngine;
_privileged = privileged;
}
@Override
protected void handleException(Exception exception, Writer writer)
throws TemplateException {
put("exception", exception.getMessage());
if (templateResource instanceof StringTemplateResource) {
StringTemplateResource stringTemplateResource =
(StringTemplateResource)templateResource;
put("script", stringTemplateResource.getContent());
}
if (exception instanceof ParseErrorException) {
ParseErrorException pee = (ParseErrorException)exception;
put("column", pee.getColumnNumber());
put("line", pee.getLineNumber());
}
try {
processTemplate(errorTemplateResource, writer);
}
catch (Exception e) {
throw new TemplateException(
"Unable to process Velocity template " +
errorTemplateResource.getTemplateId(),
e);
}
}
@Override
protected void processTemplate(
TemplateResource templateResource, Writer writer)
throws Exception {
TemplateResourceThreadLocal.setTemplateResource(
TemplateConstants.LANG_TYPE_VM, templateResource);
try {
Template template = null;
if (_privileged) {
template = AccessController.doPrivileged(
new TemplatePrivilegedExceptionAction(templateResource));
}
else {
template = _velocityEngine.getTemplate(
getTemplateResourceUUID(templateResource),
TemplateConstants.DEFAUT_ENCODING);
}
template.merge(_velocityContext, writer);
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
finally {
TemplateResourceThreadLocal.setTemplateResource(
TemplateConstants.LANG_TYPE_VM, null);
}
}
private final boolean _privileged;
private final VelocityContext _velocityContext;
private final VelocityEngine _velocityEngine;
private class TemplatePrivilegedExceptionAction
implements PrivilegedExceptionAction<Template> {
public TemplatePrivilegedExceptionAction(
TemplateResource templateResource) {
_templateResource = templateResource;
}
@Override
public Template run() throws Exception {
return _velocityEngine.getTemplate(
getTemplateResourceUUID(_templateResource),
TemplateConstants.DEFAUT_ENCODING);
}
private final TemplateResource _templateResource;
}
}