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         throws Exception {
298 
299         // Request
300 
301         freeMarkerContext.put("request", request);
302 
303         // Portlet config
304 
305         PortletConfigImpl portletConfigImpl =
306             (PortletConfigImpl)request.getAttribute(
307                 JavaConstants.JAVAX_PORTLET_CONFIG);
308 
309         if (portletConfigImpl != null) {
310             freeMarkerContext.put("portletConfig", portletConfigImpl);
311         }
312 
313         // Render request
314 
315         final PortletRequest portletRequest =
316             (PortletRequest)request.getAttribute(
317                 JavaConstants.JAVAX_PORTLET_REQUEST);
318 
319         if (portletRequest != null) {
320             if (portletRequest instanceof RenderRequest) {
321                 freeMarkerContext.put("renderRequest", portletRequest);
322             }
323         }
324 
325         // Render response
326 
327         final PortletResponse portletResponse =
328             (PortletResponse)request.getAttribute(
329                 JavaConstants.JAVAX_PORTLET_RESPONSE);
330 
331         if (portletResponse != null) {
332             if (portletResponse instanceof RenderResponse) {
333                 freeMarkerContext.put("renderResponse", portletResponse);
334             }
335         }
336 
337         // XML request
338 
339         if ((portletRequest != null) && (portletResponse != null)) {
340             freeMarkerContext.put(
341                 "xmlRequest",
342                 new Object() {
343 
344                     public String toString() {
345                         return PortletRequestUtil.toXML(
346                             portletRequest, portletResponse);
347                     }
348 
349                 }
350             );
351         }
352 
353         // Theme display
354 
355         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
356             WebKeys.THEME_DISPLAY);
357 
358         if (themeDisplay != null) {
359             Theme theme = themeDisplay.getTheme();
360 
361             Layout layout = themeDisplay.getLayout();
362             List<Layout> layouts = themeDisplay.getLayouts();
363 
364             freeMarkerContext.put("themeDisplay", themeDisplay);
365             freeMarkerContext.put("company", themeDisplay.getCompany());
366             freeMarkerContext.put("user", themeDisplay.getUser());
367             freeMarkerContext.put("realUser", themeDisplay.getRealUser());
368             freeMarkerContext.put("layout", layout);
369             freeMarkerContext.put("layouts", layouts);
370             freeMarkerContext.put(
371                 "plid", String.valueOf(themeDisplay.getPlid()));
372             freeMarkerContext.put(
373                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
374             freeMarkerContext.put(
375                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
376             freeMarkerContext.put(
377                 "permissionChecker", themeDisplay.getPermissionChecker());
378             freeMarkerContext.put("locale", themeDisplay.getLocale());
379             freeMarkerContext.put("timeZone", themeDisplay.getTimeZone());
380             freeMarkerContext.put("theme", theme);
381             freeMarkerContext.put("colorScheme", themeDisplay.getColorScheme());
382             freeMarkerContext.put(
383                 "portletDisplay", themeDisplay.getPortletDisplay());
384 
385             // Navigation items
386 
387             if (layout != null) {
388                 RequestVars requestVars = new RequestVars(
389                     request, themeDisplay, layout.getAncestorPlid(),
390                     layout.getAncestorLayoutId());
391 
392                 List<NavItem> navItems = NavItem.fromLayouts(
393                     requestVars, layouts);
394 
395                 freeMarkerContext.put("navItems", navItems);
396             }
397 
398             // Full css and templates path
399 
400             String servletContextName = GetterUtil.getString(
401                 theme.getServletContextName());
402 
403             freeMarkerContext.put(
404                 "fullCssPath",
405                 StringPool.SLASH + servletContextName +
406                     theme.getFreeMarkerTemplateLoader() + theme.getCssPath());
407 
408             freeMarkerContext.put(
409                 "fullTemplatesPath",
410                 StringPool.SLASH + servletContextName +
411                     theme.getFreeMarkerTemplateLoader() +
412                         theme.getTemplatesPath());
413 
414             // Init
415 
416             freeMarkerContext.put(
417                 "init",
418                 StringPool.SLASH + themeDisplay.getPathContext() +
419                     FreeMarkerTemplateLoader.SERVLET_SEPARATOR +
420                         "/html/themes/_unstyled/templates/init.ftl");
421 
422             // Deprecated
423 
424             freeMarkerContext.put(
425                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
426         }
427 
428         // Tiles attributes
429 
430         _insertTilesVariables(
431             freeMarkerContext, request, "tilesTitle", "title");
432         _insertTilesVariables(
433             freeMarkerContext, request, "tilesContent", "content");
434         _insertTilesVariables(
435             freeMarkerContext, request, "tilesSelectable", "selectable");
436 
437         // Page title and subtitle
438 
439         if (request.getAttribute(WebKeys.PAGE_TITLE) != null) {
440             freeMarkerContext.put(
441                 "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
442         }
443 
444         if (request.getAttribute(WebKeys.PAGE_SUBTITLE) != null) {
445             freeMarkerContext.put(
446                 "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
447         }
448 
449         // Insert custom ftl variables
450 
451         Map<String, Object> ftlVariables =
452             (Map<String, Object>)request.getAttribute(WebKeys.FTL_VARIABLES);
453 
454         if (ftlVariables != null) {
455             for (Map.Entry<String, Object> entry : ftlVariables.entrySet()) {
456                 String key = entry.getKey();
457                 Object value = entry.getValue();
458 
459                 if (Validator.isNotNull(key)) {
460                     freeMarkerContext.put(key, value);
461                 }
462             }
463         }
464     }
465 
466     private static void _insertHelperUtility(
467         FreeMarkerContext freeMarkerContext, String[] restrictedVariables,
468         String key, Object value) {
469 
470         if (!ArrayUtil.contains(restrictedVariables, key)) {
471             freeMarkerContext.put(key, value);
472         }
473     }
474 
475     private static void _insertTilesVariables(
476         FreeMarkerContext freeMarkerContext, HttpServletRequest request,
477         String attributeId, String attributeName) {
478 
479         ComponentContext componentContext =
480             (ComponentContext)request.getAttribute(
481                 ComponentConstants.COMPONENT_CONTEXT);
482 
483         if (componentContext != null) {
484             String value = (String)componentContext.getAttribute(attributeName);
485 
486             if (value != null) {
487                 freeMarkerContext.put(attributeId, value);
488             }
489         }
490     }
491 
492 }