001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.velocity;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
019    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
020    import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
021    import com.liferay.portal.kernel.util.ArrayUtil;
022    import com.liferay.portal.kernel.util.ArrayUtil_IW;
023    import com.liferay.portal.kernel.util.DateUtil_IW;
024    import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
025    import com.liferay.portal.kernel.util.GetterUtil;
026    import com.liferay.portal.kernel.util.GetterUtil_IW;
027    import com.liferay.portal.kernel.util.HtmlUtil;
028    import com.liferay.portal.kernel.util.HttpUtil;
029    import com.liferay.portal.kernel.util.JavaConstants;
030    import com.liferay.portal.kernel.util.LocaleUtil;
031    import com.liferay.portal.kernel.util.ParamUtil_IW;
032    import com.liferay.portal.kernel.util.Randomizer_IW;
033    import com.liferay.portal.kernel.util.StaticFieldGetter;
034    import com.liferay.portal.kernel.util.StringUtil_IW;
035    import com.liferay.portal.kernel.util.TimeZoneUtil_IW;
036    import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
037    import com.liferay.portal.kernel.util.Validator;
038    import com.liferay.portal.kernel.util.Validator_IW;
039    import com.liferay.portal.kernel.velocity.VelocityContext;
040    import com.liferay.portal.kernel.xml.SAXReader;
041    import com.liferay.portal.model.Layout;
042    import com.liferay.portal.model.Theme;
043    import com.liferay.portal.service.permission.AccountPermissionUtil;
044    import com.liferay.portal.service.permission.CommonPermissionUtil;
045    import com.liferay.portal.service.permission.GroupPermissionUtil;
046    import com.liferay.portal.service.permission.LayoutPermissionUtil;
047    import com.liferay.portal.service.permission.OrganizationPermissionUtil;
048    import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
049    import com.liferay.portal.service.permission.PortalPermissionUtil;
050    import com.liferay.portal.service.permission.PortletPermissionUtil;
051    import com.liferay.portal.service.permission.RolePermissionUtil;
052    import com.liferay.portal.service.permission.UserGroupPermissionUtil;
053    import com.liferay.portal.service.permission.UserPermissionUtil;
054    import com.liferay.portal.theme.NavItem;
055    import com.liferay.portal.theme.RequestVars;
056    import com.liferay.portal.theme.ThemeDisplay;
057    import com.liferay.portal.util.PortalUtil;
058    import com.liferay.portal.util.PrefsPropsUtil_IW;
059    import com.liferay.portal.util.PropsUtil_IW;
060    import com.liferay.portal.util.SessionClicks_IW;
061    import com.liferay.portal.util.WebKeys;
062    import com.liferay.portlet.PortletConfigImpl;
063    import com.liferay.portlet.PortletURLFactoryUtil;
064    import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
065    import com.liferay.portlet.expando.service.ExpandoRowLocalService;
066    import com.liferay.portlet.expando.service.ExpandoTableLocalService;
067    import com.liferay.portlet.expando.service.ExpandoValueLocalService;
068    import com.liferay.portlet.journalcontent.util.JournalContentUtil;
069    import com.liferay.util.portlet.PortletRequestUtil;
070    
071    import java.util.List;
072    import java.util.Map;
073    
074    import javax.portlet.PortletRequest;
075    import javax.portlet.PortletResponse;
076    import javax.portlet.RenderRequest;
077    import javax.portlet.RenderResponse;
078    
079    import javax.servlet.http.HttpServletRequest;
080    
081    import org.apache.struts.taglib.tiles.ComponentConstants;
082    import org.apache.struts.tiles.ComponentContext;
083    import org.apache.velocity.tools.generic.DateTool;
084    import org.apache.velocity.tools.generic.EscapeTool;
085    import org.apache.velocity.tools.generic.IteratorTool;
086    import org.apache.velocity.tools.generic.ListTool;
087    import org.apache.velocity.tools.generic.MathTool;
088    import org.apache.velocity.tools.generic.NumberTool;
089    import org.apache.velocity.tools.generic.SortTool;
090    
091    /**
092     * @author Brian Wing Shun Chan
093     * @author Raymond Augé
094     */
095    public class VelocityVariables {
096    
097            public static void insertHelperUtilities(
098                    VelocityContext velocityContext, String[] restrictedVariables) {
099    
100                    // Array util
101    
102                    velocityContext.put("arrayUtil", ArrayUtil_IW.getInstance());
103    
104                    // Browser sniffer
105    
106                    velocityContext.put(
107                            "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
108    
109                    // Date format
110    
111                    velocityContext.put(
112                            "dateFormatFactory",
113                            FastDateFormatFactoryUtil.getFastDateFormatFactory());
114    
115                    // Date tool
116    
117                    velocityContext.put("dateTool", new DateTool());
118    
119                    // Date util
120    
121                    velocityContext.put("dateUtil", DateUtil_IW.getInstance());
122    
123                    // Escape tool
124    
125                    velocityContext.put("escapeTool", new EscapeTool());
126    
127                    // Expando column service
128    
129                    ServiceLocator serviceLocator = ServiceLocator.getInstance();
130    
131                    velocityContext.put(
132                            "expandoColumnLocalService",
133                            serviceLocator.findService(
134                                    ExpandoColumnLocalService.class.getName()));
135    
136                    // Expando row service
137    
138                    velocityContext.put(
139                            "expandoRowLocalService",
140                            serviceLocator.findService(ExpandoRowLocalService.class.getName()));
141    
142                    // Expando table service
143    
144                    velocityContext.put(
145                            "expandoTableLocalService",
146                            serviceLocator.findService(
147                                    ExpandoTableLocalService.class.getName()));
148    
149                    // Expando value service
150    
151                    velocityContext.put(
152                            "expandoValueLocalService",
153                            serviceLocator.findService(
154                                    ExpandoValueLocalService.class.getName()));
155    
156                    // Getter util
157    
158                    velocityContext.put("getterUtil", GetterUtil_IW.getInstance());
159    
160                    // Html util
161    
162                    velocityContext.put("htmlUtil", HtmlUtil.getHtml());
163    
164                    // Http util
165    
166                    velocityContext.put("httpUtil", HttpUtil.getHttp());
167    
168                    // Image servlet token
169    
170                    velocityContext.put(
171                            "imageToken", ImageServletTokenUtil.getImageServletToken());
172    
173                    // Iterator tool
174    
175                    velocityContext.put("iteratorTool", new IteratorTool());
176    
177                    // Journal content util
178    
179                    velocityContext.put(
180                            "journalContentUtil", JournalContentUtil.getJournalContent());
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", PortletURLFactoryUtil.getPortletURLFactory());
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                    // SAX reader util
246    
247                    UtilLocator utilLocator = UtilLocator.getInstance();
248    
249                    velocityContext.put(
250                            "saxReaderUtil", utilLocator.findUtil(SAXReader.class.getName()));
251    
252                    // Service locator
253    
254                    _insertHelperUtility(
255                            velocityContext, restrictedVariables, "serviceLocator",
256                            serviceLocator);
257    
258                    // Session clicks
259    
260                    _insertHelperUtility(
261                            velocityContext, restrictedVariables, "sessionClicks",
262                            SessionClicks_IW.getInstance());
263    
264                    // Sort tool
265    
266                    velocityContext.put("sortTool", new SortTool());
267    
268                    // Static field getter
269    
270                    velocityContext.put(
271                            "staticFieldGetter", StaticFieldGetter.getInstance());
272    
273                    // String util
274    
275                    velocityContext.put("stringUtil", StringUtil_IW.getInstance());
276    
277                    // Time zone util
278    
279                    velocityContext.put("timeZoneUtil", TimeZoneUtil_IW.getInstance());
280    
281                    // Util locator
282    
283                    _insertHelperUtility(
284                            velocityContext, restrictedVariables, "utilLocator", utilLocator);
285    
286                    // Unicode formatter
287    
288                    velocityContext.put(
289                            "unicodeFormatter", UnicodeFormatter_IW.getInstance());
290    
291                    // Validator
292    
293                    velocityContext.put("validator", Validator_IW.getInstance());
294    
295                    // Permissions
296    
297                    velocityContext.put(
298                            "accountPermission", AccountPermissionUtil.getAccountPermission());
299                    velocityContext.put(
300                            "commonPermission", CommonPermissionUtil.getCommonPermission());
301                    velocityContext.put(
302                            "groupPermission", GroupPermissionUtil.getGroupPermission());
303                    velocityContext.put(
304                            "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
305                    velocityContext.put(
306                            "organizationPermission",
307                            OrganizationPermissionUtil.getOrganizationPermission());
308                    velocityContext.put(
309                            "passwordPolicyPermission",
310                            PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
311                    velocityContext.put(
312                            "portalPermission", PortalPermissionUtil.getPortalPermission());
313                    velocityContext.put(
314                            "portletPermission", PortletPermissionUtil.getPortletPermission());
315                    velocityContext.put(
316                            "rolePermission", RolePermissionUtil.getRolePermission());
317                    velocityContext.put(
318                            "userGroupPermission",
319                            UserGroupPermissionUtil.getUserGroupPermission());
320                    velocityContext.put(
321                            "userPermission", UserPermissionUtil.getUserPermission());
322    
323                    // Deprecated
324    
325                    velocityContext.put(
326                            "dateFormats",
327                            FastDateFormatFactoryUtil.getFastDateFormatFactory());
328                    velocityContext.put(
329                            "locationPermission",
330                            OrganizationPermissionUtil.getOrganizationPermission());
331            }
332    
333            public static void insertVariables(
334                            VelocityContext velocityContext, HttpServletRequest request)
335                    throws Exception {
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                    final PortletRequest portletRequest =
354                            (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                    final PortletResponse portletResponse =
366                            (PortletResponse)request.getAttribute(
367                                    JavaConstants.JAVAX_PORTLET_RESPONSE);
368    
369                    if (portletResponse != null) {
370                            if (portletResponse instanceof RenderResponse) {
371                                    velocityContext.put("renderResponse", portletResponse);
372                            }
373                    }
374    
375                    // XML request
376    
377                    if ((portletRequest != null) && (portletResponse != null)) {
378                            velocityContext.put(
379                                    "xmlRequest",
380                                    new Object() {
381    
382                                            public String toString() {
383                                                    return PortletRequestUtil.toXML(
384                                                            portletRequest, portletResponse);
385                                            }
386    
387                                    }
388                            );
389                    }
390    
391                    // Theme display
392    
393                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
394                            WebKeys.THEME_DISPLAY);
395    
396                    if (themeDisplay != null) {
397                            Theme theme = themeDisplay.getTheme();
398    
399                            Layout layout = themeDisplay.getLayout();
400                            List<Layout> layouts = themeDisplay.getLayouts();
401    
402                            velocityContext.put("themeDisplay", themeDisplay);
403                            velocityContext.put("company", themeDisplay.getCompany());
404                            velocityContext.put("user", themeDisplay.getUser());
405                            velocityContext.put("realUser", themeDisplay.getRealUser());
406                            velocityContext.put("layout", layout);
407                            velocityContext.put("layouts", layouts);
408                            velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
409                            velocityContext.put(
410                                    "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
411                            velocityContext.put(
412                                    "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
413                            velocityContext.put(
414                                    "permissionChecker", themeDisplay.getPermissionChecker());
415                            velocityContext.put("locale", themeDisplay.getLocale());
416                            velocityContext.put("timeZone", themeDisplay.getTimeZone());
417                            velocityContext.put("theme", theme);
418                            velocityContext.put("colorScheme", themeDisplay.getColorScheme());
419                            velocityContext.put(
420                                    "portletDisplay", themeDisplay.getPortletDisplay());
421    
422                            // Navigation items
423    
424                            if (layout != null) {
425                                    RequestVars requestVars = new RequestVars(
426                                            request, themeDisplay, layout.getAncestorPlid(),
427                                            layout.getAncestorLayoutId());
428    
429                                    List<NavItem> navItems = NavItem.fromLayouts(
430                                            requestVars, layouts);
431    
432                                    velocityContext.put("navItems", navItems);
433                            }
434    
435                            // Full css and templates path
436    
437                            String servletContextName = GetterUtil.getString(
438                                    theme.getServletContextName());
439    
440                            velocityContext.put(
441                                    "fullCssPath",
442                                    servletContextName + theme.getVelocityResourceListener() +
443                                            theme.getCssPath());
444    
445                            velocityContext.put(
446                                    "fullTemplatesPath",
447                                    servletContextName + theme.getVelocityResourceListener() +
448                                            theme.getTemplatesPath());
449    
450                            // Init
451    
452                            velocityContext.put(
453                                    "init",
454                                    themeDisplay.getPathContext() +
455                                            VelocityResourceListener.SERVLET_SEPARATOR +
456                                                    "/html/themes/_unstyled/templates/init.vm");
457    
458                            // Deprecated
459    
460                            velocityContext.put(
461                                    "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
462                    }
463    
464                    // Tiles attributes
465    
466                    _insertTilesVariables(velocityContext, request, "tilesTitle", "title");
467                    _insertTilesVariables(
468                            velocityContext, request, "tilesContent", "content");
469                    _insertTilesVariables(
470                            velocityContext, request, "tilesSelectable", "selectable");
471    
472                    // Page title and subtitle
473    
474                    velocityContext.put(
475                            "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
476                    velocityContext.put(
477                            "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
478    
479                    // Insert custom vm variables
480    
481                    Map<String, Object> vmVariables =
482                            (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
483    
484                    if (vmVariables != null) {
485                            for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
486                                    String key = entry.getKey();
487                                    Object value = entry.getValue();
488    
489                                    if (Validator.isNotNull(key)) {
490                                            velocityContext.put(key, value);
491                                    }
492                            }
493                    }
494            }
495    
496            private static void _insertHelperUtility(
497                    VelocityContext velocityContext, String[] restrictedVariables,
498                    String key, Object value) {
499    
500                    if (!ArrayUtil.contains(restrictedVariables, key)) {
501                            velocityContext.put(key, value);
502                    }
503            }
504    
505            private static void _insertTilesVariables(
506                    VelocityContext velocityContext, HttpServletRequest request,
507                    String attributeId, String attributeName) {
508    
509                    ComponentContext componentContext =
510                            (ComponentContext)request.getAttribute(
511                                    ComponentConstants.COMPONENT_CONTEXT);
512    
513                    if (componentContext != null) {
514                            String value = (String)componentContext.getAttribute(attributeName);
515    
516                            if (value != null) {
517                                    velocityContext.put(attributeId, value);
518                            }
519                    }
520            }
521    
522    }