001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
037     * @author Miroslav Ligas
038     */
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    }