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