001
014
015 package com.liferay.portal.freemarker;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.util.InstanceFactory;
020
021 import freemarker.cache.TemplateLoader;
022
023 import java.io.IOException;
024 import java.io.Reader;
025
026 import java.util.ArrayList;
027 import java.util.List;
028 import java.util.Map;
029 import java.util.concurrent.ConcurrentHashMap;
030
031
034 public class LiferayTemplateLoader implements TemplateLoader {
035
036 public void closeTemplateSource(Object templateSource) {
037 LiferayTemplateSource liferayTemplateSource =
038 (LiferayTemplateSource)templateSource;
039
040 liferayTemplateSource.close();
041 }
042
043 public Object findTemplateSource(String name) throws IOException {
044 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
045 _freeMarkerTemplateLoadersMap.get(name);
046
047 if (freeMarkerTemplateLoader != null) {
048 Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
049 name);
050
051 if (templateSource != null) {
052 return new LiferayTemplateSource(
053 freeMarkerTemplateLoader, templateSource);
054 }
055 }
056
057 for (int i = 0; i < _freeMarkerTemplateLoaders.length; i++) {
058 freeMarkerTemplateLoader = _freeMarkerTemplateLoaders[i];
059
060 Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
061 name);
062
063 if (templateSource != null) {
064 _freeMarkerTemplateLoadersMap.put(
065 name, freeMarkerTemplateLoader);
066
067 return new LiferayTemplateSource(
068 freeMarkerTemplateLoader, templateSource);
069 }
070 }
071
072 return null;
073 }
074
075 public long getLastModified(Object templateSource) {
076 LiferayTemplateSource liferayTemplateSource =
077 (LiferayTemplateSource)templateSource;
078
079 return liferayTemplateSource.getLastModified();
080 }
081
082 public Reader getReader(Object templateSource, String encoding)
083 throws IOException {
084
085 LiferayTemplateSource liferayTemplateSource =
086 (LiferayTemplateSource)templateSource;
087
088 return liferayTemplateSource.getReader(encoding);
089 }
090
091 public void setTemplateLoaders(
092 String[] freeMarkerTemplateLoaderClassNames) {
093
094 List<FreeMarkerTemplateLoader> freeMarkerTemplateLoaders =
095 new ArrayList<FreeMarkerTemplateLoader>(
096 freeMarkerTemplateLoaderClassNames.length);
097
098 for (String freeMarkerTemplateLoaderClassName :
099 freeMarkerTemplateLoaderClassNames) {
100
101 try {
102 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
103 (FreeMarkerTemplateLoader)InstanceFactory.newInstance(
104 freeMarkerTemplateLoaderClassName);
105
106 freeMarkerTemplateLoaders.add(freeMarkerTemplateLoader);
107 }
108 catch (Exception e) {
109 _log.error(e, e);
110 }
111 }
112
113 _freeMarkerTemplateLoaders = freeMarkerTemplateLoaders.toArray(
114 new FreeMarkerTemplateLoader[freeMarkerTemplateLoaders.size()]);
115 }
116
117 private static Log _log = LogFactoryUtil.getLog(
118 LiferayTemplateLoader.class);
119
120 private FreeMarkerTemplateLoader[] _freeMarkerTemplateLoaders;
121 private Map<String, FreeMarkerTemplateLoader>
122 _freeMarkerTemplateLoadersMap =
123 new ConcurrentHashMap<String, FreeMarkerTemplateLoader>();
124
125 }