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.language.LanguageUtil;
19  import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
20  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
21  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
22  import com.liferay.portal.kernel.util.ArrayUtil;
23  import com.liferay.portal.kernel.util.ArrayUtil_IW;
24  import com.liferay.portal.kernel.util.DateUtil_IW;
25  import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
26  import com.liferay.portal.kernel.util.GetterUtil;
27  import com.liferay.portal.kernel.util.GetterUtil_IW;
28  import com.liferay.portal.kernel.util.HtmlUtil;
29  import com.liferay.portal.kernel.util.HttpUtil;
30  import com.liferay.portal.kernel.util.JavaConstants;
31  import com.liferay.portal.kernel.util.LocaleUtil;
32  import com.liferay.portal.kernel.util.ParamUtil_IW;
33  import com.liferay.portal.kernel.util.Randomizer_IW;
34  import com.liferay.portal.kernel.util.StaticFieldGetter;
35  import com.liferay.portal.kernel.util.StringPool;
36  import com.liferay.portal.kernel.util.StringUtil_IW;
37  import com.liferay.portal.kernel.util.TimeZoneUtil_IW;
38  import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
39  import com.liferay.portal.kernel.util.Validator;
40  import com.liferay.portal.kernel.util.Validator_IW;
41  import com.liferay.portal.kernel.xml.SAXReaderUtil;
42  import com.liferay.portal.model.Layout;
43  import com.liferay.portal.model.Theme;
44  import com.liferay.portal.service.permission.AccountPermissionUtil;
45  import com.liferay.portal.service.permission.CommonPermissionUtil;
46  import com.liferay.portal.service.permission.GroupPermissionUtil;
47  import com.liferay.portal.service.permission.LayoutPermissionUtil;
48  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
49  import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
50  import com.liferay.portal.service.permission.PortalPermissionUtil;
51  import com.liferay.portal.service.permission.PortletPermissionUtil;
52  import com.liferay.portal.service.permission.RolePermissionUtil;
53  import com.liferay.portal.service.permission.UserGroupPermissionUtil;
54  import com.liferay.portal.service.permission.UserPermissionUtil;
55  import com.liferay.portal.theme.NavItem;
56  import com.liferay.portal.theme.RequestVars;
57  import com.liferay.portal.theme.ThemeDisplay;
58  import com.liferay.portal.util.PortalUtil;
59  import com.liferay.portal.util.PrefsPropsUtil_IW;
60  import com.liferay.portal.util.PropsUtil_IW;
61  import com.liferay.portal.util.SessionClicks_IW;
62  import com.liferay.portal.util.WebKeys;
63  import com.liferay.portal.velocity.ServiceLocator;
64  import com.liferay.portal.velocity.UtilLocator;
65  import com.liferay.portal.velocity.VelocityPortletPreferences;
66  import com.liferay.portlet.PortletConfigImpl;
67  import com.liferay.portlet.PortletURLFactoryUtil;
68  import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
69  import com.liferay.portlet.expando.service.ExpandoRowLocalService;
70  import com.liferay.portlet.expando.service.ExpandoTableLocalService;
71  import com.liferay.portlet.expando.service.ExpandoValueLocalService;
72  import com.liferay.portlet.journalcontent.util.JournalContentUtil;
73  import com.liferay.util.portlet.PortletRequestUtil;
74  
75  import java.util.List;
76  import java.util.Map;
77  
78  import javax.portlet.PortletRequest;
79  import javax.portlet.PortletResponse;
80  import javax.portlet.RenderRequest;
81  import javax.portlet.RenderResponse;
82  
83  import javax.servlet.http.HttpServletRequest;
84  
85  import org.apache.struts.taglib.tiles.ComponentConstants;
86  import org.apache.struts.tiles.ComponentContext;
87  
88  /**
89   * <a href="FreeMarkerVariables.java.html"><b><i>View Source</i></b></a>
90   *
91   * @author Mika Koivisto
92   */
93  public class FreeMarkerVariables {
94  
95      public static void insertHelperUtilities(
96          FreeMarkerContext freeMarkerContext, String[] restrictedVariables) {
97  
98          // Array util
99  
100         freeMarkerContext.put("arrayUtil", ArrayUtil_IW.getInstance());
101 
102         // Browser sniffer
103 
104         freeMarkerContext.put(
105             "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
106 
107         // Date format
108 
109         freeMarkerContext.put(
110             "dateFormatFactory",
111             FastDateFormatFactoryUtil.getFastDateFormatFactory());
112 
113         // Date util
114 
115         freeMarkerContext.put("dateUtil", DateUtil_IW.getInstance());
116 
117         // Expando column service
118 
119         ServiceLocator serviceLocator = ServiceLocator.getInstance();
120 
121         freeMarkerContext.put(
122             "expandoColumnLocalService",
123             serviceLocator.findService(
124                 ExpandoColumnLocalService.class.getName()));
125 
126         // Expando row service
127 
128         freeMarkerContext.put(
129             "expandoRowLocalService",
130             serviceLocator.findService(ExpandoRowLocalService.class.getName()));
131 
132         // Expando table service
133 
134         freeMarkerContext.put(
135             "expandoTableLocalService",
136             serviceLocator.findService(
137                 ExpandoTableLocalService.class.getName()));
138 
139         // Expando value service
140 
141         freeMarkerContext.put(
142             "expandoValueLocalService",
143             serviceLocator.findService(
144                 ExpandoValueLocalService.class.getName()));
145 
146         // Getter util
147 
148         freeMarkerContext.put("getterUtil", GetterUtil_IW.getInstance());
149 
150         // Html util
151 
152         freeMarkerContext.put("htmlUtil", HtmlUtil.getHtml());
153 
154         // Http util
155 
156         freeMarkerContext.put("httpUtil", HttpUtil.getHttp());
157 
158         // Image servlet token
159 
160         freeMarkerContext.put(
161             "imageToken", ImageServletTokenUtil.getImageServletToken());
162 
163         // Journal content util
164 
165         freeMarkerContext.put(
166             "journalContentUtil", JournalContentUtil.getJournalContent());
167 
168         // Language util
169 
170         freeMarkerContext.put("languageUtil", LanguageUtil.getLanguage());
171         freeMarkerContext.put(
172             "unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage());
173 
174         // Locale util
175 
176         freeMarkerContext.put("localeUtil", LocaleUtil.getInstance());
177 
178         // Param util
179 
180         freeMarkerContext.put("paramUtil", ParamUtil_IW.getInstance());
181 
182         // Portal util
183 
184         _insertHelperUtility(
185             freeMarkerContext, restrictedVariables, "portalUtil",
186             PortalUtil.getPortal());
187         _insertHelperUtility(
188             freeMarkerContext, restrictedVariables, "portal",
189             PortalUtil.getPortal());
190 
191         // Prefs props util
192 
193         _insertHelperUtility(
194             freeMarkerContext, restrictedVariables, "prefsPropsUtil",
195             PrefsPropsUtil_IW.getInstance());
196 
197         // Props util
198 
199         _insertHelperUtility(
200             freeMarkerContext, restrictedVariables, "propsUtil",
201             PropsUtil_IW.getInstance());
202 
203         // Portlet URL factory
204 
205         freeMarkerContext.put(
206             "portletURLFactory", PortletURLFactoryUtil.getPortletURLFactory());
207 
208         // Portlet preferences
209 
210         _insertHelperUtility(
211             freeMarkerContext, restrictedVariables,
212             "freeMarkerPortletPreferences", new VelocityPortletPreferences());
213 
214         // Randomizer
215 
216         freeMarkerContext.put(
217             "randomizer", Randomizer_IW.getInstance().getWrappedInstance());
218 
219         // SAX reader util
220 
221         UtilLocator utilLocator = UtilLocator.getInstance();
222 
223         freeMarkerContext.put(
224             "saxReaderUtil",
225             utilLocator.findUtil(SAXReaderUtil.class.getName()));
226 
227         // Service locator
228 
229         _insertHelperUtility(
230             freeMarkerContext, restrictedVariables, "serviceLocator",
231             serviceLocator);
232 
233         // Session clicks
234 
235         _insertHelperUtility(
236             freeMarkerContext, restrictedVariables, "sessionClicks",
237             SessionClicks_IW.getInstance());
238 
239         // Static field getter
240 
241         freeMarkerContext.put(
242             "staticFieldGetter", StaticFieldGetter.getInstance());
243 
244         // String util
245 
246         freeMarkerContext.put("stringUtil", StringUtil_IW.getInstance());
247 
248         // Time zone util
249 
250         freeMarkerContext.put("timeZoneUtil", TimeZoneUtil_IW.getInstance());
251 
252         // Util locator
253 
254         _insertHelperUtility(
255             freeMarkerContext, restrictedVariables, "utilLocator", utilLocator);
256 
257         // Unicode formatter
258 
259         freeMarkerContext.put(
260             "unicodeFormatter", UnicodeFormatter_IW.getInstance());
261 
262         // Validator
263 
264         freeMarkerContext.put("validator", Validator_IW.getInstance());
265 
266         // Permissions
267 
268         freeMarkerContext.put(
269             "accountPermission", AccountPermissionUtil.getAccountPermission());
270         freeMarkerContext.put(
271             "commonPermission", CommonPermissionUtil.getCommonPermission());
272         freeMarkerContext.put(
273             "groupPermission", GroupPermissionUtil.getGroupPermission());
274         freeMarkerContext.put(
275             "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
276         freeMarkerContext.put(
277             "organizationPermission",
278             OrganizationPermissionUtil.getOrganizationPermission());
279         freeMarkerContext.put(
280             "passwordPolicyPermission",
281             PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
282         freeMarkerContext.put(
283             "portalPermission", PortalPermissionUtil.getPortalPermission());
284         freeMarkerContext.put(
285             "portletPermission", PortletPermissionUtil.getPortletPermission());
286         freeMarkerContext.put(
287             "rolePermission", RolePermissionUtil.getRolePermission());
288         freeMarkerContext.put(
289             "userGroupPermission",
290             UserGroupPermissionUtil.getUserGroupPermission());
291         freeMarkerContext.put(
292             "userPermission", UserPermissionUtil.getUserPermission());
293     }
294 
295     public static void insertVariables(
296         FreeMarkerContext freeMarkerContext, HttpServletRequest request) {
297 
298         // Request
299 
300         freeMarkerContext.put("request", request);
301 
302         // Portlet config
303 
304         PortletConfigImpl portletConfigImpl =
305             (PortletConfigImpl)request.getAttribute(
306                 JavaConstants.JAVAX_PORTLET_CONFIG);
307 
308         if (portletConfigImpl != null) {
309             freeMarkerContext.put("portletConfig", portletConfigImpl);
310         }
311 
312         // Render request
313 
314         PortletRequest portletRequest = (PortletRequest)request.getAttribute(
315             JavaConstants.JAVAX_PORTLET_REQUEST);
316 
317         if (portletRequest != null) {
318             if (portletRequest instanceof RenderRequest) {
319                 freeMarkerContext.put("renderRequest", portletRequest);
320             }
321         }
322 
323         // Render response
324 
325         PortletResponse portletResponse = (PortletResponse)request.getAttribute(
326             JavaConstants.JAVAX_PORTLET_RESPONSE);
327 
328         if (portletResponse != null) {
329             if (portletResponse instanceof RenderResponse) {
330                 freeMarkerContext.put("renderResponse", portletResponse);
331             }
332         }
333 
334         // XML request
335 
336         if ((portletRequest != null) && (portletResponse != null)) {
337             String xmlRequest = PortletRequestUtil.toXML(
338                 portletRequest, portletResponse);
339 
340             freeMarkerContext.put("xmlRequest", xmlRequest);
341         }
342 
343         // Theme display
344 
345         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
346             WebKeys.THEME_DISPLAY);
347 
348         if (themeDisplay != null) {
349             Theme theme = themeDisplay.getTheme();
350 
351             Layout layout = themeDisplay.getLayout();
352             List<Layout> layouts = themeDisplay.getLayouts();
353 
354             freeMarkerContext.put("themeDisplay", themeDisplay);
355             freeMarkerContext.put("company", themeDisplay.getCompany());
356             freeMarkerContext.put("user", themeDisplay.getUser());
357             freeMarkerContext.put("realUser", themeDisplay.getRealUser());
358             freeMarkerContext.put("layout", layout);
359             freeMarkerContext.put("layouts", layouts);
360             freeMarkerContext.put(
361                 "plid", String.valueOf(themeDisplay.getPlid()));
362             freeMarkerContext.put(
363                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
364             freeMarkerContext.put(
365                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
366             freeMarkerContext.put(
367                 "permissionChecker", themeDisplay.getPermissionChecker());
368             freeMarkerContext.put("locale", themeDisplay.getLocale());
369             freeMarkerContext.put("timeZone", themeDisplay.getTimeZone());
370             freeMarkerContext.put("theme", theme);
371             freeMarkerContext.put("colorScheme", themeDisplay.getColorScheme());
372             freeMarkerContext.put(
373                 "portletDisplay", themeDisplay.getPortletDisplay());
374 
375             // Navigation items
376 
377             if (layout != null) {
378                 RequestVars requestVars = new RequestVars(
379                     request, themeDisplay, layout.getAncestorPlid(),
380                     layout.getAncestorLayoutId());
381 
382                 List<NavItem> navItems = NavItem.fromLayouts(
383                     requestVars, layouts);
384 
385                 freeMarkerContext.put("navItems", navItems);
386             }
387 
388             // Full css and templates path
389 
390             String servletContextName = GetterUtil.getString(
391                 theme.getServletContextName());
392 
393             freeMarkerContext.put(
394                 "fullCssPath",
395                 StringPool.SLASH + servletContextName +
396                     theme.getFreeMarkerTemplateLoader() + theme.getCssPath());
397 
398             freeMarkerContext.put(
399                 "fullTemplatesPath",
400                 StringPool.SLASH + servletContextName +
401                     theme.getFreeMarkerTemplateLoader() +
402                         theme.getTemplatesPath());
403 
404             // Init
405 
406             freeMarkerContext.put(
407                 "init",
408                 StringPool.SLASH + themeDisplay.getPathContext() +
409                     FreeMarkerTemplateLoader.SERVLET_SEPARATOR +
410                         "/html/themes/_unstyled/templates/init.ftl");
411 
412             // Deprecated
413 
414             freeMarkerContext.put(
415                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
416         }
417 
418         // Tiles attributes
419 
420         String tilesTitle = _insertTilesVariables(
421             freeMarkerContext, request, "tilesTitle", "title");
422         String tilesContent = _insertTilesVariables(
423             freeMarkerContext, request, "tilesContent", "content");
424         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
425             freeMarkerContext, request, "tilesSelectable", "selectable"));
426 
427         if (themeDisplay != null) {
428             themeDisplay.setTilesTitle(tilesTitle);
429             themeDisplay.setTilesContent(tilesContent);
430             themeDisplay.setTilesSelectable(tilesSelectable);
431         }
432 
433         // Page title and subtitle
434 
435         if (request.getAttribute(WebKeys.PAGE_TITLE) != null) {
436             freeMarkerContext.put(
437                 "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
438         }
439 
440         if (request.getAttribute(WebKeys.PAGE_SUBTITLE) != null) {
441             freeMarkerContext.put(
442                 "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
443         }
444 
445         // Insert custom ftl variables
446 
447         Map<String, Object> ftlVariables =
448             (Map<String, Object>)request.getAttribute(WebKeys.FTL_VARIABLES);
449 
450         if (ftlVariables != null) {
451             for (Map.Entry<String, Object> entry : ftlVariables.entrySet()) {
452                 String key = entry.getKey();
453                 Object value = entry.getValue();
454 
455                 if (Validator.isNotNull(key)) {
456                     freeMarkerContext.put(key, value);
457                 }
458             }
459         }
460     }
461 
462     private static void _insertHelperUtility(
463         FreeMarkerContext freeMarkerContext, String[] restrictedVariables,
464         String key, Object value) {
465 
466         if (!ArrayUtil.contains(restrictedVariables, key)) {
467             freeMarkerContext.put(key, value);
468         }
469     }
470 
471     private static String _insertTilesVariables(
472         FreeMarkerContext freeMarkerContext, HttpServletRequest request,
473         String attributeId, String attributeName) {
474 
475         ComponentContext componentContext =
476             (ComponentContext)request.getAttribute(
477                 ComponentConstants.COMPONENT_CONTEXT);
478 
479         String value = null;
480 
481         if (componentContext != null) {
482             value = (String)componentContext.getAttribute(attributeName);
483 
484             if (value != null) {
485                 freeMarkerContext.put(attributeId, value);
486             }
487         }
488 
489         return value;
490     }
491 
492 }