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 public void setTemplateLoaders(
091 String[] freeMarkerTemplateLoaderClassNames) {
092
093 List<FreeMarkerTemplateLoader> freeMarkerTemplateLoaders =
094 new ArrayList<FreeMarkerTemplateLoader>(
095 freeMarkerTemplateLoaderClassNames.length);
096
097 for (String freeMarkerTemplateLoaderClassName :
098 freeMarkerTemplateLoaderClassNames) {
099
100 try {
101 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
102 (FreeMarkerTemplateLoader)InstanceFactory.newInstance(
103 freeMarkerTemplateLoaderClassName);
104
105 freeMarkerTemplateLoaders.add(freeMarkerTemplateLoader);
106 }
107 catch (Exception e) {
108 _log.error(e, e);
109 }
110 }
111
112 _freeMarkerTemplateLoaders = freeMarkerTemplateLoaders.toArray(
113 new FreeMarkerTemplateLoader[freeMarkerTemplateLoaders.size()]);
114 }
115
116 private static Log _log = LogFactoryUtil.getLog(
117 LiferayTemplateLoader.class);
118
119 private FreeMarkerTemplateLoader[] _freeMarkerTemplateLoaders;
120 private Map<String, FreeMarkerTemplateLoader>
121 _freeMarkerTemplateLoadersMap =
122 new ConcurrentHashMap<String, FreeMarkerTemplateLoader>();
123
124 }