1
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
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 }