1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.velocity;
24  
25  import com.liferay.portal.kernel.language.LanguageUtil;
26  import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
27  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
28  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
29  import com.liferay.portal.kernel.util.ArrayUtil;
30  import com.liferay.portal.kernel.util.ArrayUtil_IW;
31  import com.liferay.portal.kernel.util.DateFormats_IW;
32  import com.liferay.portal.kernel.util.DateUtil_IW;
33  import com.liferay.portal.kernel.util.GetterUtil;
34  import com.liferay.portal.kernel.util.GetterUtil_IW;
35  import com.liferay.portal.kernel.util.HtmlUtil;
36  import com.liferay.portal.kernel.util.HttpUtil;
37  import com.liferay.portal.kernel.util.JavaConstants;
38  import com.liferay.portal.kernel.util.LocaleUtil;
39  import com.liferay.portal.kernel.util.ParamUtil_IW;
40  import com.liferay.portal.kernel.util.Randomizer_IW;
41  import com.liferay.portal.kernel.util.StaticFieldGetter;
42  import com.liferay.portal.kernel.util.StringUtil_IW;
43  import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
44  import com.liferay.portal.kernel.util.Validator;
45  import com.liferay.portal.kernel.util.Validator_IW;
46  import com.liferay.portal.kernel.xml.SAXReaderUtil;
47  import com.liferay.portal.model.Layout;
48  import com.liferay.portal.model.Theme;
49  import com.liferay.portal.service.permission.AccountPermissionUtil;
50  import com.liferay.portal.service.permission.CommonPermissionUtil;
51  import com.liferay.portal.service.permission.GroupPermissionUtil;
52  import com.liferay.portal.service.permission.LayoutPermissionUtil;
53  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
54  import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
55  import com.liferay.portal.service.permission.PortalPermissionUtil;
56  import com.liferay.portal.service.permission.PortletPermissionUtil;
57  import com.liferay.portal.service.permission.RolePermissionUtil;
58  import com.liferay.portal.service.permission.UserGroupPermissionUtil;
59  import com.liferay.portal.service.permission.UserPermissionUtil;
60  import com.liferay.portal.theme.NavItem;
61  import com.liferay.portal.theme.RequestVars;
62  import com.liferay.portal.theme.ThemeDisplay;
63  import com.liferay.portal.util.PortalUtil;
64  import com.liferay.portal.util.PrefsPropsUtil_IW;
65  import com.liferay.portal.util.PropsUtil_IW;
66  import com.liferay.portal.util.SessionClicks_IW;
67  import com.liferay.portal.util.WebKeys;
68  import com.liferay.portlet.PortletConfigImpl;
69  import com.liferay.portlet.PortletURLFactory;
70  import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
71  import com.liferay.portlet.expando.service.ExpandoRowLocalService;
72  import com.liferay.portlet.expando.service.ExpandoTableLocalService;
73  import com.liferay.portlet.expando.service.ExpandoValueLocalService;
74  import com.liferay.portlet.journalcontent.util.JournalContentUtil_IW;
75  import com.liferay.util.portlet.PortletRequestUtil;
76  
77  import java.util.List;
78  import java.util.Map;
79  
80  import javax.portlet.PortletRequest;
81  import javax.portlet.PortletResponse;
82  import javax.portlet.RenderRequest;
83  import javax.portlet.RenderResponse;
84  
85  import javax.servlet.http.HttpServletRequest;
86  
87  import org.apache.struts.taglib.tiles.ComponentConstants;
88  import org.apache.struts.tiles.ComponentContext;
89  import org.apache.velocity.VelocityContext;
90  import org.apache.velocity.tools.generic.DateTool;
91  import org.apache.velocity.tools.generic.EscapeTool;
92  import org.apache.velocity.tools.generic.IteratorTool;
93  import org.apache.velocity.tools.generic.ListTool;
94  import org.apache.velocity.tools.generic.MathTool;
95  import org.apache.velocity.tools.generic.NumberTool;
96  import org.apache.velocity.tools.generic.SortTool;
97  
98  /**
99   * <a href="VelocityVariables.java.html"><b><i>View Source</i></b></a>
100  *
101  * @author Brian Wing Shun Chan
102  *
103  */
104 public class VelocityVariables {
105 
106     public static void insertHelperUtilities(
107         VelocityContext velocityContext, String[] restrictedVariables) {
108 
109         // Array util
110 
111         velocityContext.put("arrayUtil", ArrayUtil_IW.getInstance());
112 
113         // Browser sniffer
114 
115         velocityContext.put(
116             "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
117 
118         // Date formats
119 
120         velocityContext.put("dateFormats", DateFormats_IW.getInstance());
121 
122         // Date tool
123 
124         velocityContext.put("dateTool", new DateTool());
125 
126         // Date util
127 
128         velocityContext.put("dateUtil", DateUtil_IW.getInstance());
129 
130         // Escape tool
131 
132         velocityContext.put("escapeTool", new EscapeTool());
133 
134         // Expando column service
135 
136         ServiceLocator serviceLocator = ServiceLocator.getInstance();
137 
138         velocityContext.put(
139             "expandoColumnLocalService",
140             serviceLocator.findService(
141                 ExpandoColumnLocalService.class.getName()));
142 
143         // Expando row service
144 
145         velocityContext.put(
146             "expandoRowLocalService",
147             serviceLocator.findService(ExpandoRowLocalService.class.getName()));
148 
149         // Expando table service
150 
151         velocityContext.put(
152             "expandoTableLocalService",
153             serviceLocator.findService(
154                 ExpandoTableLocalService.class.getName()));
155 
156         // Expando value service
157 
158         velocityContext.put(
159             "expandoValueLocalService",
160             serviceLocator.findService(
161                 ExpandoValueLocalService.class.getName()));
162 
163         // Getter util
164 
165         velocityContext.put("getterUtil", GetterUtil_IW.getInstance());
166 
167         // Html util
168 
169         velocityContext.put("htmlUtil", HtmlUtil.getHtml());
170 
171         // Http util
172 
173         velocityContext.put("httpUtil", HttpUtil.getHttp());
174 
175         // Image servlet token
176 
177         velocityContext.put(
178             "imageToken", ImageServletTokenUtil.getImageServletToken());
179 
180         // Iterator tool
181 
182         velocityContext.put("iteratorTool", new IteratorTool());
183 
184         // Journal content util
185 
186         velocityContext.put(
187             "journalContentUtil", JournalContentUtil_IW.getInstance());
188 
189         // Language util
190 
191         velocityContext.put("languageUtil", LanguageUtil.getLanguage());
192         velocityContext.put(
193             "unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage());
194 
195         // List tool
196 
197         velocityContext.put("listTool", new ListTool());
198 
199         // Locale util
200 
201         velocityContext.put("localeUtil", LocaleUtil.getInstance());
202 
203         // Math tool
204 
205         velocityContext.put("mathTool", new MathTool());
206 
207         // Number tool
208 
209         velocityContext.put("numberTool", new NumberTool());
210 
211         // Param util
212 
213         velocityContext.put("paramUtil", ParamUtil_IW.getInstance());
214 
215         // Portal util
216 
217         _insertHelperUtility(
218             velocityContext, restrictedVariables, "portalUtil",
219             PortalUtil.getPortal());
220         _insertHelperUtility(
221             velocityContext, restrictedVariables, "portal",
222             PortalUtil.getPortal());
223 
224         // Prefs props util
225 
226         _insertHelperUtility(
227             velocityContext, restrictedVariables, "prefsPropsUtil",
228             PrefsPropsUtil_IW.getInstance());
229 
230         // Props util
231 
232         _insertHelperUtility(
233             velocityContext, restrictedVariables, "propsUtil",
234             PropsUtil_IW.getInstance());
235 
236         // Portlet URL factory
237 
238         velocityContext.put(
239             "portletURLFactory", PortletURLFactory.getInstance());
240 
241         // Portlet preferences
242 
243         _insertHelperUtility(
244             velocityContext, restrictedVariables, "velocityPortletPreferences",
245             new VelocityPortletPreferences());
246 
247         // Randomizer
248 
249         velocityContext.put(
250             "randomizer", Randomizer_IW.getInstance().getWrappedInstance());
251 
252         // SAX reader util
253 
254         UtilLocator utilLocator = UtilLocator.getInstance();
255 
256         velocityContext.put(
257             "saxReaderUtil",
258             utilLocator.findUtil(SAXReaderUtil.class.getName()));
259 
260         // Service locator
261 
262         _insertHelperUtility(
263             velocityContext, restrictedVariables, "serviceLocator",
264             serviceLocator);
265 
266         // Session clicks
267 
268         _insertHelperUtility(
269             velocityContext, restrictedVariables, "sessionClicks",
270             SessionClicks_IW.getInstance());
271 
272         // Sort tool
273 
274         velocityContext.put("sortTool", new SortTool());
275 
276         // Static field getter
277 
278         velocityContext.put(
279             "staticFieldGetter", StaticFieldGetter.getInstance());
280 
281         // String util
282 
283         velocityContext.put("stringUtil", StringUtil_IW.getInstance());
284 
285         // Util locator
286 
287         _insertHelperUtility(
288             velocityContext, restrictedVariables, "utilLocator", utilLocator);
289 
290         // Unicode formatter
291 
292         velocityContext.put(
293             "unicodeFormatter", UnicodeFormatter_IW.getInstance());
294 
295         // Validator
296 
297         velocityContext.put("validator", Validator_IW.getInstance());
298 
299         // Permissions
300 
301         velocityContext.put(
302             "accountPermission", AccountPermissionUtil.getAccountPermission());
303         velocityContext.put(
304             "commonPermission", CommonPermissionUtil.getCommonPermission());
305         velocityContext.put(
306             "groupPermission", GroupPermissionUtil.getGroupPermission());
307         velocityContext.put(
308             "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
309         velocityContext.put(
310             "organizationPermission",
311             OrganizationPermissionUtil.getOrganizationPermission());
312         velocityContext.put(
313             "passwordPolicyPermission",
314             PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
315         velocityContext.put(
316             "portalPermission", PortalPermissionUtil.getPortalPermission());
317         velocityContext.put(
318             "portletPermission", PortletPermissionUtil.getPortletPermission());
319         velocityContext.put(
320             "rolePermission", RolePermissionUtil.getRolePermission());
321         velocityContext.put(
322             "userGroupPermission",
323             UserGroupPermissionUtil.getUserGroupPermission());
324         velocityContext.put(
325             "userPermission", UserPermissionUtil.getUserPermission());
326 
327         // Deprecated
328 
329         velocityContext.put(
330             "locationPermission",
331             OrganizationPermissionUtil.getOrganizationPermission());
332     }
333 
334     public static void insertVariables(
335         VelocityContext velocityContext, HttpServletRequest request) {
336 
337         // Request
338 
339         velocityContext.put("request", request);
340 
341         // Portlet config
342 
343         PortletConfigImpl portletConfigImpl =
344             (PortletConfigImpl)request.getAttribute(
345                 JavaConstants.JAVAX_PORTLET_CONFIG);
346 
347         if (portletConfigImpl != null) {
348             velocityContext.put("portletConfig", portletConfigImpl);
349         }
350 
351         // Render request
352 
353         PortletRequest portletRequest = (PortletRequest)request.getAttribute(
354             JavaConstants.JAVAX_PORTLET_REQUEST);
355 
356         if (portletRequest != null) {
357             if (portletRequest instanceof RenderRequest) {
358                 velocityContext.put("renderRequest", portletRequest);
359             }
360         }
361 
362         // Render response
363 
364         PortletResponse portletResponse = (PortletResponse)request.getAttribute(
365             JavaConstants.JAVAX_PORTLET_RESPONSE);
366 
367         if (portletResponse != null) {
368             if (portletResponse instanceof RenderResponse) {
369                 velocityContext.put("renderResponse", portletResponse);
370             }
371         }
372 
373         // XML request
374 
375         if ((portletRequest != null) && (portletResponse != null)) {
376             String xmlRequest = PortletRequestUtil.toXML(
377                 portletRequest, portletResponse);
378 
379             velocityContext.put("xmlRequest", xmlRequest);
380         }
381 
382         // Theme display
383 
384         ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
385             WebKeys.THEME_DISPLAY);
386 
387         if (themeDisplay != null) {
388             Theme theme = themeDisplay.getTheme();
389 
390             Layout layout = themeDisplay.getLayout();
391             List<Layout> layouts = themeDisplay.getLayouts();
392 
393             velocityContext.put("themeDisplay", themeDisplay);
394             velocityContext.put("company", themeDisplay.getCompany());
395             velocityContext.put("user", themeDisplay.getUser());
396             velocityContext.put("realUser", themeDisplay.getRealUser());
397             velocityContext.put("layout", layout);
398             velocityContext.put("layouts", layouts);
399             velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
400             velocityContext.put(
401                 "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
402             velocityContext.put(
403                 "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
404             velocityContext.put(
405                 "permissionChecker", themeDisplay.getPermissionChecker());
406             velocityContext.put("locale", themeDisplay.getLocale());
407             velocityContext.put("timeZone", themeDisplay.getTimeZone());
408             velocityContext.put("theme", theme);
409             velocityContext.put("colorScheme", themeDisplay.getColorScheme());
410             velocityContext.put(
411                 "portletDisplay", themeDisplay.getPortletDisplay());
412 
413             // Navigation items
414 
415             if (layout != null) {
416                 RequestVars requestVars = new RequestVars(
417                     request, themeDisplay, layout.getAncestorPlid(),
418                     layout.getAncestorLayoutId());
419 
420                 List<NavItem> navItems = NavItem.fromLayouts(
421                     requestVars, layouts);
422 
423                 velocityContext.put("navItems", navItems);
424             }
425 
426             // Full css and templates path
427 
428             String servletContextName = GetterUtil.getString(
429                 theme.getServletContextName());
430 
431             velocityContext.put(
432                 "fullCssPath",
433                 servletContextName + theme.getVelocityResourceListener() +
434                     theme.getCssPath());
435 
436             velocityContext.put(
437                 "fullTemplatesPath",
438                 servletContextName + theme.getVelocityResourceListener() +
439                     theme.getTemplatesPath());
440 
441             // Init
442 
443             velocityContext.put(
444                 "init",
445                 themeDisplay.getPathContext() +
446                     VelocityResourceListener.SERVLET_SEPARATOR +
447                         "/html/themes/_unstyled/templates/init.vm");
448 
449             // Deprecated
450 
451             velocityContext.put(
452                 "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
453         }
454 
455         // Tiles attributes
456 
457         String tilesTitle = _insertTilesVariables(
458             velocityContext, request, "tilesTitle", "title");
459         String tilesContent = _insertTilesVariables(
460             velocityContext, request, "tilesContent", "content");
461         boolean tilesSelectable = GetterUtil.getBoolean(_insertTilesVariables(
462             velocityContext, request, "tilesSelectable", "selectable"));
463 
464         if (themeDisplay != null) {
465             themeDisplay.setTilesTitle(tilesTitle);
466             themeDisplay.setTilesContent(tilesContent);
467             themeDisplay.setTilesSelectable(tilesSelectable);
468         }
469 
470         // Page title and subtitle
471 
472         velocityContext.put(
473             "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
474         velocityContext.put(
475             "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
476 
477         // Helper utilities
478 
479         insertHelperUtilities(velocityContext, null);
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 String _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         String value = null;
516 
517         if (componentContext != null) {
518             value = (String)componentContext.getAttribute(attributeName);
519 
520             if (value != null) {
521                 velocityContext.put(attributeId, value);
522             }
523         }
524 
525         return value;
526     }
527 
528 }