001
014
015 package com.liferay.portal.template;
016
017 import com.liferay.portal.deploy.sandbox.SandboxHandler;
018 import com.liferay.portal.kernel.cache.MultiVMPoolUtil;
019 import com.liferay.portal.kernel.cache.PortalCache;
020 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
021 import com.liferay.portal.kernel.template.StringTemplateResource;
022 import com.liferay.portal.kernel.template.Template;
023 import com.liferay.portal.kernel.template.TemplateException;
024 import com.liferay.portal.kernel.template.TemplateManager;
025 import com.liferay.portal.kernel.template.TemplateResource;
026 import com.liferay.portal.kernel.template.TemplateResourceLoader;
027 import com.liferay.portal.kernel.util.StringBundler;
028 import com.liferay.portal.kernel.util.StringPool;
029
030 import java.io.Serializable;
031 import java.io.Writer;
032
033 import javax.servlet.http.HttpServletRequest;
034
035
038 public abstract class AbstractTemplate implements Template {
039
040 public AbstractTemplate(
041 TemplateResource templateResource,
042 TemplateResource errorTemplateResource,
043 TemplateContextHelper templateContextHelper, String templateManagerName,
044 long interval) {
045
046 if (templateResource == null) {
047 throw new IllegalArgumentException("Template resource is null");
048 }
049
050 if (templateContextHelper == null) {
051 throw new IllegalArgumentException(
052 "Template context helper is null");
053 }
054
055 if (templateManagerName == null) {
056 throw new IllegalArgumentException("Template manager name is null");
057 }
058
059 this.templateResource = templateResource;
060 this.errorTemplateResource = errorTemplateResource;
061
062 _templateContextHelper = templateContextHelper;
063
064 if (interval != 0) {
065 _cacheTemplateResource(templateManagerName);
066 }
067 }
068
069 public void prepare(HttpServletRequest request) {
070 _templateContextHelper.prepare(this, request);
071 }
072
073 public boolean processTemplate(Writer writer) throws TemplateException {
074 if (errorTemplateResource == null) {
075 try {
076 processTemplate(templateResource, writer);
077
078 return true;
079 }
080 catch (Exception e) {
081 throw new TemplateException(
082 "Unable to process template " +
083 templateResource.getTemplateId(),
084 e);
085 }
086 }
087
088 Writer oldWriter = (Writer)get(WRITER);
089
090 try {
091 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
092
093 put(WRITER, unsyncStringWriter);
094
095 processTemplate(templateResource, unsyncStringWriter);
096
097 StringBundler sb = unsyncStringWriter.getStringBundler();
098
099 sb.writeTo(writer);
100
101 return true;
102 }
103 catch (Exception e) {
104 put(WRITER, writer);
105
106 handleException(e, writer);
107
108 return false;
109 }
110 finally {
111 put(WRITER, oldWriter);
112 }
113 }
114
115 protected String getTemplateResourceUUID(
116 TemplateResource templateResource) {
117
118 return TemplateResource.TEMPLATE_RESOURCE_UUID_PREFIX.concat(
119 StringPool.POUND).concat(templateResource.getTemplateId());
120 }
121
122 protected abstract void handleException(Exception exception, Writer writer)
123 throws TemplateException;
124
125 protected abstract void processTemplate(
126 TemplateResource templateResource, Writer writer)
127 throws Exception;
128
129 protected TemplateResource errorTemplateResource;
130 protected TemplateResource templateResource;
131
132 private void _cacheTemplateResource(String templateManagerName) {
133 String templateId = templateResource.getTemplateId();
134
135 if (templateManagerName.equals(TemplateManager.VELOCITY) &&
136 templateId.contains(SandboxHandler.SANDBOX_MARKER)) {
137
138 return;
139 }
140
141 if (!(templateResource instanceof CacheTemplateResource) &&
142 !(templateResource instanceof StringTemplateResource)) {
143
144 templateResource = new CacheTemplateResource(templateResource);
145 }
146
147 String cacheName = TemplateResourceLoader.class.getName();
148
149 cacheName = cacheName.concat(StringPool.PERIOD).concat(
150 templateManagerName);
151
152 PortalCache<String, Serializable> portalCache =
153 MultiVMPoolUtil.getCache(cacheName);
154
155 Object object = portalCache.get(templateResource.getTemplateId());
156
157 if ((object == null) || !templateResource.equals(object)) {
158 portalCache.put(templateResource.getTemplateId(), templateResource);
159 }
160
161 if (errorTemplateResource == null) {
162 return;
163 }
164
165 String errorTemplateId = errorTemplateResource.getTemplateId();
166
167 if (templateManagerName.equals(TemplateManager.VELOCITY) &&
168 errorTemplateId.contains(SandboxHandler.SANDBOX_MARKER)) {
169
170 return;
171 }
172
173 if (!(errorTemplateResource instanceof CacheTemplateResource) &&
174 !(errorTemplateResource instanceof StringTemplateResource)) {
175
176 errorTemplateResource = new CacheTemplateResource(
177 errorTemplateResource);
178 }
179
180 object = portalCache.get(errorTemplateResource.getTemplateId());
181
182 if ((object == null) || !errorTemplateResource.equals(object)) {
183 portalCache.put(
184 errorTemplateResource.getTemplateId(), errorTemplateResource);
185 }
186 }
187
188 private TemplateContextHelper _templateContextHelper;
189
190 }