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