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