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.kernel.template;
016    
017    import com.liferay.registry.Registry;
018    import com.liferay.registry.RegistryUtil;
019    import com.liferay.registry.ServiceReference;
020    import com.liferay.registry.ServiceTracker;
021    import com.liferay.registry.ServiceTrackerCustomizer;
022    
023    import java.util.Map;
024    import java.util.Set;
025    import java.util.concurrent.ConcurrentHashMap;
026    
027    /**
028     * @author Tina Tian
029     */
030    public class TemplateResourceLoaderUtil {
031    
032            public static void clearCache() {
033                    _instance._clearCache();
034            }
035    
036            public static void clearCache(String templateResourceLoaderName)
037                    throws TemplateException {
038    
039                    _instance._clearCache(templateResourceLoaderName);
040            }
041    
042            public static void clearCache(
043                            String templateResourceLoaderName, String templateId)
044                    throws TemplateException {
045    
046                    _instance._clearCache(templateResourceLoaderName, templateId);
047            }
048    
049            public static TemplateResource getTemplateResource(
050                            String templateResourceLoaderName, String templateId)
051                    throws TemplateException {
052    
053                    return _instance._getTemplateResource(
054                            templateResourceLoaderName, templateId);
055            }
056    
057            public static TemplateResourceLoader getTemplateResourceLoader(
058                            String templateResourceLoaderName)
059                    throws TemplateException {
060    
061                    return _instance._getTemplateResourceLoader(templateResourceLoaderName);
062            }
063    
064            public static Set<String> getTemplateResourceLoaderNames() {
065                    return _instance._getTemplateResourceLoaderNames();
066            }
067    
068            public static boolean hasTemplateResource(
069                            String templateResourceLoaderName, String templateId)
070                    throws TemplateException {
071    
072                    return _instance._hasTemplateResource(
073                            templateResourceLoaderName, templateId);
074            }
075    
076            public static boolean hasTemplateResourceLoader(
077                    String templateResourceLoaderName) {
078    
079                    return _instance._hasTemplateResourceLoader(templateResourceLoaderName);
080            }
081    
082            private TemplateResourceLoaderUtil() {
083                    Registry registry = RegistryUtil.getRegistry();
084    
085                    _serviceTracker = registry.trackServices(
086                            TemplateResourceLoader.class,
087                            new TemplateResourceLoaderTrackerCustomizer());
088    
089                    _serviceTracker.open();
090            }
091    
092            private void _clearCache() {
093                    for (TemplateResourceLoader templateResourceLoader :
094                                    _templateResourceLoaders.values()) {
095    
096                            templateResourceLoader.clearCache();
097                    }
098            }
099    
100            private void _clearCache(String templateResourceLoaderName)
101                    throws TemplateException {
102    
103                    TemplateResourceLoader templateResourceLoader =
104                            _getTemplateResourceLoader(templateResourceLoaderName);
105    
106                    templateResourceLoader.clearCache();
107            }
108    
109            private void _clearCache(
110                            String templateResourceLoaderName, String templateId)
111                    throws TemplateException {
112    
113                    TemplateResourceLoader templateResourceLoader =
114                            _getTemplateResourceLoader(templateResourceLoaderName);
115    
116                    templateResourceLoader.clearCache(templateId);
117            }
118    
119            private TemplateResource _getTemplateResource(
120                            String templateResourceLoaderName, String templateId)
121                    throws TemplateException {
122    
123                    TemplateResourceLoader templateResourceLoader =
124                            _getTemplateResourceLoader(templateResourceLoaderName);
125    
126                    return templateResourceLoader.getTemplateResource(templateId);
127            }
128    
129            private TemplateResourceLoader _getTemplateResourceLoader(
130                            String templateResourceLoaderName)
131                    throws TemplateException {
132    
133                    TemplateResourceLoader templateResourceLoader =
134                            _templateResourceLoaders.get(templateResourceLoaderName);
135    
136                    if (templateResourceLoader == null) {
137                            throw new TemplateException(
138                                    "Unsupported template resource loader " +
139                                            templateResourceLoaderName);
140                    }
141    
142                    return templateResourceLoader;
143            }
144    
145            private Set<String> _getTemplateResourceLoaderNames() {
146                    return _templateResourceLoaders.keySet();
147            }
148    
149            private boolean _hasTemplateResource(
150                            String templateResourceLoaderName, String templateId)
151                    throws TemplateException {
152    
153                    TemplateResourceLoader templateResourceLoader =
154                            _getTemplateResourceLoader(templateResourceLoaderName);
155    
156                    return templateResourceLoader.hasTemplateResource(templateId);
157            }
158    
159            private boolean _hasTemplateResourceLoader(
160                    String templateResourceLoaderName) {
161    
162                    return _templateResourceLoaders.containsKey(templateResourceLoaderName);
163            }
164    
165            private static final TemplateResourceLoaderUtil _instance =
166                    new TemplateResourceLoaderUtil();
167    
168            private final ServiceTracker<TemplateResourceLoader, TemplateResourceLoader>
169                    _serviceTracker;
170            private final Map<String, TemplateResourceLoader> _templateResourceLoaders =
171                    new ConcurrentHashMap<>();
172    
173            private class TemplateResourceLoaderTrackerCustomizer
174                    implements ServiceTrackerCustomizer
175                            <TemplateResourceLoader, TemplateResourceLoader> {
176    
177                    @Override
178                    public TemplateResourceLoader addingService(
179                            ServiceReference<TemplateResourceLoader> serviceReference) {
180    
181                            Registry registry = RegistryUtil.getRegistry();
182    
183                            TemplateResourceLoader templateResourceLoader = registry.getService(
184                                    serviceReference);
185    
186                            _templateResourceLoaders.put(
187                                    templateResourceLoader.getName(), templateResourceLoader);
188    
189                            return templateResourceLoader;
190                    }
191    
192                    @Override
193                    public void modifiedService(
194                            ServiceReference<TemplateResourceLoader> serviceReference,
195                            TemplateResourceLoader templateResourceLoader) {
196                    }
197    
198                    @Override
199                    public void removedService(
200                            ServiceReference<TemplateResourceLoader> serviceReference,
201                            TemplateResourceLoader templateResourceLoader) {
202    
203                            _templateResourceLoaders.remove(templateResourceLoader.getName());
204    
205                            templateResourceLoader.clearCache();
206    
207                            templateResourceLoader.destroy();
208    
209                            Registry registry = RegistryUtil.getRegistry();
210    
211                            registry.ungetService(serviceReference);
212                    }
213    
214            }
215    
216    }