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