1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   * 
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         final PortletRequest portletRequest =
355             (PortletRequest)request.getAttribute(
356                 JavaConstants.JAVAX_PORTLET_REQUEST);
357 
358         if (portletRequest != null) {
359             if (portletRequest instanceof RenderRequest) {
360                 velocityContext.put("renderRequest", portletRequest);
361             }
362         }
363 
364         // Render response
365 
366         final PortletResponse portletResponse =
367             (PortletResponse)request.getAttribute(
368                 JavaConstants.JAVAX_PORTLET_RESPONSE);
369 
370         if (portletResponse != null) {
371             if (portletResponse instanceof RenderResponse) {
372                 velocityContext.put("renderResponse", portletResponse);
373             }
374         }
375 
376         // XML request
377 
378         if ((portletRequest != null) && (portletResponse != null)) {
379             velocityContext.put(
380                 "xmlRequest",
381                 new Object() {
382 
383                     public String toString() {
384                         return PortletRequestUtil.toXML(
385                             portletRequest, portletResponse);
386                     }
387 
388                 }
389             );
390         }
391 
392         // Theme display
393 
394         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
395             WebKeys.THEME_DISPLAY);
396 
397         if (themeDisplay != null) {
398             Theme theme = themeDisplay.getTheme();
399 
400             Layout layout = themeDisplay.getLayout();
401             List<Layout> layouts = themeDisplay.getLayouts();
402 
403             velocityContext.put("themeDisplay", themeDisplay);
404             velocityContext.put("company", themeDisplay.getCompany());
405             velocityContext.put("user", themeDisplay.getUser());
406             velocityContext.put("realUser", themeDisplay.getRealUser());
407             velocityContext.put("layout", layout);
408             velocityContext.put("layouts", layouts);
409             velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
410             velocityContext.put(
411                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
412             velocityContext.put(
413                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
414             velocityContext.put(
415                 "permissionChecker", themeDisplay.getPermissionChecker());
416             velocityContext.put("locale", themeDisplay.getLocale());
417             velocityContext.put("timeZone", themeDisplay.getTimeZone());
418             velocityContext.put("theme", theme);
419             velocityContext.put("colorScheme", themeDisplay.getColorScheme());
420             velocityContext.put(
421                 "portletDisplay", themeDisplay.getPortletDisplay());
422 
423             // Navigation items
424 
425             if (layout != null) {
426                 RequestVars requestVars = new RequestVars(
427                     request, themeDisplay, layout.getAncestorPlid(),
428                     layout.getAncestorLayoutId());
429 
430                 List<NavItem> navItems = NavItem.fromLayouts(
431                     requestVars, layouts);
432 
433                 velocityContext.put("navItems", navItems);
434             }
435 
436             // Full css and templates path
437 
438             String servletContextName = GetterUtil.getString(
439                 theme.getServletContextName());
440 
441             velocityContext.put(
442                 "fullCssPath",
443                 servletContextName + theme.getVelocityResourceListener() +
444                     theme.getCssPath());
445 
446             velocityContext.put(
447                 "fullTemplatesPath",
448                 servletContextName + theme.getVelocityResourceListener() +
449                     theme.getTemplatesPath());
450 
451             // Init
452 
453             velocityContext.put(
454                 "init",
455                 themeDisplay.getPathContext() +
456                     VelocityResourceListener.SERVLET_SEPARATOR +
457                         "/html/themes/_unstyled/templates/init.vm");
458 
459             // Deprecated
460 
461             velocityContext.put(
462                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
463         }
464 
465         // Tiles attributes
466 
467         String tilesTitle = _insertTilesVariables(
468             velocityContext, request, "tilesTitle", "title");
469         String tilesContent = _insertTilesVariables(
470             velocityContext, request, "tilesContent", "content");
471         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
472             velocityContext, request, "tilesSelectable", "selectable"));
473 
474         if (themeDisplay != null) {
475             themeDisplay.setTilesTitle(tilesTitle);
476             themeDisplay.setTilesContent(tilesContent);
477             themeDisplay.setTilesSelectable(tilesSelectable);
478         }
479 
480         // Page title and subtitle
481 
482         velocityContext.put(
483             "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
484         velocityContext.put(
485             "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
486 
487         // Insert custom vm variables
488 
489         Map<String, Object> vmVariables =
490             (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
491 
492         if (vmVariables != null) {
493             for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
494                 String key = entry.getKey();
495                 Object value = entry.getValue();
496 
497                 if (Validator.isNotNull(key)) {
498                     velocityContext.put(key, value);
499                 }
500             }
501         }
502     }
503 
504     private static void _insertHelperUtility(
505         VelocityContext velocityContext, String[] restrictedVariables,
506         String key, Object value) {
507 
508         if (!ArrayUtil.contains(restrictedVariables, key)) {
509             velocityContext.put(key, value);
510         }
511     }
512 
513     private static String _insertTilesVariables(
514         VelocityContext velocityContext, HttpServletRequest request,
515         String attributeId, String attributeName) {
516 
517         ComponentContext componentContext =
518             (ComponentContext)request.getAttribute(
519                 ComponentConstants.COMPONENT_CONTEXT);
520 
521         String value = null;
522 
523         if (componentContext != null) {
524             value = (String)componentContext.getAttribute(attributeName);
525 
526             if (value != null) {
527                 velocityContext.put(attributeId, value);
528             }
529         }
530 
531         return value;
532     }
533 
534 }