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