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