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  
20  import freemarker.cache.TemplateLoader;
21  
22  import java.io.IOException;
23  import java.io.Reader;
24  
25  import java.util.ArrayList;
26  import java.util.List;
27  import java.util.Map;
28  import java.util.concurrent.ConcurrentHashMap;
29  
30  /**
31   * <a href="LiferayTemplateLoader.java.html"><b><i>View Source</i></b></a>
32   *
33   * @author Mika Koivisto
34   */
35  public class LiferayTemplateLoader implements TemplateLoader {
36  
37      public void closeTemplateSource(Object templateSource) {
38          LiferayTemplateSource liferayTemplateSource =
39              (LiferayTemplateSource)templateSource;
40  
41          liferayTemplateSource.close();
42      }
43  
44      public Object findTemplateSource(String name) throws IOException {
45          FreeMarkerTemplateLoader freeMarkerTemplateLoader =
46              _freeMarkerTemplateLoadersMap.get(name);
47  
48          if (freeMarkerTemplateLoader != null) {
49              Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
50                  name);
51  
52              if (templateSource != null) {
53                  return new LiferayTemplateSource(
54                      freeMarkerTemplateLoader, templateSource);
55              }
56          }
57  
58          for (int i = 0; i < _freeMarkerTemplateLoaders.length; i++) {
59              freeMarkerTemplateLoader = _freeMarkerTemplateLoaders[i];
60  
61              Object templateSource = freeMarkerTemplateLoader.findTemplateSource(
62                  name);
63  
64              if (templateSource != null) {
65                  _freeMarkerTemplateLoadersMap.put(
66                      name, freeMarkerTemplateLoader);
67  
68                  return new LiferayTemplateSource(
69                      freeMarkerTemplateLoader, templateSource);
70              }
71          }
72  
73          return null;
74      }
75  
76      public long getLastModified(Object templateSource) {
77          LiferayTemplateSource liferayTemplateSource =
78              (LiferayTemplateSource)templateSource;
79  
80          return liferayTemplateSource.getLastModified();
81      }
82  
83      public Reader getReader(Object templateSource, String encoding)
84          throws IOException {
85  
86          LiferayTemplateSource liferayTemplateSource =
87              (LiferayTemplateSource)templateSource;
88  
89          return liferayTemplateSource.getReader(encoding);
90      }
91      public void setTemplateLoaders(
92          String[] freeMarkerTemplateLoaderClassNames) {
93  
94          List<FreeMarkerTemplateLoader> freeMarkerTemplateLoaders =
95              new ArrayList<FreeMarkerTemplateLoader>(
96                  freeMarkerTemplateLoaderClassNames.length);
97  
98          for (String freeMarkerTemplateLoaderClassName :
99                  freeMarkerTemplateLoaderClassNames) {
100 
101             try {
102                 FreeMarkerTemplateLoader freeMarkerTemplateLoader =
103                     (FreeMarkerTemplateLoader)Class.forName(
104                         freeMarkerTemplateLoaderClassName).newInstance();
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 }