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