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