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