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.freemarker.FreeMarkerContext;
18  import com.liferay.portal.kernel.freemarker.FreeMarkerEngine;
19  import com.liferay.portal.kernel.log.Log;
20  import com.liferay.portal.kernel.log.LogFactoryUtil;
21  import com.liferay.portal.kernel.util.StringPool;
22  import com.liferay.portal.kernel.util.Validator;
23  import com.liferay.portal.util.PropsValues;
24  
25  import freemarker.cache.ClassTemplateLoader;
26  import freemarker.cache.MultiTemplateLoader;
27  import freemarker.cache.StringTemplateLoader;
28  import freemarker.cache.TemplateLoader;
29  
30  import freemarker.template.Configuration;
31  import freemarker.template.DefaultObjectWrapper;
32  import freemarker.template.Template;
33  
34  import java.io.IOException;
35  import java.io.Writer;
36  
37  /**
38   * <a href="FreeMarkerEngineImpl.java.html"><b><i>View Source</i></b></a>
39   *
40   * @author Mika Koivisto
41   */
42  public class FreeMarkerEngineImpl implements FreeMarkerEngine {
43  
44      public FreeMarkerContext getWrappedRestrictedToolsContext() {
45          return new FreeMarkerContextImpl(
46              _restrictedToolsContext.getWrappedContext());
47      }
48  
49      public FreeMarkerContext getWrappedStandardToolsContext() {
50          return new FreeMarkerContextImpl(
51              _standardToolsContext.getWrappedContext());
52      }
53  
54      public void init() throws Exception {
55          LiferayTemplateLoader liferayTemplateLoader =
56              new LiferayTemplateLoader();
57  
58          liferayTemplateLoader.setTemplateLoaders(
59              PropsValues.FREEMARKER_ENGINE_TEMPLATE_LOADERS);
60  
61          _stringTemplateLoader = new StringTemplateLoader();
62  
63          MultiTemplateLoader multiTemplateLoader =
64              new MultiTemplateLoader(
65                  new TemplateLoader[] {
66                      new ClassTemplateLoader(getClass(), StringPool.SLASH),
67                      _stringTemplateLoader, liferayTemplateLoader
68                  });
69  
70          _configuration = new Configuration();
71  
72          _configuration.setDefaultEncoding(StringPool.UTF8);
73          _configuration.setLocalizedLookup(
74              PropsValues.FREEMARKER_ENGINE_LOCALIZED_LOOKUP);
75          _configuration.setObjectWrapper(new DefaultObjectWrapper());
76          _configuration.setSetting(
77              "auto_import", PropsValues.FREEMARKER_ENGINE_MACRO_LIBRARY);
78          _configuration.setSetting(
79              "cache_storage", PropsValues.FREEMARKER_ENGINE_CACHE_STORAGE);
80          _configuration.setSetting(
81              "template_exception_handler",
82              PropsValues.FREEMARKER_ENGINE_TEMPLATE_EXCEPTION_HANDLER);
83          _configuration.setTemplateLoader(multiTemplateLoader);
84          _configuration.setTemplateUpdateDelay(
85              PropsValues.FREEMARKER_ENGINE_MODIFICATION_CHECK_INTERVAL);
86  
87          _restrictedToolsContext = new FreeMarkerContextImpl();
88  
89          FreeMarkerVariables.insertHelperUtilities(
90              _restrictedToolsContext,
91              PropsValues.JOURNAL_TEMPLATE_FREEMARKER_RESTRICTED_VARIABLES);
92  
93          _standardToolsContext = new FreeMarkerContextImpl();
94  
95          FreeMarkerVariables.insertHelperUtilities(_standardToolsContext, null);
96      }
97  
98      public boolean mergeTemplate(
99              String freeMarkerTemplateId, FreeMarkerContext freeMarkerContext,
100             Writer writer)
101         throws Exception {
102 
103         return mergeTemplate(
104             freeMarkerTemplateId, null, freeMarkerContext, writer);
105     }
106 
107     public boolean mergeTemplate(
108             String freeMarkerTemplateId, String freemarkerTemplateContent,
109             FreeMarkerContext freeMarkerContext, Writer writer)
110         throws Exception {
111 
112         if ((Validator.isNotNull(freeMarkerTemplateId)) &&
113             (Validator.isNotNull(freemarkerTemplateContent)) &&
114             (!PropsValues.LAYOUT_TEMPLATE_CACHE_ENABLED ||
115              !resourceExists(freeMarkerTemplateId))) {
116 
117             _stringTemplateLoader.putTemplate(
118                 freeMarkerTemplateId, freemarkerTemplateContent);
119 
120             if (_log.isDebugEnabled()) {
121                 _log.debug(
122                     "Added " + freeMarkerTemplateId +
123                         " to the FreeMarker template repository");
124             }
125         }
126 
127         FreeMarkerContextImpl freeMarkerContextImpl =
128             (FreeMarkerContextImpl)freeMarkerContext;
129 
130         Template template = _configuration.getTemplate(
131             freeMarkerTemplateId, StringPool.UTF8);
132 
133         template.process(freeMarkerContextImpl.getWrappedContext(), writer);
134 
135         return true;
136     }
137 
138     public boolean resourceExists(String resource) {
139         try {
140             Template template = _configuration.getTemplate(resource);
141 
142             if (template != null) {
143                 return true;
144             }
145             else {
146                 return false;
147             }
148         }
149         catch (IOException ioe) {
150             if (_log.isWarnEnabled()) {
151                 _log.warn(ioe, ioe);
152             }
153 
154             return false;
155         }
156     }
157 
158     private static Log _log = LogFactoryUtil.getLog(FreeMarkerEngineImpl.class);
159 
160     private Configuration _configuration;
161     private FreeMarkerContextImpl _restrictedToolsContext;
162     private FreeMarkerContextImpl _standardToolsContext;
163     private StringTemplateLoader _stringTemplateLoader;
164 
165 }