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 @Override
037 public void closeTemplateSource(Object templateSource) {
038 LiferayTemplateSource liferayTemplateSource =
039 (LiferayTemplateSource)templateSource;
040
041 liferayTemplateSource.close();
042 }
043
044 @Override
045 public Object findTemplateSource(String name) throws IOException {
046 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
047 _freeMarkerTemplateLoadersMap.get(name);
048
049 if (freeMarkerTemplateLoader != null) {
050 Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
051 name);
052
053 if (templateSource != null) {
054 return new LiferayTemplateSource(
055 freeMarkerTemplateLoader, templateSource);
056 }
057 }
058
059 for (int i = 0; i < _freeMarkerTemplateLoaders.length; i++) {
060 freeMarkerTemplateLoader = _freeMarkerTemplateLoaders[i];
061
062 Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
063 name);
064
065 if (templateSource != null) {
066 _freeMarkerTemplateLoadersMap.put(
067 name, freeMarkerTemplateLoader);
068
069 return new LiferayTemplateSource(
070 freeMarkerTemplateLoader, templateSource);
071 }
072 }
073
074 return null;
075 }
076
077 @Override
078 public long getLastModified(Object templateSource) {
079 LiferayTemplateSource liferayTemplateSource =
080 (LiferayTemplateSource)templateSource;
081
082 return liferayTemplateSource.getLastModified();
083 }
084
085 @Override
086 public Reader getReader(Object templateSource, String encoding)
087 throws IOException {
088
089 LiferayTemplateSource liferayTemplateSource =
090 (LiferayTemplateSource)templateSource;
091
092 return liferayTemplateSource.getReader(encoding);
093 }
094
095 public void setTemplateLoaders(
096 String[] freeMarkerTemplateLoaderClassNames) {
097
098 List<FreeMarkerTemplateLoader> freeMarkerTemplateLoaders =
099 new ArrayList<FreeMarkerTemplateLoader>(
100 freeMarkerTemplateLoaderClassNames.length);
101
102 for (String freeMarkerTemplateLoaderClassName :
103 freeMarkerTemplateLoaderClassNames) {
104
105 try {
106 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
107 (FreeMarkerTemplateLoader)InstanceFactory.newInstance(
108 freeMarkerTemplateLoaderClassName);
109
110 freeMarkerTemplateLoaders.add(freeMarkerTemplateLoader);
111 }
112 catch (Exception e) {
113 _log.error(e, e);
114 }
115 }
116
117 _freeMarkerTemplateLoaders = freeMarkerTemplateLoaders.toArray(
118 new FreeMarkerTemplateLoader[freeMarkerTemplateLoaders.size()]);
119 }
120
121 private static Log _log = LogFactoryUtil.getLog(
122 LiferayTemplateLoader.class);
123
124 private FreeMarkerTemplateLoader[] _freeMarkerTemplateLoaders;
125 private Map<String, FreeMarkerTemplateLoader>
126 _freeMarkerTemplateLoadersMap =
127 new ConcurrentHashMap<String, FreeMarkerTemplateLoader>();
128
129 }