001    /**
002     * Copyright (c) 2000-2012 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.audit.AuditMessageFactoryUtil;
018    import com.liferay.portal.kernel.audit.AuditRouterUtil;
019    import com.liferay.portal.kernel.language.LanguageUtil;
020    import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
021    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
022    import com.liferay.portal.kernel.util.ArrayUtil;
023    import com.liferay.portal.kernel.util.ArrayUtil_IW;
024    import com.liferay.portal.kernel.util.DateUtil_IW;
025    import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
026    import com.liferay.portal.kernel.util.GetterUtil;
027    import com.liferay.portal.kernel.util.GetterUtil_IW;
028    import com.liferay.portal.kernel.util.HtmlUtil;
029    import com.liferay.portal.kernel.util.HttpUtil;
030    import com.liferay.portal.kernel.util.JavaConstants;
031    import com.liferay.portal.kernel.util.LocaleUtil;
032    import com.liferay.portal.kernel.util.ParamUtil_IW;
033    import com.liferay.portal.kernel.util.Randomizer_IW;
034    import com.liferay.portal.kernel.util.StaticFieldGetter;
035    import com.liferay.portal.kernel.util.StringUtil_IW;
036    import com.liferay.portal.kernel.util.TimeZoneUtil_IW;
037    import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
038    import com.liferay.portal.kernel.util.Validator;
039    import com.liferay.portal.kernel.util.Validator_IW;
040    import com.liferay.portal.kernel.velocity.VelocityContext;
041    import com.liferay.portal.kernel.velocity.VelocityVariables;
042    import com.liferay.portal.kernel.xml.SAXReader;
043    import com.liferay.portal.model.Layout;
044    import com.liferay.portal.model.Theme;
045    import com.liferay.portal.service.permission.AccountPermissionUtil;
046    import com.liferay.portal.service.permission.CommonPermissionUtil;
047    import com.liferay.portal.service.permission.GroupPermissionUtil;
048    import com.liferay.portal.service.permission.LayoutPermissionUtil;
049    import com.liferay.portal.service.permission.OrganizationPermissionUtil;
050    import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
051    import com.liferay.portal.service.permission.PortalPermissionUtil;
052    import com.liferay.portal.service.permission.PortletPermissionUtil;
053    import com.liferay.portal.service.permission.RolePermissionUtil;
054    import com.liferay.portal.service.permission.UserGroupPermissionUtil;
055    import com.liferay.portal.service.permission.UserPermissionUtil;
056    import com.liferay.portal.theme.NavItem;
057    import com.liferay.portal.theme.RequestVars;
058    import com.liferay.portal.theme.ThemeDisplay;
059    import com.liferay.portal.util.PortalUtil;
060    import com.liferay.portal.util.PrefsPropsUtil_IW;
061    import com.liferay.portal.util.PropsUtil_IW;
062    import com.liferay.portal.util.SessionClicks_IW;
063    import com.liferay.portal.util.WebKeys;
064    import com.liferay.portal.webserver.WebServerServletTokenUtil;
065    import com.liferay.portlet.PortletConfigImpl;
066    import com.liferay.portlet.PortletURLFactoryUtil;
067    import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
068    import com.liferay.portlet.expando.service.ExpandoRowLocalService;
069    import com.liferay.portlet.expando.service.ExpandoTableLocalService;
070    import com.liferay.portlet.expando.service.ExpandoValueLocalService;
071    import com.liferay.portlet.journalcontent.util.JournalContentUtil;
072    import com.liferay.util.portlet.PortletRequestUtil;
073    
074    import java.util.List;
075    import java.util.Map;
076    
077    import javax.portlet.PortletRequest;
078    import javax.portlet.PortletResponse;
079    import javax.portlet.RenderRequest;
080    import javax.portlet.RenderResponse;
081    
082    import javax.servlet.http.HttpServletRequest;
083    
084    import org.apache.struts.taglib.tiles.ComponentConstants;
085    import org.apache.struts.tiles.ComponentContext;
086    import org.apache.velocity.tools.generic.DateTool;
087    import org.apache.velocity.tools.generic.EscapeTool;
088    import org.apache.velocity.tools.generic.IteratorTool;
089    import org.apache.velocity.tools.generic.ListTool;
090    import org.apache.velocity.tools.generic.MathTool;
091    import org.apache.velocity.tools.generic.NumberTool;
092    import org.apache.velocity.tools.generic.SortTool;
093    
094    /**
095     * @author Brian Wing Shun Chan
096     * @author Raymond Augé
097     */
098    public class VelocityVariablesImpl implements VelocityVariables {
099    
100            public void insertHelperUtilities(
101                    VelocityContext velocityContext, String[] restrictedVariables) {
102    
103                    // Array util
104    
105                    velocityContext.put("arrayUtil", ArrayUtil_IW.getInstance());
106    
107                    // Audit message factory
108    
109                    velocityContext.put(
110                            "auditMessageFactoryUtil",
111                            AuditMessageFactoryUtil.getAuditMessageFactory());
112    
113                    // Audit router util
114    
115                    velocityContext.put(
116                            "auditRouterUtil", AuditRouterUtil.getAuditRouter());
117    
118                    // Browser sniffer
119    
120                    velocityContext.put(
121                            "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
122    
123                    // Date format
124    
125                    velocityContext.put(
126                            "dateFormatFactory",
127                            FastDateFormatFactoryUtil.getFastDateFormatFactory());
128    
129                    // Date tool
130    
131                    velocityContext.put("dateTool", new DateTool());
132    
133                    // Date util
134    
135                    velocityContext.put("dateUtil", DateUtil_IW.getInstance());
136    
137                    // Escape tool
138    
139                    velocityContext.put("escapeTool", new EscapeTool());
140    
141                    // Expando column service
142    
143                    ServiceLocator serviceLocator = ServiceLocator.getInstance();
144    
145                    velocityContext.put(
146                            "expandoColumnLocalService",
147                            serviceLocator.findService(
148                                    ExpandoColumnLocalService.class.getName()));
149    
150                    // Expando row service
151    
152                    velocityContext.put(
153                            "expandoRowLocalService",
154                            serviceLocator.findService(ExpandoRowLocalService.class.getName()));
155    
156                    // Expando table service
157    
158                    velocityContext.put(
159                            "expandoTableLocalService",
160                            serviceLocator.findService(
161                                    ExpandoTableLocalService.class.getName()));
162    
163                    // Expando value service
164    
165                    velocityContext.put(
166                            "expandoValueLocalService",
167                            serviceLocator.findService(
168                                    ExpandoValueLocalService.class.getName()));
169    
170                    // Getter util
171    
172                    velocityContext.put("getterUtil", GetterUtil_IW.getInstance());
173    
174                    // Html util
175    
176                    velocityContext.put("htmlUtil", HtmlUtil.getHtml());
177    
178                    // Http util
179    
180                    velocityContext.put("httpUtil", HttpUtil.getHttp());
181    
182                    // Iterator tool
183    
184                    velocityContext.put("iteratorTool", new IteratorTool());
185    
186                    // Journal content util
187    
188                    velocityContext.put(
189                            "journalContentUtil", JournalContentUtil.getJournalContent());
190    
191                    // Language util
192    
193                    velocityContext.put("languageUtil", LanguageUtil.getLanguage());
194                    velocityContext.put(
195                            "unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage());
196    
197                    // List tool
198    
199                    velocityContext.put("listTool", new ListTool());
200    
201                    // Locale util
202    
203                    velocityContext.put("localeUtil", LocaleUtil.getInstance());
204    
205                    // Math tool
206    
207                    velocityContext.put("mathTool", new MathTool());
208    
209                    // Number tool
210    
211                    velocityContext.put("numberTool", new NumberTool());
212    
213                    // Param util
214    
215                    velocityContext.put("paramUtil", ParamUtil_IW.getInstance());
216    
217                    // Portal util
218    
219                    insertHelperUtility(
220                            velocityContext, restrictedVariables, "portalUtil",
221                            PortalUtil.getPortal());
222                    insertHelperUtility(
223                            velocityContext, restrictedVariables, "portal",
224                            PortalUtil.getPortal());
225    
226                    // Prefs props util
227    
228                    insertHelperUtility(
229                            velocityContext, restrictedVariables, "prefsPropsUtil",
230                            PrefsPropsUtil_IW.getInstance());
231    
232                    // Props util
233    
234                    insertHelperUtility(
235                            velocityContext, restrictedVariables, "propsUtil",
236                            PropsUtil_IW.getInstance());
237    
238                    // Portlet URL factory
239    
240                    velocityContext.put(
241                            "portletURLFactory", PortletURLFactoryUtil.getPortletURLFactory());
242    
243                    // Portlet preferences
244    
245                    insertHelperUtility(
246                            velocityContext, restrictedVariables, "velocityPortletPreferences",
247                            new VelocityPortletPreferences());
248    
249                    // Randomizer
250    
251                    velocityContext.put(
252                            "randomizer", Randomizer_IW.getInstance().getWrappedInstance());
253    
254                    // SAX reader util
255    
256                    UtilLocator utilLocator = UtilLocator.getInstance();
257    
258                    velocityContext.put(
259                            "saxReaderUtil", utilLocator.findUtil(SAXReader.class.getName()));
260    
261                    // Service locator
262    
263                    insertHelperUtility(
264                            velocityContext, restrictedVariables, "serviceLocator",
265                            serviceLocator);
266    
267                    // Session clicks
268    
269                    insertHelperUtility(
270                            velocityContext, restrictedVariables, "sessionClicks",
271                            SessionClicks_IW.getInstance());
272    
273                    // Sort tool
274    
275                    velocityContext.put("sortTool", new SortTool());
276    
277                    // Static field getter
278    
279                    velocityContext.put(
280                            "staticFieldGetter", StaticFieldGetter.getInstance());
281    
282                    // String util
283    
284                    velocityContext.put("stringUtil", StringUtil_IW.getInstance());
285    
286                    // Time zone util
287    
288                    velocityContext.put("timeZoneUtil", TimeZoneUtil_IW.getInstance());
289    
290                    // Util locator
291    
292                    insertHelperUtility(
293                            velocityContext, restrictedVariables, "utilLocator", utilLocator);
294    
295                    // Unicode formatter
296    
297                    velocityContext.put(
298                            "unicodeFormatter", UnicodeFormatter_IW.getInstance());
299    
300                    // Validator
301    
302                    velocityContext.put("validator", Validator_IW.getInstance());
303    
304                    // Web server servlet token
305    
306                    velocityContext.put(
307                            "webServerToken",
308                            WebServerServletTokenUtil.getWebServerServletToken());
309    
310                    // Permissions
311    
312                    velocityContext.put(
313                            "accountPermission", AccountPermissionUtil.getAccountPermission());
314                    velocityContext.put(
315                            "commonPermission", CommonPermissionUtil.getCommonPermission());
316                    velocityContext.put(
317                            "groupPermission", GroupPermissionUtil.getGroupPermission());
318                    velocityContext.put(
319                            "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
320                    velocityContext.put(
321                            "organizationPermission",
322                            OrganizationPermissionUtil.getOrganizationPermission());
323                    velocityContext.put(
324                            "passwordPolicyPermission",
325                            PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
326                    velocityContext.put(
327                            "portalPermission", PortalPermissionUtil.getPortalPermission());
328                    velocityContext.put(
329                            "portletPermission", PortletPermissionUtil.getPortletPermission());
330                    velocityContext.put(
331                            "rolePermission", RolePermissionUtil.getRolePermission());
332                    velocityContext.put(
333                            "userGroupPermission",
334                            UserGroupPermissionUtil.getUserGroupPermission());
335                    velocityContext.put(
336                            "userPermission", UserPermissionUtil.getUserPermission());
337    
338                    // Deprecated
339    
340                    velocityContext.put(
341                            "dateFormats",
342                            FastDateFormatFactoryUtil.getFastDateFormatFactory());
343                    velocityContext.put(
344                            "imageToken", WebServerServletTokenUtil.getWebServerServletToken());
345                    velocityContext.put(
346                            "locationPermission",
347                            OrganizationPermissionUtil.getOrganizationPermission());
348            }
349    
350            public void insertVariables(
351                            VelocityContext velocityContext, HttpServletRequest request)
352                    throws Exception {
353    
354                    // Request
355    
356                    velocityContext.put("request", request);
357    
358                    // Portlet config
359    
360                    PortletConfigImpl portletConfigImpl =
361                            (PortletConfigImpl)request.getAttribute(
362                                    JavaConstants.JAVAX_PORTLET_CONFIG);
363    
364                    if (portletConfigImpl != null) {
365                            velocityContext.put("portletConfig", portletConfigImpl);
366                    }
367    
368                    // Render request
369    
370                    final PortletRequest portletRequest =
371                            (PortletRequest)request.getAttribute(
372                                    JavaConstants.JAVAX_PORTLET_REQUEST);
373    
374                    if (portletRequest != null) {
375                            if (portletRequest instanceof RenderRequest) {
376                                    velocityContext.put("renderRequest", portletRequest);
377                            }
378                    }
379    
380                    // Render response
381    
382                    final PortletResponse portletResponse =
383                            (PortletResponse)request.getAttribute(
384                                    JavaConstants.JAVAX_PORTLET_RESPONSE);
385    
386                    if (portletResponse != null) {
387                            if (portletResponse instanceof RenderResponse) {
388                                    velocityContext.put("renderResponse", portletResponse);
389                            }
390                    }
391    
392                    // XML request
393    
394                    if ((portletRequest != null) && (portletResponse != null)) {
395                            velocityContext.put(
396                                    "xmlRequest",
397                                    new Object() {
398    
399                                            @Override
400                                            public String toString() {
401                                                    return PortletRequestUtil.toXML(
402                                                            portletRequest, portletResponse);
403                                            }
404    
405                                    }
406                            );
407                    }
408    
409                    // Theme display
410    
411                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
412                            WebKeys.THEME_DISPLAY);
413    
414                    if (themeDisplay != null) {
415                            Layout layout = themeDisplay.getLayout();
416                            List<Layout> layouts = themeDisplay.getLayouts();
417    
418                            velocityContext.put("themeDisplay", themeDisplay);
419                            velocityContext.put("company", themeDisplay.getCompany());
420                            velocityContext.put("user", themeDisplay.getUser());
421                            velocityContext.put("realUser", themeDisplay.getRealUser());
422                            velocityContext.put("layout", layout);
423                            velocityContext.put("layouts", layouts);
424                            velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
425                            velocityContext.put(
426                                    "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
427                            velocityContext.put(
428                                    "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
429                            velocityContext.put(
430                                    "permissionChecker", themeDisplay.getPermissionChecker());
431                            velocityContext.put("locale", themeDisplay.getLocale());
432                            velocityContext.put("timeZone", themeDisplay.getTimeZone());
433                            velocityContext.put("colorScheme", themeDisplay.getColorScheme());
434                            velocityContext.put(
435                                    "portletDisplay", themeDisplay.getPortletDisplay());
436    
437                            // Navigation items
438    
439                            if (layout != null) {
440                                    RequestVars requestVars = new RequestVars(
441                                            request, themeDisplay, layout.getAncestorPlid(),
442                                            layout.getAncestorLayoutId());
443    
444                                    List<NavItem> navItems = NavItem.fromLayouts(
445                                            requestVars, layouts);
446    
447                                    velocityContext.put("navItems", navItems);
448                            }
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                    // Theme
465    
466                    Theme theme = (Theme)request.getAttribute(WebKeys.THEME);
467    
468                    if ((theme == null) && (themeDisplay != null)) {
469                            theme = themeDisplay.getTheme();
470                    }
471    
472                    if (theme != null) {
473    
474                            // Full css and templates path
475    
476                            velocityContext.put("theme", theme);
477    
478                            String servletContextName = GetterUtil.getString(
479                                    theme.getServletContextName());
480    
481                            velocityContext.put(
482                                    "fullCssPath",
483                                    servletContextName + theme.getVelocityResourceListener() +
484                                            theme.getCssPath());
485    
486                            velocityContext.put(
487                                    "fullTemplatesPath",
488                                    servletContextName + theme.getVelocityResourceListener() +
489                                            theme.getTemplatesPath());
490                    }
491    
492                    // Tiles attributes
493    
494                    insertTilesVariables(velocityContext, request);
495    
496                    // Page title and subtitle
497    
498                    velocityContext.put(
499                            "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
500                    velocityContext.put(
501                            "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
502    
503                    // Insert custom vm variables
504    
505                    Map<String, Object> vmVariables =
506                            (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
507    
508                    if (vmVariables != null) {
509                            for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
510                                    String key = entry.getKey();
511                                    Object value = entry.getValue();
512    
513                                    if (Validator.isNotNull(key)) {
514                                            velocityContext.put(key, value);
515                                    }
516                            }
517                    }
518            }
519    
520            protected void insertHelperUtility(
521                    VelocityContext velocityContext, String[] restrictedVariables,
522                    String key, Object value) {
523    
524                    if (!ArrayUtil.contains(restrictedVariables, key)) {
525                            velocityContext.put(key, value);
526                    }
527            }
528    
529            protected void insertTilesVariables(
530                    VelocityContext velocityContext, HttpServletRequest request) {
531    
532                    ComponentContext componentContext =
533                            (ComponentContext)request.getAttribute(
534                                    ComponentConstants.COMPONENT_CONTEXT);
535    
536                    if (componentContext == null) {
537                            return;
538                    }
539    
540                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
541                            WebKeys.THEME_DISPLAY);
542    
543                    String tilesTitle = (String)componentContext.getAttribute("title");
544    
545                    themeDisplay.setTilesTitle(tilesTitle);
546    
547                    velocityContext.put("tilesTitle", tilesTitle);
548    
549                    String tilesContent = (String)componentContext.getAttribute("content");
550    
551                    themeDisplay.setTilesContent(tilesContent);
552    
553                    velocityContext.put("tilesContent", tilesContent);
554    
555                    boolean tilesSelectable = GetterUtil.getBoolean(
556                            (String)componentContext.getAttribute("selectable"));
557    
558                    themeDisplay.setTilesSelectable(tilesSelectable);
559    
560                    velocityContext.put("tilesSelectable", tilesSelectable);
561            }
562    
563    }