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 @Override
074 public void prepare(HttpServletRequest request) {
075 _templateContextHelper.prepare(this, request);
076 }
077
078 @Override
079 protected void doProcessTemplate(Writer writer) throws TemplateException {
080 if (errorTemplateResource == null) {
081 try {
082 processTemplate(templateResource, writer);
083
084 return;
085 }
086 catch (Exception e) {
087 throw new TemplateException(
088 "Unable to process template " +
089 templateResource.getTemplateId(),
090 e);
091 }
092 }
093
094 Writer oldWriter = (Writer)get(TemplateConstants.WRITER);
095
096 try {
097 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
098
099 put(TemplateConstants.WRITER, unsyncStringWriter);
100
101 processTemplate(templateResource, unsyncStringWriter);
102
103 StringBundler sb = unsyncStringWriter.getStringBundler();
104
105 sb.writeTo(writer);
106 }
107 catch (Exception e) {
108 put(TemplateConstants.WRITER, writer);
109
110 handleException(e, writer);
111 }
112 finally {
113 put(TemplateConstants.WRITER, oldWriter);
114 }
115 }
116
117 protected String getTemplateResourceUUID(
118 TemplateResource templateResource) {
119
120 return TemplateConstants.TEMPLATE_RESOURCE_UUID_PREFIX.concat(
121 StringPool.POUND).concat(templateResource.getTemplateId());
122 }
123
124 protected abstract void handleException(Exception exception, Writer writer)
125 throws TemplateException;
126
127 protected abstract void processTemplate(
128 TemplateResource templateResource, Writer writer)
129 throws Exception;
130
131 protected TemplateResource errorTemplateResource;
132 protected TemplateResource templateResource;
133
134 private void _cacheTemplateResource(String templateManagerName) {
135 String templateId = templateResource.getTemplateId();
136
137 if (templateManagerName.equals(TemplateConstants.LANG_TYPE_VM) &&
138 templateId.contains(SandboxHandler.SANDBOX_MARKER)) {
139
140 return;
141 }
142
143 if (!(templateResource instanceof CacheTemplateResource) &&
144 !(templateResource instanceof StringTemplateResource)) {
145
146 templateResource = new CacheTemplateResource(templateResource);
147 }
148
149 String cacheName = TemplateResourceLoader.class.getName();
150
151 cacheName = cacheName.concat(StringPool.PERIOD).concat(
152 templateManagerName);
153
154 PortalCache<String, Serializable> portalCache =
155 MultiVMPoolUtil.getCache(cacheName);
156
157 Object object = portalCache.get(templateResource.getTemplateId());
158
159 if ((object == null) || !templateResource.equals(object)) {
160 portalCache.put(templateResource.getTemplateId(), templateResource);
161 }
162
163 if (errorTemplateResource == null) {
164 return;
165 }
166
167 String errorTemplateId = errorTemplateResource.getTemplateId();
168
169 if (templateManagerName.equals(TemplateConstants.LANG_TYPE_VM) &&
170 errorTemplateId.contains(SandboxHandler.SANDBOX_MARKER)) {
171
172 return;
173 }
174
175 if (!(errorTemplateResource instanceof CacheTemplateResource) &&
176 !(errorTemplateResource instanceof StringTemplateResource)) {
177
178 errorTemplateResource = new CacheTemplateResource(
179 errorTemplateResource);
180 }
181
182 object = portalCache.get(errorTemplateResource.getTemplateId());
183
184 if ((object == null) || !errorTemplateResource.equals(object)) {
185 portalCache.put(
186 errorTemplateResource.getTemplateId(), errorTemplateResource);
187 }
188 }
189
190 private TemplateContextHelper _templateContextHelper;
191
192 }