/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.template; import com.liferay.expando.kernel.service.ExpandoColumnLocalService; import com.liferay.expando.kernel.service.ExpandoRowLocalService; import com.liferay.expando.kernel.service.ExpandoTableLocalService; import com.liferay.expando.kernel.service.ExpandoValueLocalService; import com.liferay.portal.kernel.audit.AuditMessageFactoryUtil; import com.liferay.portal.kernel.audit.AuditRouterUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.image.ImageToolUtil; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.language.UnicodeLanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.Theme; import com.liferay.portal.kernel.portlet.PortletModeFactory_IW; import com.liferay.portal.kernel.portlet.PortletProvider; import com.liferay.portal.kernel.portlet.PortletRequestModel; import com.liferay.portal.kernel.portlet.PortletRequestModelFactory; import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil; import com.liferay.portal.kernel.portlet.WindowStateFactory_IW; import com.liferay.portal.kernel.service.GroupLocalService; import com.liferay.portal.kernel.service.GroupService; import com.liferay.portal.kernel.service.LayoutLocalService; import com.liferay.portal.kernel.service.LayoutService; import com.liferay.portal.kernel.service.OrganizationLocalService; import com.liferay.portal.kernel.service.OrganizationService; import com.liferay.portal.kernel.service.UserLocalService; import com.liferay.portal.kernel.service.UserService; import com.liferay.portal.kernel.service.permission.AccountPermissionUtil; import com.liferay.portal.kernel.service.permission.CommonPermissionUtil; import com.liferay.portal.kernel.service.permission.GroupPermissionUtil; import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil; import com.liferay.portal.kernel.service.permission.OrganizationPermissionUtil; import com.liferay.portal.kernel.service.permission.PasswordPolicyPermissionUtil; import com.liferay.portal.kernel.service.permission.PortalPermissionUtil; import com.liferay.portal.kernel.service.permission.PortletPermissionUtil; import com.liferay.portal.kernel.service.permission.RolePermissionUtil; import com.liferay.portal.kernel.service.permission.UserGroupPermissionUtil; import com.liferay.portal.kernel.service.permission.UserPermissionUtil; import com.liferay.portal.kernel.servlet.BrowserSnifferUtil; import com.liferay.portal.kernel.template.TemplateHandler; import com.liferay.portal.kernel.template.TemplateHandlerRegistryUtil; import com.liferay.portal.kernel.template.TemplateVariableGroup; import com.liferay.portal.kernel.theme.NavItem; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ArrayUtil_IW; import com.liferay.portal.kernel.util.CalendarFactoryUtil; import com.liferay.portal.kernel.util.ClassLoaderUtil; import com.liferay.portal.kernel.util.DateUtil_IW; import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.GetterUtil_IW; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.JavaConstants; import com.liferay.portal.kernel.util.ListMergeable; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.ParamUtil_IW; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PrefsPropsUtil; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.SessionClicks_IW; import com.liferay.portal.kernel.util.StaticFieldGetter; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil_IW; import com.liferay.portal.kernel.util.TimeZoneUtil_IW; import com.liferay.portal.kernel.util.UnicodeFormatter_IW; import com.liferay.portal.kernel.util.Validator_IW; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.webserver.WebServerServletTokenUtil; import com.liferay.portal.kernel.xml.SAXReader; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.portlet.PortletConfig; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.servlet.http.HttpServletRequest; import org.apache.struts.tiles.ComponentContext; import org.apache.struts.tiles.taglib.ComponentConstants; /** * @author Tina Tian * @author Jorge Ferrer * @author Raymond Augé */ public class TemplateContextHelper { public static Map<String, TemplateVariableGroup> getTemplateVariableGroups( long classNameId, long classPK, String language, Locale locale) throws Exception { TemplateHandler templateHandler = TemplateHandlerRegistryUtil.getTemplateHandler(classNameId); if (templateHandler == null) { return Collections.emptyMap(); } Map<String, TemplateVariableGroup> templateVariableGroups = templateHandler.getTemplateVariableGroups( classPK, language, locale); String[] restrictedVariables = templateHandler.getRestrictedVariables( language); TemplateVariableGroup portalServicesTemplateVariableGroup = new TemplateVariableGroup("portal-services", restrictedVariables); portalServicesTemplateVariableGroup.setAutocompleteEnabled(false); portalServicesTemplateVariableGroup.addServiceLocatorVariables( GroupLocalService.class, GroupService.class, LayoutLocalService.class, LayoutService.class, OrganizationLocalService.class, OrganizationService.class, UserLocalService.class, UserService.class); templateVariableGroups.put( portalServicesTemplateVariableGroup.getLabel(), portalServicesTemplateVariableGroup); return templateVariableGroups; } public Map<String, Object> getHelperUtilities( ClassLoader classLoader, boolean restricted) { Map<String, Object>[] helperUtilitiesArray = _helperUtilitiesMaps.get( classLoader); if (helperUtilitiesArray == null) { helperUtilitiesArray = (Map<String, Object>[])new Map<?, ?>[2]; _helperUtilitiesMaps.put(classLoader, helperUtilitiesArray); } else { Map<String, Object> helperUtilities = null; if (restricted) { helperUtilities = helperUtilitiesArray[1]; } else { helperUtilities = helperUtilitiesArray[0]; } if (helperUtilities != null) { return helperUtilities; } } Map<String, Object> helperUtilities = new HashMap<>(); populateCommonHelperUtilities(helperUtilities); populateExtraHelperUtilities(helperUtilities); if (restricted) { Set<String> restrictedVariables = getRestrictedVariables(); for (String restrictedVariable : restrictedVariables) { helperUtilities.remove(restrictedVariable); } helperUtilitiesArray[1] = helperUtilities; } else { helperUtilitiesArray[0] = helperUtilities; } return helperUtilities; } public Set<String> getRestrictedVariables() { return Collections.emptySet(); } public TemplateControlContext getTemplateControlContext() { return _pacl.getTemplateControlContext(); } public void prepare( Map<String, Object> contextObjects, HttpServletRequest request) { // Request contextObjects.put("request", request); // Portlet config PortletConfig portletConfig = (PortletConfig)request.getAttribute( JavaConstants.JAVAX_PORTLET_CONFIG); if (portletConfig != null) { contextObjects.put("portletConfig", portletConfig); } // Render request final PortletRequest portletRequest = (PortletRequest)request.getAttribute( JavaConstants.JAVAX_PORTLET_REQUEST); if (portletRequest != null) { if (portletRequest instanceof RenderRequest) { contextObjects.put("renderRequest", portletRequest); } } // Render response final PortletResponse portletResponse = (PortletResponse)request.getAttribute( JavaConstants.JAVAX_PORTLET_RESPONSE); if (portletResponse != null) { if (portletResponse instanceof RenderResponse) { contextObjects.put("renderResponse", portletResponse); } } // XML request if ((portletRequest != null) && (portletResponse != null)) { contextObjects.put( "portletRequestModelFactory", new PortletRequestModelFactory( portletRequest, portletResponse)); // Deprecated contextObjects.put( "xmlRequest", new Object() { @Override public String toString() { PortletRequestModel portletRequestModel = new PortletRequestModel( portletRequest, portletResponse); return portletRequestModel.toXML(); } }); } // Theme display ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute( WebKeys.THEME_DISPLAY); if (themeDisplay != null) { Layout layout = themeDisplay.getLayout(); List<Layout> layouts = themeDisplay.getLayouts(); contextObjects.put("bodyCssClass", StringPool.BLANK); contextObjects.put("colorScheme", themeDisplay.getColorScheme()); contextObjects.put("company", themeDisplay.getCompany()); contextObjects.put("layout", layout); contextObjects.put("layouts", layouts); contextObjects.put( "layoutTypePortlet", themeDisplay.getLayoutTypePortlet()); contextObjects.put("locale", themeDisplay.getLocale()); contextObjects.put( "permissionChecker", themeDisplay.getPermissionChecker()); contextObjects.put("plid", String.valueOf(themeDisplay.getPlid())); contextObjects.put( "portletDisplay", themeDisplay.getPortletDisplay()); contextObjects.put("realUser", themeDisplay.getRealUser()); contextObjects.put( "scopeGroupId", Long.valueOf(themeDisplay.getScopeGroupId())); contextObjects.put("themeDisplay", themeDisplay); contextObjects.put("timeZone", themeDisplay.getTimeZone()); contextObjects.put("user", themeDisplay.getUser()); // Navigation items if (layout != null) { try { List<NavItem> navItems = NavItem.fromLayouts( request, themeDisplay, contextObjects); contextObjects.put("navItems", navItems); } catch (PortalException pe) { _log.error(pe, pe); } } // Deprecated contextObjects.put( "portletGroupId", Long.valueOf(themeDisplay.getScopeGroupId())); } // Theme Theme theme = (Theme)request.getAttribute(WebKeys.THEME); if ((theme == null) && (themeDisplay != null)) { theme = themeDisplay.getTheme(); } if (theme != null) { contextObjects.put("theme", theme); } // Tiles attributes prepareTiles(contextObjects, request); // Page title and subtitle ListMergeable<String> pageTitleListMergeable = (ListMergeable<String>)request.getAttribute(WebKeys.PAGE_TITLE); if (pageTitleListMergeable != null) { String pageTitle = pageTitleListMergeable.mergeToString( StringPool.SPACE); contextObjects.put("pageTitle", pageTitle); } ListMergeable<String> pageSubtitleListMergeable = (ListMergeable<String>)request.getAttribute(WebKeys.PAGE_SUBTITLE); if (pageSubtitleListMergeable != null) { String pageSubtitle = pageSubtitleListMergeable.mergeToString( StringPool.SPACE); contextObjects.put("pageSubtitle", pageSubtitle); } } public void removeAllHelperUtilities() { _helperUtilitiesMaps.clear(); } public void removeHelperUtilities(ClassLoader classLoader) { _helperUtilitiesMaps.remove(classLoader); } public interface PACL { public TemplateControlContext getTemplateControlContext(); } protected void populateCommonHelperUtilities( Map<String, Object> variables) { // Array util variables.put("arrayUtil", ArrayUtil_IW.getInstance()); // Audit message factory try { variables.put( "auditMessageFactoryUtil", AuditMessageFactoryUtil.getAuditMessageFactory()); } catch (SecurityException se) { _log.error(se, se); } // Audit router util try { variables.put("auditRouterUtil", AuditRouterUtil.getAuditRouter()); } catch (SecurityException se) { _log.error(se, se); } // Browser sniffer try { variables.put( "browserSniffer", BrowserSnifferUtil.getBrowserSniffer()); } catch (SecurityException se) { _log.error(se, se); } // Calendar factory try { variables.put( "calendarFactory", CalendarFactoryUtil.getCalendarFactory()); } catch (SecurityException se) { _log.error(se, se); } // Date format try { variables.put( "dateFormatFactory", FastDateFormatFactoryUtil.getFastDateFormatFactory()); } catch (SecurityException se) { _log.error(se, se); } // Date util variables.put("dateUtil", DateUtil_IW.getInstance()); // Expando column service try { ServiceLocator serviceLocator = ServiceLocator.getInstance(); // Service locator variables.put("serviceLocator", serviceLocator); try { variables.put( "expandoColumnLocalService", serviceLocator.findService( ExpandoColumnLocalService.class.getName())); } catch (SecurityException se) { _log.error(se, se); } // Expando row service try { variables.put( "expandoRowLocalService", serviceLocator.findService( ExpandoRowLocalService.class.getName())); } catch (SecurityException se) { _log.error(se, se); } // Expando table service try { variables.put( "expandoTableLocalService", serviceLocator.findService( ExpandoTableLocalService.class.getName())); } catch (SecurityException se) { _log.error(se, se); } // Expando value service try { variables.put( "expandoValueLocalService", serviceLocator.findService( ExpandoValueLocalService.class.getName())); } catch (SecurityException se) { _log.error(se, se); } } catch (SecurityException se) { _log.error(se, se); } // Getter util variables.put("getterUtil", GetterUtil_IW.getInstance()); // Html util try { variables.put("htmlUtil", HtmlUtil.getHtml()); } catch (SecurityException se) { _log.error(se, se); } // Http util try { variables.put("httpUtil", HttpUtil.getHttp()); } catch (SecurityException se) { _log.error(se, se); } // Image tool util try { variables.put("imageToolUtil", ImageToolUtil.getImageTool()); } catch (SecurityException se) { _log.error(se, se); } // JSON factory util try { variables.put("jsonFactoryUtil", JSONFactoryUtil.getJSONFactory()); } catch (SecurityException se) { _log.error(se, se); } // Language util try { variables.put("languageUtil", LanguageUtil.getLanguage()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "unicodeLanguageUtil", UnicodeLanguageUtil.getUnicodeLanguage()); } catch (SecurityException se) { _log.error(se, se); } // Locale util try { variables.put("localeUtil", LocaleUtil.getInstance()); } catch (SecurityException se) { _log.error(se, se); } // Param util variables.put("paramUtil", ParamUtil_IW.getInstance()); // Portal util try { variables.put("portalUtil", PortalUtil.getPortal()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put("portal", PortalUtil.getPortal()); } catch (SecurityException se) { _log.error(se, se); } // Prefs props util try { variables.put("prefsPropsUtil", PrefsPropsUtil.getPrefsProps()); } catch (SecurityException se) { _log.error(se, se); } // Props util try { variables.put("propsUtil", PropsUtil.getProps()); } catch (SecurityException se) { _log.error(se, se); } // Portlet mode factory variables.put( "portletModeFactory", PortletModeFactory_IW.getInstance()); // Portlet URL factory try { variables.put( "portletURLFactory", PortletURLFactoryUtil.getPortletURLFactory()); } catch (SecurityException se) { _log.error(se, se); } try { UtilLocator utilLocator = UtilLocator.getInstance(); // Util locator variables.put("utilLocator", utilLocator); // SAX reader util try { variables.put( "saxReaderUtil", utilLocator.findUtil(SAXReader.class.getName())); } catch (SecurityException se) { _log.error(se, se); } } catch (SecurityException se) { _log.error(se, se); } // Session clicks variables.put("sessionClicks", SessionClicks_IW.getInstance()); // Static field getter variables.put("staticFieldGetter", StaticFieldGetter.getInstance()); // String util variables.put("stringUtil", StringUtil_IW.getInstance()); // Time zone util variables.put("timeZoneUtil", TimeZoneUtil_IW.getInstance()); // Unicode formatter variables.put("unicodeFormatter", UnicodeFormatter_IW.getInstance()); // Validator variables.put("validator", Validator_IW.getInstance()); // Web server servlet token try { variables.put( "webServerToken", WebServerServletTokenUtil.getWebServerServletToken()); } catch (SecurityException se) { _log.error(se, se); } // Window state factory variables.put( "windowStateFactory", WindowStateFactory_IW.getInstance()); // Permissions try { variables.put( "accountPermission", AccountPermissionUtil.getAccountPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "commonPermission", CommonPermissionUtil.getCommonPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "groupPermission", GroupPermissionUtil.getGroupPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "layoutPermission", LayoutPermissionUtil.getLayoutPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "organizationPermission", OrganizationPermissionUtil.getOrganizationPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "passwordPolicyPermission", PasswordPolicyPermissionUtil.getPasswordPolicyPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "portalPermission", PortalPermissionUtil.getPortalPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "portletPermission", PortletPermissionUtil.getPortletPermission()); } catch (SecurityException se) { _log.error(se, se); } Map<String, PortletProvider.Action> portletProviderActionMap = new HashMap<>(); for (PortletProvider.Action action : PortletProvider.Action.values()) { portletProviderActionMap.put(action.name(), action); } try { variables.put("portletProviderAction", portletProviderActionMap); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "rolePermission", RolePermissionUtil.getRolePermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "userGroupPermission", UserGroupPermissionUtil.getUserGroupPermission()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "userPermission", UserPermissionUtil.getUserPermission()); } catch (SecurityException se) { _log.error(se, se); } // Deprecated populateDeprecatedCommonHelperUtilities(variables); } @SuppressWarnings("deprecation") protected void populateDeprecatedCommonHelperUtilities( Map<String, Object> variables) { try { variables.put( "dateFormats", FastDateFormatFactoryUtil.getFastDateFormatFactory()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "imageToken", WebServerServletTokenUtil.getWebServerServletToken()); } catch (SecurityException se) { _log.error(se, se); } try { variables.put( "locationPermission", OrganizationPermissionUtil.getOrganizationPermission()); } catch (SecurityException se) { _log.error(se, se); } try { com.liferay.portal.kernel.util.Randomizer_IW randomizer = com.liferay.portal.kernel.util.Randomizer_IW.getInstance(); variables.put("randomizer", randomizer.getWrappedInstance()); } catch (SecurityException se) { _log.error(se, se); } } protected void populateExtraHelperUtilities(Map<String, Object> variables) { } protected void prepareTiles( Map<String, Object> contextObjects, HttpServletRequest request) { ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute( WebKeys.THEME_DISPLAY); ComponentContext componentContext = (ComponentContext)request.getAttribute( ComponentConstants.COMPONENT_CONTEXT); if (componentContext == null) { themeDisplay.setTilesSelectable(true); return; } String tilesTitle = (String)componentContext.getAttribute("title"); themeDisplay.setTilesTitle(tilesTitle); contextObjects.put("tilesTitle", tilesTitle); String tilesContent = (String)componentContext.getAttribute("content"); themeDisplay.setTilesContent(tilesContent); contextObjects.put("tilesContent", tilesContent); boolean tilesSelectable = GetterUtil.getBoolean( (String)componentContext.getAttribute("selectable")); themeDisplay.setTilesSelectable(tilesSelectable); contextObjects.put("tilesSelectable", tilesSelectable); } private static final Log _log = LogFactoryUtil.getLog( TemplateContextHelper.class); private static final PACL _pacl = new NoPACL(); private final Map<ClassLoader, Map<String, Object>[]> _helperUtilitiesMaps = new ConcurrentHashMap<>(); private static class NoPACL implements PACL { @Override public TemplateControlContext getTemplateControlContext() { ClassLoader contextClassLoader = ClassLoaderUtil.getContextClassLoader(); return new TemplateControlContext(null, contextClassLoader); } } }