1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.freemarker;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.util.InstanceFactory;
20  
21  import freemarker.cache.TemplateLoader;
22  
23  import java.io.IOException;
24  import java.io.Reader;
25  
26  import java.util.ArrayList;
27  import java.util.List;
28  import java.util.Map;
29  import java.util.concurrent.ConcurrentHashMap;
30  
31  /**
32   * <a href="LiferayTemplateLoader.java.html"><b><i>View Source</i></b></a>
33   *
34   * @author Mika Koivisto
35   */
36  public class LiferayTemplateLoader implements TemplateLoader {
37  
38      public void closeTemplateSource(Object templateSource) {
39          LiferayTemplateSource liferayTemplateSource =
40              (LiferayTemplateSource)templateSource;
41  
42          liferayTemplateSource.close();
43      }
44  
45      public Object findTemplateSource(String name) throws IOException {
46          FreeMarkerTemplateLoader freeMarkerTemplateLoader =
47              _freeMarkerTemplateLoadersMap.get(name);
48  
49          if (freeMarkerTemplateLoader != null) {
50              Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
51                  name);
52  
53              if (templateSource != null) {
54                  return new LiferayTemplateSource(
55                      freeMarkerTemplateLoader, templateSource);
56              }
57          }
58  
59          for (int i = 0; i < _freeMarkerTemplateLoaders.length; i++) {
60              freeMarkerTemplateLoader = _freeMarkerTemplateLoaders[i];
61  
62              Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
63                  name);
64  
65              if (templateSource != null) {
66                  _freeMarkerTemplateLoadersMap.put(
67                      name, freeMarkerTemplateLoader);
68  
69                  return new LiferayTemplateSource(
70                      freeMarkerTemplateLoader, templateSource);
71              }
72          }
73  
74          return null;
75      }
76  
77      public long getLastModified(Object templateSource) {
78          LiferayTemplateSource liferayTemplateSource =
79              (LiferayTemplateSource)templateSource;
80  
81          return liferayTemplateSource.getLastModified();
82      }
83  
84      public Reader getReader(Object templateSource, String encoding)
85          throws IOException {
86  
87          LiferayTemplateSource liferayTemplateSource =
88              (LiferayTemplateSource)templateSource;
89  
90          return liferayTemplateSource.getReader(encoding);
91      }
92      public void setTemplateLoaders(
93          String[] freeMarkerTemplateLoaderClassNames) {
94  
95          List<FreeMarkerTemplateLoader> freeMarkerTemplateLoaders =
96              new ArrayList<FreeMarkerTemplateLoader>(
97                  freeMarkerTemplateLoaderClassNames.length);
98  
99          for (String freeMarkerTemplateLoaderClassName :
100                 freeMarkerTemplateLoaderClassNames) {
101 
102             try {
103                 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
104                     (FreeMarkerTemplateLoader)InstanceFactory.newInstance(
105                         freeMarkerTemplateLoaderClassName);
106 
107                 freeMarkerTemplateLoaders.add(freeMarkerTemplateLoader);
108             }
109             catch (Exception e) {
110                 _log.error(e, e);
111             }
112         }
113 
114         _freeMarkerTemplateLoaders = freeMarkerTemplateLoaders.toArray(
115             new FreeMarkerTemplateLoader[freeMarkerTemplateLoaders.size()]);
116     }
117 
118     private static Log _log = LogFactoryUtil.getLog(
119         LiferayTemplateLoader.class);
120 
121     private FreeMarkerTemplateLoader[] _freeMarkerTemplateLoaders;
122     private Map<String, FreeMarkerTemplateLoader>
123         _freeMarkerTemplateLoadersMap =
124             new ConcurrentHashMap<String, FreeMarkerTemplateLoader>();
125 
126 }