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