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 
338         // Request
339 
340         velocityContext.put("request", request);
341 
342         // Portlet config
343 
344         PortletConfigImpl portletConfigImpl =
345             (PortletConfigImpl)request.getAttribute(
346                 JavaConstants.JAVAX_PORTLET_CONFIG);
347 
348         if (portletConfigImpl != null) {
349             velocityContext.put("portletConfig", portletConfigImpl);
350         }
351 
352         // Render request
353 
354         PortletRequest portletRequest = (PortletRequest)request.getAttribute(
355             JavaConstants.JAVAX_PORTLET_REQUEST);
356 
357         if (portletRequest != null) {
358             if (portletRequest instanceof RenderRequest) {
359                 velocityContext.put("renderRequest", portletRequest);
360             }
361         }
362 
363         // Render response
364 
365         PortletResponse portletResponse = (PortletResponse)request.getAttribute(
366             JavaConstants.JAVAX_PORTLET_RESPONSE);
367 
368         if (portletResponse != null) {
369             if (portletResponse instanceof RenderResponse) {
370                 velocityContext.put("renderResponse", portletResponse);
371             }
372         }
373 
374         // XML request
375 
376         if ((portletRequest != null) && (portletResponse != null)) {
377             String xmlRequest = PortletRequestUtil.toXML(
378                 portletRequest, portletResponse);
379 
380             velocityContext.put("xmlRequest", xmlRequest);
381         }
382 
383         // Theme display
384 
385         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
386             WebKeys.THEME_DISPLAY);
387 
388         if (themeDisplay != null) {
389             Theme theme = themeDisplay.getTheme();
390 
391             Layout layout = themeDisplay.getLayout();
392             List<Layout> layouts = themeDisplay.getLayouts();
393 
394             velocityContext.put("themeDisplay", themeDisplay);
395             velocityContext.put("company", themeDisplay.getCompany());
396             velocityContext.put("user", themeDisplay.getUser());
397             velocityContext.put("realUser", themeDisplay.getRealUser());
398             velocityContext.put("layout", layout);
399             velocityContext.put("layouts", layouts);
400             velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
401             velocityContext.put(
402                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
403             velocityContext.put(
404                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
405             velocityContext.put(
406                 "permissionChecker", themeDisplay.getPermissionChecker());
407             velocityContext.put("locale", themeDisplay.getLocale());
408             velocityContext.put("timeZone", themeDisplay.getTimeZone());
409             velocityContext.put("theme", theme);
410             velocityContext.put("colorScheme", themeDisplay.getColorScheme());
411             velocityContext.put(
412                 "portletDisplay", themeDisplay.getPortletDisplay());
413 
414             // Navigation items
415 
416             if (layout != null) {
417                 RequestVars requestVars = new RequestVars(
418                     request, themeDisplay, layout.getAncestorPlid(),
419                     layout.getAncestorLayoutId());
420 
421                 List<NavItem> navItems = NavItem.fromLayouts(
422                     requestVars, layouts);
423 
424                 velocityContext.put("navItems", navItems);
425             }
426 
427             // Full css and templates path
428 
429             String servletContextName = GetterUtil.getString(
430                 theme.getServletContextName());
431 
432             velocityContext.put(
433                 "fullCssPath",
434                 servletContextName + theme.getVelocityResourceListener() +
435                     theme.getCssPath());
436 
437             velocityContext.put(
438                 "fullTemplatesPath",
439                 servletContextName + theme.getVelocityResourceListener() +
440                     theme.getTemplatesPath());
441 
442             // Init
443 
444             velocityContext.put(
445                 "init",
446                 themeDisplay.getPathContext() +
447                     VelocityResourceListener.SERVLET_SEPARATOR +
448                         "/html/themes/_unstyled/templates/init.vm");
449 
450             // Deprecated
451 
452             velocityContext.put(
453                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
454         }
455 
456         // Tiles attributes
457 
458         String tilesTitle = _insertTilesVariables(
459             velocityContext, request, "tilesTitle", "title");
460         String tilesContent = _insertTilesVariables(
461             velocityContext, request, "tilesContent", "content");
462         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
463             velocityContext, request, "tilesSelectable", "selectable"));
464 
465         if (themeDisplay != null) {
466             themeDisplay.setTilesTitle(tilesTitle);
467             themeDisplay.setTilesContent(tilesContent);
468             themeDisplay.setTilesSelectable(tilesSelectable);
469         }
470 
471         // Page title and subtitle
472 
473         velocityContext.put(
474             "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
475         velocityContext.put(
476             "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
477 
478         // Insert custom vm variables
479 
480         Map<String, Object> vmVariables =
481             (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
482 
483         if (vmVariables != null) {
484             for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
485                 String key = entry.getKey();
486                 Object value = entry.getValue();
487 
488                 if (Validator.isNotNull(key)) {
489                     velocityContext.put(key, value);
490                 }
491             }
492         }
493     }
494 
495     private static void _insertHelperUtility(
496         VelocityContext velocityContext, String[] restrictedVariables,
497         String key, Object value) {
498 
499         if (!ArrayUtil.contains(restrictedVariables, key)) {
500             velocityContext.put(key, value);
501         }
502     }
503 
504     private static String _insertTilesVariables(
505         VelocityContext velocityContext, HttpServletRequest request,
506         String attributeId, String attributeName) {
507 
508         ComponentContext componentContext =
509             (ComponentContext)request.getAttribute(
510                 ComponentConstants.COMPONENT_CONTEXT);
511 
512         String value = null;
513 
514         if (componentContext != null) {
515             value = (String)componentContext.getAttribute(attributeName);
516 
517             if (value != null) {
518                 velocityContext.put(attributeId, value);
519             }
520         }
521 
522         return value;
523     }
524 
525 }