001    /**
002     * Copyright (c) 2000-2013 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.log.Log;
023    import com.liferay.portal.kernel.log.LogFactoryUtil;
024    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
025    import com.liferay.portal.kernel.util.ArrayUtil;
026    import com.liferay.portal.kernel.util.ArrayUtil_IW;
027    import com.liferay.portal.kernel.util.DateUtil_IW;
028    import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
029    import com.liferay.portal.kernel.util.GetterUtil;
030    import com.liferay.portal.kernel.util.GetterUtil_IW;
031    import com.liferay.portal.kernel.util.HtmlUtil;
032    import com.liferay.portal.kernel.util.HttpUtil;
033    import com.liferay.portal.kernel.util.JavaConstants;
034    import com.liferay.portal.kernel.util.LocaleUtil;
035    import com.liferay.portal.kernel.util.ParamUtil_IW;
036    import com.liferay.portal.kernel.util.PrefsPropsUtil;
037    import com.liferay.portal.kernel.util.PropsUtil;
038    import com.liferay.portal.kernel.util.Randomizer_IW;
039    import com.liferay.portal.kernel.util.StaticFieldGetter;
040    import com.liferay.portal.kernel.util.StringUtil_IW;
041    import com.liferay.portal.kernel.util.TimeZoneUtil_IW;
042    import com.liferay.portal.kernel.util.UnicodeFormatter_IW;
043    import com.liferay.portal.kernel.util.Validator;
044    import com.liferay.portal.kernel.util.Validator_IW;
045    import com.liferay.portal.kernel.velocity.VelocityContext;
046    import com.liferay.portal.kernel.velocity.VelocityVariables;
047    import com.liferay.portal.kernel.xml.SAXReader;
048    import com.liferay.portal.model.Layout;
049    import com.liferay.portal.model.Theme;
050    import com.liferay.portal.service.permission.AccountPermissionUtil;
051    import com.liferay.portal.service.permission.CommonPermissionUtil;
052    import com.liferay.portal.service.permission.GroupPermissionUtil;
053    import com.liferay.portal.service.permission.LayoutPermissionUtil;
054    import com.liferay.portal.service.permission.OrganizationPermissionUtil;
055    import com.liferay.portal.service.permission.PasswordPolicyPermissionUtil;
056    import com.liferay.portal.service.permission.PortalPermissionUtil;
057    import com.liferay.portal.service.permission.PortletPermissionUtil;
058    import com.liferay.portal.service.permission.RolePermissionUtil;
059    import com.liferay.portal.service.permission.UserGroupPermissionUtil;
060    import com.liferay.portal.service.permission.UserPermissionUtil;
061    import com.liferay.portal.theme.NavItem;
062    import com.liferay.portal.theme.RequestVars;
063    import com.liferay.portal.theme.ThemeDisplay;
064    import com.liferay.portal.util.PortalUtil;
065    import com.liferay.portal.util.SessionClicks_IW;
066    import com.liferay.portal.util.WebKeys;
067    import com.liferay.portal.webserver.WebServerServletTokenUtil;
068    import com.liferay.portlet.PortletURLFactoryUtil;
069    import com.liferay.portlet.expando.service.ExpandoColumnLocalService;
070    import com.liferay.portlet.expando.service.ExpandoRowLocalService;
071    import com.liferay.portlet.expando.service.ExpandoTableLocalService;
072    import com.liferay.portlet.expando.service.ExpandoValueLocalService;
073    import com.liferay.portlet.journalcontent.util.JournalContentUtil;
074    import com.liferay.taglib.util.VelocityTaglibImpl;
075    import com.liferay.util.portlet.PortletRequestUtil;
076    
077    import java.lang.reflect.Method;
078    
079    import java.util.List;
080    import java.util.Map;
081    
082    import javax.portlet.PortletConfig;
083    import javax.portlet.PortletRequest;
084    import javax.portlet.PortletResponse;
085    import javax.portlet.RenderRequest;
086    import javax.portlet.RenderResponse;
087    
088    import javax.servlet.http.HttpServletRequest;
089    
090    import org.apache.struts.taglib.tiles.ComponentConstants;
091    import org.apache.struts.tiles.ComponentContext;
092    import org.apache.velocity.tools.generic.DateTool;
093    import org.apache.velocity.tools.generic.EscapeTool;
094    import org.apache.velocity.tools.generic.IteratorTool;
095    import org.apache.velocity.tools.generic.ListTool;
096    import org.apache.velocity.tools.generic.MathTool;
097    import org.apache.velocity.tools.generic.NumberTool;
098    import org.apache.velocity.tools.generic.SortTool;
099    
100    /**
101     * @author Brian Wing Shun Chan
102     * @author Raymond Aug??
103     */
104    public class VelocityVariablesImpl implements VelocityVariables {
105    
106            @Override
107            public void insertHelperUtilities(
108                    VelocityContext velocityContext, String[] restrictedVariables) {
109    
110                    // Array util
111    
112                    velocityContext.put("arrayUtil", ArrayUtil_IW.getInstance());
113    
114                    // Audit message factory
115    
116                    try {
117                            velocityContext.put(
118                                    "auditMessageFactoryUtil",
119                                    AuditMessageFactoryUtil.getAuditMessageFactory());
120                    }
121                    catch (SecurityException se) {
122                            _log.error(se, se);
123                    }
124    
125                    // Audit router util
126    
127                    try {
128                            velocityContext.put(
129                                    "auditRouterUtil", AuditRouterUtil.getAuditRouter());
130                    }
131                    catch (SecurityException se) {
132                            _log.error(se, se);
133                    }
134    
135                    // Browser sniffer
136    
137                    try {
138                            velocityContext.put(
139                                    "browserSniffer", BrowserSnifferUtil.getBrowserSniffer());
140                    }
141                    catch (SecurityException se) {
142                            _log.error(se, se);
143                    }
144    
145                    // Date format
146    
147                    try {
148                            velocityContext.put(
149                                    "dateFormatFactory",
150                                    FastDateFormatFactoryUtil.getFastDateFormatFactory());
151                    }
152                    catch (SecurityException se) {
153                            _log.error(se, se);
154                    }
155    
156                    // Date tool
157    
158                    velocityContext.put("dateTool", new DateTool());
159    
160                    // Date util
161    
162                    velocityContext.put("dateUtil", DateUtil_IW.getInstance());
163    
164                    // Escape tool
165    
166                    velocityContext.put("escapeTool", new EscapeTool());
167    
168                    // Service locator
169    
170                    try {
171                            ServiceLocator serviceLocator = ServiceLocator.getInstance();
172    
173                            insertHelperUtility(
174                                    velocityContext, restrictedVariables, "serviceLocator",
175                                    serviceLocator);
176    
177                            // Expando column service
178    
179                            try {
180                                    velocityContext.put(
181                                            "expandoColumnLocalService",
182                                            serviceLocator.findService(
183                                                    ExpandoColumnLocalService.class.getName()));
184                            }
185                            catch (SecurityException se) {
186                                    _log.error(se, se);
187                            }
188    
189                            // Expando row service
190    
191                            try {
192                                    velocityContext.put(
193                                            "expandoRowLocalService",
194                                            serviceLocator.findService(
195                                                    ExpandoRowLocalService.class.getName()));
196                            }
197                            catch (SecurityException se) {
198                                    _log.error(se, se);
199                            }
200    
201                            // Expando table service
202    
203                            try {
204                                    velocityContext.put(
205                                            "expandoTableLocalService",
206                                            serviceLocator.findService(
207                                                    ExpandoTableLocalService.class.getName()));
208                            }
209                            catch (SecurityException se) {
210                                    _log.error(se, se);
211                            }
212    
213                            // Expando value service
214    
215                            try {
216                                    velocityContext.put(
217                                            "expandoValueLocalService",
218                                            serviceLocator.findService(
219                                                    ExpandoValueLocalService.class.getName()));
220                            }
221                            catch (SecurityException se) {
222                                    _log.error(se, se);
223                            }
224                    }
225                    catch (SecurityException se) {
226                            _log.error(se, se);
227                    }
228    
229                    // Getter util
230    
231                    velocityContext.put("getterUtil", GetterUtil_IW.getInstance());
232    
233                    // Html util
234    
235                    try {
236                            velocityContext.put("htmlUtil", HtmlUtil.getHtml());
237                    }
238                    catch (SecurityException se) {
239                            _log.error(se, se);
240                    }
241    
242                    // Http util
243    
244                    try {
245                            velocityContext.put("httpUtil", HttpUtil.getHttp());
246                    }
247                    catch (SecurityException se) {
248                            _log.error(se, se);
249                    }
250    
251                    // Iterator tool
252    
253                    velocityContext.put("iteratorTool", new IteratorTool());
254    
255                    // Journal content util
256    
257                    try {
258                            velocityContext.put(
259                                    "journalContentUtil", JournalContentUtil.getJournalContent());
260                    }
261                    catch (SecurityException se) {
262                            _log.error(se, se);
263                    }
264    
265                    // JSON factory util
266    
267                    try {
268                            velocityContext.put(
269                                    "jsonFactoryUtil", JSONFactoryUtil.getJSONFactory());
270                    }
271                    catch (SecurityException se) {
272                            _log.error(se, se);
273                    }
274    
275                    // Language util
276    
277                    try {
278                            velocityContext.put("languageUtil", LanguageUtil.getLanguage());
279                    }
280                    catch (SecurityException se) {
281                            _log.error(se, se);
282                    }
283    
284                    try {
285                            velocityContext.put(
286                                    "unicodeLanguageUtil",
287                                    UnicodeLanguageUtil.getUnicodeLanguage());
288                    }
289                    catch (SecurityException se) {
290                            _log.error(se, se);
291                    }
292    
293                    // List tool
294    
295                    velocityContext.put("listTool", new ListTool());
296    
297                    // Locale util
298    
299                    try {
300                            velocityContext.put("localeUtil", LocaleUtil.getInstance());
301                    }
302                    catch (SecurityException se) {
303                            _log.error(se, se);
304                    }
305    
306                    // Math tool
307    
308                    velocityContext.put("mathTool", new MathTool());
309    
310                    // Number tool
311    
312                    velocityContext.put("numberTool", new NumberTool());
313    
314                    // Param util
315    
316                    velocityContext.put("paramUtil", ParamUtil_IW.getInstance());
317    
318                    // Portal util
319    
320                    try {
321                            insertHelperUtility(
322                                    velocityContext, restrictedVariables, "portalUtil",
323                                    PortalUtil.getPortal());
324                            insertHelperUtility(
325                                    velocityContext, restrictedVariables, "portal",
326                                    PortalUtil.getPortal());
327                    }
328                    catch (SecurityException se) {
329                            _log.error(se, se);
330                    }
331    
332                    // Prefs props util
333    
334                    try {
335                            insertHelperUtility(
336                                    velocityContext, restrictedVariables, "prefsPropsUtil",
337                                    PrefsPropsUtil.getPrefsProps());
338                    }
339                    catch (SecurityException se) {
340                            _log.error(se, se);
341                    }
342    
343                    // Props util
344    
345                    try {
346                            insertHelperUtility(
347                                    velocityContext, restrictedVariables, "propsUtil",
348                                    PropsUtil.getProps());
349                    }
350                    catch (SecurityException se) {
351                            _log.error(se, se);
352                    }
353    
354                    // Portlet URL factory
355    
356                    try {
357                            velocityContext.put(
358                                    "portletURLFactory",
359                                    PortletURLFactoryUtil.getPortletURLFactory());
360                    }
361                    catch (SecurityException se) {
362                            _log.error(se, se);
363                    }
364    
365                    // Portlet preferences
366    
367                    insertHelperUtility(
368                            velocityContext, restrictedVariables, "velocityPortletPreferences",
369                            new VelocityPortletPreferences());
370    
371                    // Randomizer
372    
373                    velocityContext.put(
374                            "randomizer", Randomizer_IW.getInstance().getWrappedInstance());
375    
376                    // Util locator
377    
378                    try {
379                            UtilLocator utilLocator = UtilLocator.getInstance();
380    
381                            insertHelperUtility(
382                                    velocityContext, restrictedVariables, "utilLocator",
383                                    utilLocator);
384    
385                            // SAX reader util
386    
387                            try {
388                                    velocityContext.put(
389                                            "saxReaderUtil",
390                                            utilLocator.findUtil(SAXReader.class.getName()));
391                            }
392                            catch (SecurityException se) {
393                                    _log.error(se, se);
394                            }
395                    }
396                    catch (SecurityException se) {
397                            _log.error(se, se);
398                    }
399    
400                    // Session clicks
401    
402                    try {
403                            insertHelperUtility(
404                                    velocityContext, restrictedVariables, "sessionClicks",
405                                    SessionClicks_IW.getInstance());
406                    }
407                    catch (SecurityException se) {
408                            _log.error(se, se);
409                    }
410    
411                    // Sort tool
412    
413                    velocityContext.put("sortTool", new SortTool());
414    
415                    // Static field getter
416    
417                    velocityContext.put(
418                            "staticFieldGetter", StaticFieldGetter.getInstance());
419    
420                    // String util
421    
422                    velocityContext.put("stringUtil", StringUtil_IW.getInstance());
423    
424                    // Time zone util
425    
426                    velocityContext.put("timeZoneUtil", TimeZoneUtil_IW.getInstance());
427    
428                    // Unicode formatter
429    
430                    velocityContext.put(
431                            "unicodeFormatter", UnicodeFormatter_IW.getInstance());
432    
433                    // Validator
434    
435                    velocityContext.put("validator", Validator_IW.getInstance());
436    
437                    // VelocityTaglib methods
438    
439                    try {
440                            Class<?> clazz = VelocityTaglibImpl.class;
441    
442                            Method method = clazz.getMethod(
443                                    "layoutIcon", new Class[] {Layout.class});
444    
445                            velocityContext.put("velocityTaglib#layoutIcon", method);
446                    }
447                    catch (Exception e) {
448                            _log.error(e, e);
449                    }
450    
451                    // Web server servlet token
452    
453                    try {
454                            velocityContext.put(
455                                    "webServerToken",
456                                    WebServerServletTokenUtil.getWebServerServletToken());
457                    }
458                    catch (SecurityException se) {
459                            _log.error(se, se);
460                    }
461    
462                    // Permissions
463    
464                    try {
465                            velocityContext.put(
466                                    "accountPermission",
467                                    AccountPermissionUtil.getAccountPermission());
468                    }
469                    catch (SecurityException se) {
470                            _log.error(se, se);
471                    }
472    
473                    try {
474                            velocityContext.put(
475                                    "commonPermission", CommonPermissionUtil.getCommonPermission());
476                    }
477                    catch (SecurityException se) {
478                            _log.error(se, se);
479                    }
480    
481                    try {
482                            velocityContext.put(
483                                    "groupPermission", GroupPermissionUtil.getGroupPermission());
484                    }
485                    catch (SecurityException se) {
486                            _log.error(se, se);
487                    }
488    
489                    try {
490                            velocityContext.put(
491                                    "layoutPermission", LayoutPermissionUtil.getLayoutPermission());
492                    }
493                    catch (SecurityException se) {
494                            _log.error(se, se);
495                    }
496    
497                    try {
498                            velocityContext.put(
499                                    "organizationPermission",
500                                    OrganizationPermissionUtil.getOrganizationPermission());
501                    }
502                    catch (SecurityException se) {
503                            _log.error(se, se);
504                    }
505    
506                    try {
507                            velocityContext.put(
508                                    "passwordPolicyPermission",
509                                    PasswordPolicyPermissionUtil.getPasswordPolicyPermission());
510                    }
511                    catch (SecurityException se) {
512                            _log.error(se, se);
513                    }
514    
515                    try {
516                            velocityContext.put(
517                                    "portalPermission", PortalPermissionUtil.getPortalPermission());
518                    }
519                    catch (SecurityException se) {
520                            _log.error(se, se);
521                    }
522    
523                    try {
524                            velocityContext.put(
525                                    "portletPermission",
526                                    PortletPermissionUtil.getPortletPermission());
527                    }
528                    catch (SecurityException se) {
529                            _log.error(se, se);
530                    }
531    
532                    try {
533                            velocityContext.put(
534                                    "rolePermission", RolePermissionUtil.getRolePermission());
535                    }
536                    catch (SecurityException se) {
537                            _log.error(se, se);
538                    }
539    
540                    try {
541                            velocityContext.put(
542                                    "userGroupPermission",
543                                    UserGroupPermissionUtil.getUserGroupPermission());
544                    }
545                    catch (SecurityException se) {
546                            _log.error(se, se);
547                    }
548    
549                    try {
550                            velocityContext.put(
551                                    "userPermission", UserPermissionUtil.getUserPermission());
552                    }
553                    catch (SecurityException se) {
554                            _log.error(se, se);
555                    }
556    
557                    // Deprecated
558    
559                    try {
560                            velocityContext.put(
561                                    "dateFormats",
562                                    FastDateFormatFactoryUtil.getFastDateFormatFactory());
563                    }
564                    catch (SecurityException se) {
565                            _log.error(se, se);
566                    }
567    
568                    try {
569                            velocityContext.put(
570                                    "imageToken",
571                                    WebServerServletTokenUtil.getWebServerServletToken());
572                    }
573                    catch (SecurityException se) {
574                            _log.error(se, se);
575                    }
576    
577                    try {
578                            velocityContext.put(
579                                    "locationPermission",
580                                    OrganizationPermissionUtil.getOrganizationPermission());
581                    }
582                    catch (SecurityException se) {
583                            _log.error(se, se);
584                    }
585            }
586    
587            @Override
588            public void insertVariables(
589                            VelocityContext velocityContext, HttpServletRequest request)
590                    throws Exception {
591    
592                    // Request
593    
594                    velocityContext.put("request", request);
595    
596                    // Portlet config
597    
598                    PortletConfig portletConfig = (PortletConfig)request.getAttribute(
599                            JavaConstants.JAVAX_PORTLET_CONFIG);
600    
601                    if (portletConfig != null) {
602                            velocityContext.put("portletConfig", portletConfig);
603                    }
604    
605                    // Render request
606    
607                    final PortletRequest portletRequest =
608                            (PortletRequest)request.getAttribute(
609                                    JavaConstants.JAVAX_PORTLET_REQUEST);
610    
611                    if (portletRequest != null) {
612                            if (portletRequest instanceof RenderRequest) {
613                                    velocityContext.put("renderRequest", portletRequest);
614                            }
615                    }
616    
617                    // Render response
618    
619                    final PortletResponse portletResponse =
620                            (PortletResponse)request.getAttribute(
621                                    JavaConstants.JAVAX_PORTLET_RESPONSE);
622    
623                    if (portletResponse != null) {
624                            if (portletResponse instanceof RenderResponse) {
625                                    velocityContext.put("renderResponse", portletResponse);
626                            }
627                    }
628    
629                    // XML request
630    
631                    if ((portletRequest != null) && (portletResponse != null)) {
632                            velocityContext.put(
633                                    "xmlRequest",
634                                    new Object() {
635    
636                                            @Override
637                                            public String toString() {
638                                                    return PortletRequestUtil.toXML(
639                                                            portletRequest, portletResponse);
640                                            }
641    
642                                    }
643                            );
644                    }
645    
646                    // Theme display
647    
648                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
649                            WebKeys.THEME_DISPLAY);
650    
651                    if (themeDisplay != null) {
652                            Layout layout = themeDisplay.getLayout();
653                            List<Layout> layouts = themeDisplay.getLayouts();
654    
655                            velocityContext.put("themeDisplay", themeDisplay);
656                            velocityContext.put("company", themeDisplay.getCompany());
657                            velocityContext.put("user", themeDisplay.getUser());
658                            velocityContext.put("realUser", themeDisplay.getRealUser());
659                            velocityContext.put("layout", layout);
660                            velocityContext.put("layouts", layouts);
661                            velocityContext.put("plid", String.valueOf(themeDisplay.getPlid()));
662                            velocityContext.put(
663                                    "layoutTypePortlet", themeDisplay.getLayoutTypePortlet());
664                            velocityContext.put(
665                                    "scopeGroupId", new Long(themeDisplay.getScopeGroupId()));
666                            velocityContext.put(
667                                    "permissionChecker", themeDisplay.getPermissionChecker());
668                            velocityContext.put("locale", themeDisplay.getLocale());
669                            velocityContext.put("timeZone", themeDisplay.getTimeZone());
670                            velocityContext.put("colorScheme", themeDisplay.getColorScheme());
671                            velocityContext.put(
672                                    "portletDisplay", themeDisplay.getPortletDisplay());
673    
674                            // Navigation items
675    
676                            if (layout != null) {
677                                    RequestVars requestVars = new RequestVars(
678                                            request, themeDisplay, layout.getAncestorPlid(),
679                                            layout.getAncestorLayoutId(), velocityContext);
680    
681                                    List<NavItem> navItems = NavItem.fromLayouts(
682                                            requestVars, layouts);
683    
684                                    velocityContext.put("navItems", navItems);
685                            }
686    
687                            // Init
688    
689                            velocityContext.put(
690                                    "init",
691                                    themeDisplay.getPathContext() +
692                                            VelocityResourceListener.SERVLET_SEPARATOR +
693                                                    "/html/themes/_unstyled/templates/init.vm");
694    
695                            // Deprecated
696    
697                            velocityContext.put(
698                                    "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
699                    }
700    
701                    // Theme
702    
703                    Theme theme = (Theme)request.getAttribute(WebKeys.THEME);
704    
705                    if ((theme == null) && (themeDisplay != null)) {
706                            theme = themeDisplay.getTheme();
707                    }
708    
709                    if (theme != null) {
710    
711                            // Full css and templates path
712    
713                            velocityContext.put("theme", theme);
714    
715                            String servletContextName = GetterUtil.getString(
716                                    theme.getServletContextName());
717    
718                            velocityContext.put(
719                                    "fullCssPath",
720                                    servletContextName + theme.getVelocityResourceListener() +
721                                            theme.getCssPath());
722    
723                            velocityContext.put(
724                                    "fullTemplatesPath",
725                                    servletContextName + theme.getVelocityResourceListener() +
726                                            theme.getTemplatesPath());
727                    }
728    
729                    // Tiles attributes
730    
731                    insertTilesVariables(velocityContext, request);
732    
733                    // Page title and subtitle
734    
735                    velocityContext.put(
736                            "pageTitle", request.getAttribute(WebKeys.PAGE_TITLE));
737                    velocityContext.put(
738                            "pageSubtitle", request.getAttribute(WebKeys.PAGE_SUBTITLE));
739    
740                    // Insert custom vm variables
741    
742                    Map<String, Object> vmVariables =
743                            (Map<String, Object>)request.getAttribute(WebKeys.VM_VARIABLES);
744    
745                    if (vmVariables != null) {
746                            for (Map.Entry<String, Object> entry : vmVariables.entrySet()) {
747                                    String key = entry.getKey();
748                                    Object value = entry.getValue();
749    
750                                    if (Validator.isNotNull(key)) {
751                                            velocityContext.put(key, value);
752                                    }
753                            }
754                    }
755            }
756    
757            protected void insertHelperUtility(
758                    VelocityContext velocityContext, String[] restrictedVariables,
759                    String key, Object value) {
760    
761                    if (!ArrayUtil.contains(restrictedVariables, key)) {
762                            velocityContext.put(key, value);
763                    }
764            }
765    
766            protected void insertTilesVariables(
767                    VelocityContext velocityContext, HttpServletRequest request) {
768    
769                    ComponentContext componentContext =
770                            (ComponentContext)request.getAttribute(
771                                    ComponentConstants.COMPONENT_CONTEXT);
772    
773                    if (componentContext == null) {
774                            return;
775                    }
776    
777                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
778                            WebKeys.THEME_DISPLAY);
779    
780                    String tilesTitle = (String)componentContext.getAttribute("title");
781    
782                    themeDisplay.setTilesTitle(tilesTitle);
783    
784                    velocityContext.put("tilesTitle", tilesTitle);
785    
786                    String tilesContent = (String)componentContext.getAttribute("content");
787    
788                    themeDisplay.setTilesContent(tilesContent);
789    
790                    velocityContext.put("tilesContent", tilesContent);
791    
792                    boolean tilesSelectable = GetterUtil.getBoolean(
793                            (String)componentContext.getAttribute("selectable"));
794    
795                    themeDisplay.setTilesSelectable(tilesSelectable);
796    
797                    velocityContext.put("tilesSelectable", tilesSelectable);
798            }
799    
800            private static Log _log = LogFactoryUtil.getLog(
801                    VelocityVariablesImpl.class);
802    
803    }