001
014
015 package com.liferay.portal.velocity;
016
017 import com.liferay.portal.kernel.template.StringTemplateResource;
018 import com.liferay.portal.kernel.template.TemplateConstants;
019 import com.liferay.portal.kernel.template.TemplateException;
020 import com.liferay.portal.kernel.template.TemplateResource;
021 import com.liferay.portal.template.AbstractTemplate;
022 import com.liferay.portal.template.TemplateContextHelper;
023 import com.liferay.portal.template.TemplateResourceThreadLocal;
024 import com.liferay.portal.util.PropsValues;
025
026 import java.io.Writer;
027
028 import java.security.AccessController;
029 import java.security.PrivilegedActionException;
030 import java.security.PrivilegedExceptionAction;
031
032 import java.util.Map;
033
034 import org.apache.velocity.Template;
035 import org.apache.velocity.VelocityContext;
036 import org.apache.velocity.app.VelocityEngine;
037 import org.apache.velocity.exception.ParseErrorException;
038
039
042 public class VelocityTemplate extends AbstractTemplate {
043
044 public VelocityTemplate(
045 TemplateResource templateResource,
046 TemplateResource errorTemplateResource, Map<String, Object> context,
047 VelocityEngine velocityEngine,
048 TemplateContextHelper templateContextHelper, boolean privileged) {
049
050 super(
051 templateResource, errorTemplateResource, context,
052 templateContextHelper, TemplateConstants.LANG_TYPE_VM,
053 PropsValues.VELOCITY_ENGINE_RESOURCE_MODIFICATION_CHECK_INTERVAL);
054
055 _velocityContext = new VelocityContext(super.context);
056 _velocityEngine = velocityEngine;
057 _privileged = privileged;
058 }
059
060 @Override
061 protected void handleException(Exception exception, Writer writer)
062 throws TemplateException {
063
064 put("exception", exception.getMessage());
065
066 if (templateResource instanceof StringTemplateResource) {
067 StringTemplateResource stringTemplateResource =
068 (StringTemplateResource)templateResource;
069
070 put("script", stringTemplateResource.getContent());
071 }
072
073 if (exception instanceof ParseErrorException) {
074 ParseErrorException pee = (ParseErrorException)exception;
075
076 put("column", pee.getColumnNumber());
077 put("line", pee.getLineNumber());
078 }
079
080 try {
081 processTemplate(errorTemplateResource, writer);
082 }
083 catch (Exception e) {
084 throw new TemplateException(
085 "Unable to process Velocity template " +
086 errorTemplateResource.getTemplateId(),
087 e);
088 }
089 }
090
091 @Override
092 protected void processTemplate(
093 TemplateResource templateResource, Writer writer)
094 throws Exception {
095
096 TemplateResourceThreadLocal.setTemplateResource(
097 TemplateConstants.LANG_TYPE_VM, templateResource);
098
099 try {
100 Template template = null;
101
102 if (_privileged) {
103 template = AccessController.doPrivileged(
104 new TemplatePrivilegedExceptionAction(templateResource));
105 }
106 else {
107 template = _velocityEngine.getTemplate(
108 getTemplateResourceUUID(templateResource),
109 TemplateConstants.DEFAUT_ENCODING);
110 }
111
112 template.merge(_velocityContext, writer);
113 }
114 catch (PrivilegedActionException pae) {
115 throw pae.getException();
116 }
117 finally {
118 TemplateResourceThreadLocal.setTemplateResource(
119 TemplateConstants.LANG_TYPE_VM, null);
120 }
121 }
122
123 private boolean _privileged;
124 private VelocityContext _velocityContext;
125 private VelocityEngine _velocityEngine;
126
127 private class TemplatePrivilegedExceptionAction
128 implements PrivilegedExceptionAction<Template> {
129
130 public TemplatePrivilegedExceptionAction(
131 TemplateResource templateResource) {
132
133 _templateResource = templateResource;
134 }
135
136 @Override
137 public Template run() throws Exception {
138 return _velocityEngine.getTemplate(
139 getTemplateResourceUUID(_templateResource),
140 TemplateConstants.DEFAUT_ENCODING);
141 }
142
143 private TemplateResource _templateResource;
144
145 }
146
147 }