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