/** * 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.service.impl; import com.liferay.exportimport.kernel.configuration.ExportImportConfigurationConstants; import com.liferay.exportimport.kernel.configuration.ExportImportConfigurationSettingsMapFactory; import com.liferay.exportimport.kernel.lar.ExportImportHelperUtil; import com.liferay.exportimport.kernel.lar.MissingReferences; import com.liferay.exportimport.kernel.model.ExportImportConfiguration; import com.liferay.portal.kernel.cache.thread.local.ThreadLocalCachable; import com.liferay.portal.kernel.exception.NoSuchLayoutException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.messaging.DestinationNames; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.LayoutConstants; import com.liferay.portal.kernel.model.LayoutReference; import com.liferay.portal.kernel.model.LayoutTypePortlet; import com.liferay.portal.kernel.model.Plugin; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.scheduler.SchedulerEngineHelperUtil; import com.liferay.portal.kernel.scheduler.StorageType; import com.liferay.portal.kernel.scheduler.Trigger; import com.liferay.portal.kernel.scheduler.TriggerFactoryUtil; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.permission.GroupPermissionUtil; import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil; import com.liferay.portal.kernel.service.permission.PortletPermissionUtil; import com.liferay.portal.kernel.util.Digester; import com.liferay.portal.kernel.util.DigesterUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.PortletKeys; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.TempFileEntryUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.uuid.PortalUUIDUtil; import com.liferay.portal.service.base.LayoutServiceBaseImpl; import java.io.File; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map; /** * Provides the remote service for accessing, adding, deleting, exporting, * importing, scheduling publishing of, and updating layouts. Its methods * include permission checks. * * @author Brian Wing Shun Chan * @author Wesley Gong * @author Tibor Lipusz */ public class LayoutServiceImpl extends LayoutServiceBaseImpl { /** * Adds a layout with additional parameters. * * <p> * This method handles the creation of the layout including its resources, * metadata, and internal data structures. It is not necessary to make * subsequent calls to any methods to setup default groups, resources, ... * etc. * </p> * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parentLayoutId the primary key of the parent layout (optionally * {@link LayoutConstants#DEFAULT_PARENT_LAYOUT_ID}) * @param localeNamesMap the layout's locales and localized names * @param localeTitlesMap the layout's locales and localized titles * @param descriptionMap the layout's locales and localized descriptions * @param keywordsMap the layout's locales and localized keywords * @param robotsMap the layout's locales and localized robots * @param type the layout's type (optionally {@link * LayoutConstants#TYPE_PORTLET}). The possible types can be found * in {@link LayoutConstants}. * @param typeSettings the settings to load the unicode properties object. * See {@link com.liferay.portal.kernel.util.UnicodeProperties * #fastLoad(String)}. * @param hidden whether the layout is hidden * @param friendlyURLMap the layout's locales and localized friendly URLs. * To see how the URL is normalized when accessed, see {@link * com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil#normalize( * String)}. * @param serviceContext the service context to be applied. Must set the * UUID for the layout. Can set the creation date, modification * date, and expando bridge attributes for the layout. For layouts * that belong to a layout set prototype, an attribute named * <code>layoutUpdateable</code> can be used to specify whether site * administrators can modify this page within their site. * @return the layout */ @Override public Layout addLayout( long groupId, boolean privateLayout, long parentLayoutId, Map<Locale, String> localeNamesMap, Map<Locale, String> localeTitlesMap, Map<Locale, String> descriptionMap, Map<Locale, String> keywordsMap, Map<Locale, String> robotsMap, String type, String typeSettings, boolean hidden, Map<Locale, String> friendlyURLMap, ServiceContext serviceContext) throws PortalException { PermissionChecker permissionChecker = getPermissionChecker(); if (parentLayoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) { GroupPermissionUtil.check( permissionChecker, groupId, ActionKeys.ADD_LAYOUT); } else { LayoutPermissionUtil.check( permissionChecker, groupId, privateLayout, parentLayoutId, ActionKeys.ADD_LAYOUT); } Layout layout = layoutLocalService.addLayout( getUserId(), groupId, privateLayout, parentLayoutId, localeNamesMap, localeTitlesMap, descriptionMap, keywordsMap, robotsMap, type, typeSettings, hidden, friendlyURLMap, serviceContext); checkLayoutTypeSettings(layout, StringPool.BLANK, typeSettings); return layout; } /** * Adds a layout with single entry maps for name, title, and description to * the default locale. * * <p> * This method handles the creation of the layout including its resources, * metadata, and internal data structures. It is not necessary to make * subsequent calls to any methods to setup default groups, resources, ... * etc. * </p> * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parentLayoutId the primary key of the parent layout (optionally * {@link LayoutConstants#DEFAULT_PARENT_LAYOUT_ID}) * @param name the layout's locales and localized names * @param title the layout's locales and localized titles * @param description the layout's locales and localized descriptions * @param type the layout's type (optionally {@link * LayoutConstants#TYPE_PORTLET}). The possible types can be found * in {@link LayoutConstants}. * @param hidden whether the layout is hidden * @param friendlyURL the layout's locales and localized friendly URLs. To * see how the URL is normalized when accessed, see {@link * com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil#normalize( * String)}. * @param serviceContext the service context to be applied. Must set the * UUID for the layout. Can specify the creation date, modification * date, and expando bridge attributes for the layout. For layouts * that belong to a layout set prototype, an attribute named * <code>layoutUpdateable</code> can be used to specify whether site * administrators can modify this page within their site. * @return the layout */ @Override public Layout addLayout( long groupId, boolean privateLayout, long parentLayoutId, String name, String title, String description, String type, boolean hidden, String friendlyURL, ServiceContext serviceContext) throws PortalException { PermissionChecker permissionChecker = getPermissionChecker(); if (parentLayoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) { GroupPermissionUtil.check( permissionChecker, groupId, ActionKeys.ADD_LAYOUT); } else { LayoutPermissionUtil.check( permissionChecker, groupId, privateLayout, parentLayoutId, ActionKeys.ADD_LAYOUT); } return layoutLocalService.addLayout( getUserId(), groupId, privateLayout, parentLayoutId, name, title, description, type, hidden, friendlyURL, serviceContext); } @Override public FileEntry addTempFileEntry( long groupId, String folderName, String fileName, InputStream inputStream, String mimeType) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return TempFileEntryUtil.addTempFileEntry( groupId, getUserId(), DigesterUtil.digestHex(Digester.SHA_256, folderName), fileName, inputStream, mimeType); } /** * Deletes the layout with the primary key, also deleting the layout's child * layouts, and associated resources. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param serviceContext the service context to be applied */ @Override public void deleteLayout( long groupId, boolean privateLayout, long layoutId, ServiceContext serviceContext) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.DELETE); layoutLocalService.deleteLayout( groupId, privateLayout, layoutId, serviceContext); } /** * Deletes the layout with the plid, also deleting the layout's child * layouts, and associated resources. * * @param plid the primary key of the layout * @param serviceContext the service context to be applied */ @Override public void deleteLayout(long plid, ServiceContext serviceContext) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.DELETE); layoutLocalService.deleteLayout(plid, serviceContext); } @Override public void deleteTempFileEntry( long groupId, String folderName, String fileName) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); TempFileEntryUtil.deleteTempFileEntry( groupId, getUserId(), DigesterUtil.digestHex(Digester.SHA_256, folderName), fileName); } /** * Exports the layouts that match the primary keys and the criteria as a * byte array. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutIds the primary keys of the layouts to be exported * @param parameterMap the mapping of parameters indicating which * information to export. For information on the keys used in * the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param startDate the export's start date * @param endDate the export's end date * @return the layouts as a byte array * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public byte[] exportLayouts( long groupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayouts( groupId, privateLayout, layoutIds, parameterMap, startDate, endDate); } /** * Exports all layouts that match the criteria as a byte array. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parameterMap the mapping of parameters indicating which * information to export. For information on the keys used in * the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param startDate the export's start date * @param endDate the export's end date * @return the layout as a byte array * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public byte[] exportLayouts( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayouts( groupId, privateLayout, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#exportLayoutsAsFile( * ExportImportConfiguration)} */ @Deprecated @Override public File exportLayoutsAsFile( ExportImportConfiguration exportImportConfiguration) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long sourceGroupId = MapUtil.getLong(settingsMap, "sourceGroupId"); GroupPermissionUtil.check( getPermissionChecker(), sourceGroupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFile( exportImportConfiguration); } /** * Exports all layouts that match the primary keys and criteria as a file. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutIds the primary keys of the layouts to be exported * (optionally <code>null</code>) * @param parameterMap the mapping of parameters indicating which * information to export. For information on the keys used in * the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param startDate the export's start date * @param endDate the export's end date * @return the layouts as a File * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public File exportLayoutsAsFile( long groupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFile( groupId, privateLayout, layoutIds, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#exportLayoutsAsFileInBackground( * ExportImportConfiguration)} */ @Deprecated @Override public long exportLayoutsAsFileInBackground( ExportImportConfiguration exportImportConfiguration) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), exportImportConfiguration.getGroupId(), ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFileInBackground( getUserId(), exportImportConfiguration); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#exportLayoutsAsFileInBackground( * long)} */ @Deprecated @Override public long exportLayoutsAsFileInBackground( long exportImportConfigurationId) throws PortalException { ExportImportConfiguration exportImportConfiguration = exportImportConfigurationLocalService.getExportImportConfiguration( exportImportConfigurationId); GroupPermissionUtil.check( getPermissionChecker(), exportImportConfiguration.getGroupId(), ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFileInBackground( getUserId(), exportImportConfigurationId); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long exportLayoutsAsFileInBackground( String taskName, long groupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFileInBackground( getUserId(), taskName, groupId, privateLayout, layoutIds, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long exportLayoutsAsFileInBackground( String taskName, long groupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, Date startDate, Date endDate, String fileName) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.exportLayoutsAsFileInBackground( getUserId(), taskName, groupId, privateLayout, layoutIds, parameterMap, startDate, endDate, fileName); } /** * Exports the portlet information (categories, permissions, ... etc.) as a * byte array. * * @param plid the primary key of the layout * @param groupId the primary key of the group * @param portletId the primary key of the portlet * @param parameterMap the mapping of parameters indicating which * information to export. For information on the keys used in * the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param startDate the export's start date * @param endDate the export's end date * @return the portlet information as a byte array * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public byte[] exportPortletInfo( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { Layout layout = layoutLocalService.getLayout(plid); GroupPermissionUtil.check( getPermissionChecker(), layout.getGroupId(), ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfo( plid, groupId, portletId, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public byte[] exportPortletInfo( long companyId, String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { Group companyGroup = groupLocalService.getCompanyGroup(companyId); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfo( companyId, portletId, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#exportPortletInfoAsFile( * ExportImportConfiguration)} */ @Deprecated @Override public File exportPortletInfoAsFile( ExportImportConfiguration exportImportConfiguration) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long sourcePlid = MapUtil.getLong(settingsMap, "sourcePlid"); Layout layout = layoutLocalService.getLayout(sourcePlid); GroupPermissionUtil.check( getPermissionChecker(), layout.getGroupId(), ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfoAsFile( exportImportConfiguration); } /** * Exports the portlet information (categories, permissions, ... etc.) as a * file. * * @param plid the primary key of the layout * @param groupId the primary key of the group * @param portletId the primary key of the portlet * @param parameterMap the mapping of parameters indicating which * information to export. For information on the keys used in * the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param startDate the export's start date * @param endDate the export's end date * @return the portlet information as a file * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public File exportPortletInfoAsFile( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { Layout layout = layoutLocalService.getLayout(plid); GroupPermissionUtil.check( getPermissionChecker(), layout.getGroupId(), ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfoAsFile( plid, groupId, portletId, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public File exportPortletInfoAsFile( String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfoAsFile( user.getCompanyId(), portletId, parameterMap, startDate, endDate); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long exportPortletInfoAsFileInBackground( String taskName, long plid, long groupId, String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate, String fileName) throws PortalException { Layout layout = layoutLocalService.getLayout(plid); GroupPermissionUtil.check( getPermissionChecker(), layout.getGroupId(), ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfoAsFileInBackground( getUserId(), taskName, plid, groupId, portletId, parameterMap, startDate, endDate, fileName); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long exportPortletInfoAsFileInBackground( String taskName, String portletId, Map<String, String[]> parameterMap, Date startDate, Date endDate, String fileName) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.exportPortletInfoAsFileInBackground( getUserId(), taskName, portletId, parameterMap, startDate, endDate, fileName); } /** * Returns all the ancestor layouts of the layout. * * @param plid the primary key of the layout * @return the ancestor layouts of the layout */ @Override public List<Layout> getAncestorLayouts(long plid) throws PortalException { Layout layout = layoutLocalService.getLayout(plid); List<Layout> ancestors = layout.getAncestors(); return filterLayouts(ancestors); } /** * Returns the primary key of the default layout for the group. * * @param groupId the primary key of the group * @param scopeGroupId the primary key of the scope group. See {@link * ServiceContext#getScopeGroupId()}. * @param privateLayout whether the layout is private to the group * @param portletId the primary key of the portlet * @return Returns the primary key of the default layout group; {@link * LayoutConstants#DEFAULT_PLID} otherwise */ @Override public long getDefaultPlid( long groupId, long scopeGroupId, boolean privateLayout, String portletId) throws PortalException { if (groupId <= 0) { return LayoutConstants.DEFAULT_PLID; } PermissionChecker permissionChecker = getPermissionChecker(); String scopeGroupLayoutUuid = null; Group scopeGroup = groupLocalService.getGroup(scopeGroupId); if (scopeGroup.isLayout()) { Layout scopeGroupLayout = layoutLocalService.getLayout( scopeGroup.getClassPK()); scopeGroupLayoutUuid = scopeGroupLayout.getUuid(); } Map<Long, javax.portlet.PortletPreferences> jxPortletPreferencesMap = PortletPreferencesFactoryUtil.getPortletSetupMap( scopeGroup.getCompanyId(), groupId, PortletKeys.PREFS_OWNER_ID_DEFAULT, PortletKeys.PREFS_OWNER_TYPE_LAYOUT, portletId, privateLayout); for (Map.Entry<Long, javax.portlet.PortletPreferences> entry : jxPortletPreferencesMap.entrySet()) { long plid = entry.getKey(); Layout layout = null; try { layout = layoutLocalService.getLayout(plid); } catch (NoSuchLayoutException nsle) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(nsle, nsle); } continue; } if (!LayoutPermissionUtil.contains( permissionChecker, layout, ActionKeys.VIEW)) { continue; } if (!layout.isTypePortlet()) { continue; } LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType(); if (!layoutTypePortlet.hasPortletId(portletId)) { continue; } javax.portlet.PortletPreferences jxPortletPreferences = entry.getValue(); String scopeType = GetterUtil.getString( jxPortletPreferences.getValue("lfrScopeType", null)); if (scopeGroup.isLayout()) { String scopeLayoutUuid = GetterUtil.getString( jxPortletPreferences.getValue("lfrScopeLayoutUuid", null)); if (Validator.isNotNull(scopeType) && Validator.isNotNull(scopeLayoutUuid) && scopeLayoutUuid.equals(scopeGroupLayoutUuid)) { return layout.getPlid(); } } else if (scopeGroup.isCompany()) { if (Validator.isNotNull(scopeType) && scopeType.equals("company")) { return layout.getPlid(); } } else { if (Validator.isNull(scopeType)) { return layout.getPlid(); } } } return LayoutConstants.DEFAULT_PLID; } @Override @ThreadLocalCachable public long getDefaultPlid( long groupId, long scopeGroupId, String portletId) throws PortalException { long plid = getDefaultPlid(groupId, scopeGroupId, false, portletId); if (plid == 0) { plid = getDefaultPlid(groupId, scopeGroupId, true, portletId); } return plid; } /** * Returns the layout matching the UUID, group, and privacy. * * @param uuid the layout's UUID * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @return the matching layout */ @Override public Layout getLayoutByUuidAndGroupId( String uuid, long groupId, boolean privateLayout) throws PortalException { Layout layout = layoutLocalService.getLayoutByUuidAndGroupId( uuid, groupId, privateLayout); LayoutPermissionUtil.check( getPermissionChecker(), layout, ActionKeys.VIEW); return layout; } /** * Returns the name of the layout. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param languageId the primary key of the language. For more information * See {@link Locale}. * @return the layout's name */ @Override public String getLayoutName( long groupId, boolean privateLayout, long layoutId, String languageId) throws PortalException { Layout layout = layoutLocalService.getLayout( groupId, privateLayout, layoutId); LayoutPermissionUtil.check( getPermissionChecker(), layout, ActionKeys.VIEW); return layout.getName(languageId); } /** * Returns the layout references for all the layouts that belong to the * company and belong to the portlet that matches the preferences. * * @param companyId the primary key of the company * @param portletId the primary key of the portlet * @param preferencesKey the portlet's preference key * @param preferencesValue the portlet's preference value * @return the layout references of the matching layouts */ @Override public LayoutReference[] getLayoutReferences( long companyId, String portletId, String preferencesKey, String preferencesValue) { LayoutReference[] layoutReferences = layoutLocalService.getLayouts( companyId, portletId, preferencesKey, preferencesValue); List<LayoutReference> filteredLayoutReferences = new ArrayList<>( layoutReferences.length); for (LayoutReference layoutReference : layoutReferences) { try { if (LayoutPermissionUtil.contains( getPermissionChecker(), layoutReference.getLayoutSoap().getPlid(), ActionKeys.VIEW)) { filteredLayoutReferences.add(layoutReference); } } catch (PortalException pe) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(pe, pe); } } } return filteredLayoutReferences.toArray( new LayoutReference[filteredLayoutReferences.size()]); } @Override public List<Layout> getLayouts(long groupId, boolean privateLayout) { return layoutPersistence.filterFindByG_P(groupId, privateLayout); } @Override public List<Layout> getLayouts( long groupId, boolean privateLayout, long parentLayoutId) throws PortalException { List<Layout> layouts = layoutLocalService.getLayouts( groupId, privateLayout, parentLayoutId); return filterLayouts(layouts); } @Override public List<Layout> getLayouts( long groupId, boolean privateLayout, long parentLayoutId, boolean incomplete, int start, int end) throws PortalException { List<Layout> layouts = layoutLocalService.getLayouts( groupId, privateLayout, parentLayoutId, incomplete, start, end); return filterLayouts(layouts); } @Override public int getLayoutsCount(long groupId, boolean privateLayout) { return layoutPersistence.filterCountByG_P(groupId, privateLayout); } @Override public int getLayoutsCount( long groupId, boolean privateLayout, long parentLayoutId) { return layoutPersistence.filterCountByG_P_P( groupId, privateLayout, parentLayoutId); } @Override public int getLayoutsCount( long groupId, boolean privateLayout, long parentLayoutId, int priority) { return layoutPersistence.filterCountByG_P_P_LtP( groupId, privateLayout, parentLayoutId, priority); } @Override public String[] getTempFileNames(long groupId, String folderName) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return TempFileEntryUtil.getTempFileNames( groupId, getUserId(), DigesterUtil.digestHex(Digester.SHA_256, folderName)); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#importLayouts( * ExportImportConfiguration, File)} */ @Deprecated @Override public void importLayouts( ExportImportConfiguration exportImportConfiguration, File file) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); layoutLocalService.importLayouts(exportImportConfiguration, file); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#importLayouts( * ExportImportConfiguration, InputStream)} */ @Deprecated @Override public void importLayouts( ExportImportConfiguration exportImportConfiguration, InputStream is) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); layoutLocalService.importLayouts(exportImportConfiguration, is); } /** * Imports the layouts from the byte array. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parameterMap the mapping of parameters indicating which * information will be imported. For information on the keys * used in the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param bytes the byte array with the data * @see com.liferay.exportimport.kernel.lar.LayoutImporter * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importLayouts( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, byte[] bytes) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); layoutLocalService.importLayouts( getUserId(), groupId, privateLayout, parameterMap, bytes); } /** * Imports the layouts from the file. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parameterMap the mapping of parameters indicating which * information will be imported. For information on the keys * used in the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param file the LAR file with the data * @see com.liferay.exportimport.kernel.lar.LayoutImporter * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importLayouts( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, File file) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); layoutLocalService.importLayouts( getUserId(), groupId, privateLayout, parameterMap, file); } /** * Imports the layouts from the input stream. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parameterMap the mapping of parameters indicating which * information will be imported. For information on the keys * used in the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param is the input stream * @see com.liferay.exportimport.kernel.lar.LayoutImporter * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importLayouts( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, InputStream is) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); layoutLocalService.importLayouts( getUserId(), groupId, privateLayout, parameterMap, is); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long importLayoutsInBackground( String taskName, long groupId, boolean privateLayout, Map<String, String[]> parameterMap, File file) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.importLayoutsInBackground( getUserId(), taskName, groupId, privateLayout, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long importLayoutsInBackground( String taskName, long groupId, boolean privateLayout, Map<String, String[]> parameterMap, InputStream inputStream) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.importLayoutsInBackground( getUserId(), taskName, groupId, privateLayout, parameterMap, inputStream); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#importPortletInfo( * ExportImportConfiguration, File)} ( */ @Deprecated @Override public void importPortletInfo( ExportImportConfiguration exportImportConfiguration, File file) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo(exportImportConfiguration, file); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#importPortletInfo( * ExportImportConfiguration, InputStream)} ( */ @Deprecated @Override public void importPortletInfo( ExportImportConfiguration exportImportConfiguration, InputStream is) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo(exportImportConfiguration, is); } /** * Imports the portlet information (categories, permissions, ... etc.) from * the file. * * @param plid the primary key of the layout * @param groupId the primary key of the group * @param portletId the primary key of the portlet * @param parameterMap the mapping of parameters indicating which * information will be imported. For information on the keys * used in the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param file the LAR file with the data * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfo( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, File file) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo( getUserId(), plid, groupId, portletId, parameterMap, file); } /** * Imports the portlet information (categories, permissions, ... etc.) from * the input stream. * * @param plid the primary key of the layout * @param groupId the primary key of the group * @param portletId the primary key of the portlet * @param parameterMap the mapping of parameters indicating which * information will be imported. For information on the keys * used in the map see {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param is the input stream * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfo( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, InputStream is) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo( getUserId(), plid, groupId, portletId, parameterMap, is); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfo( String portletId, Map<String, String[]> parameterMap, File file) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo( getUserId(), portletId, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfo( String portletId, Map<String, String[]> parameterMap, InputStream is) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfo( getUserId(), portletId, parameterMap, is); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long importPortletInfoInBackground( String taskName, long plid, long groupId, String portletId, Map<String, String[]> parameterMap, File file) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.importPortletInfoInBackground( getUserId(), taskName, plid, groupId, portletId, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public long importPortletInfoInBackground( String taskName, long plid, long groupId, String portletId, Map<String, String[]> parameterMap, InputStream is) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); return layoutLocalService.importPortletInfoInBackground( getUserId(), taskName, plid, groupId, portletId, parameterMap, is); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfoInBackground( String taskName, String portletId, Map<String, String[]> parameterMap, File file) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfoInBackground( getUserId(), taskName, portletId, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public void importPortletInfoInBackground( String taskName, String portletId, Map<String, String[]> parameterMap, InputStream is) throws PortalException { User user = userPersistence.findByPrimaryKey(getUserId()); Group companyGroup = groupLocalService.getCompanyGroup( user.getCompanyId()); GroupPermissionUtil.check( getPermissionChecker(), companyGroup, ActionKeys.EXPORT_IMPORT_PORTLET_INFO); layoutLocalService.importPortletInfoInBackground( getUserId(), taskName, portletId, parameterMap, is); } /** * Schedules a range of layouts to be published. * * @param sourceGroupId the primary key of the source group * @param targetGroupId the primary key of the target group * @param privateLayout whether the layout is private to the group * @param layoutIds the layouts considered for publishing, specified by * the layout IDs * @param parameterMap the mapping of parameters indicating which * information will be used. See {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param scope the scope of the pages. It can be * <code>all-pages</code> or <code>selected-pages</code>. * @param startDate the start date * @param endDate the end date * @param groupName the group name (optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. * @param cronText the cron text. See {@link * com.liferay.portal.kernel.cal.RecurrenceSerializer * #toCronText} * @param schedulerStartDate the scheduler start date * @param schedulerEndDate the scheduler end date * @param description the scheduler description * @deprecated As of 7.0.0, replaced by {@link #schedulePublishToLive(long, * long, boolean, long[], Map, String, String, Date, Date, * String)} */ @Deprecated @Override public void schedulePublishToLive( long sourceGroupId, long targetGroupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, String scope, Date startDate, Date endDate, String groupName, String cronText, Date schedulerStartDate, Date schedulerEndDate, String description) throws PortalException { schedulePublishToLive( sourceGroupId, targetGroupId, privateLayout, layoutIds, parameterMap, groupName, cronText, schedulerStartDate, schedulerEndDate, description); } /** * Schedules a range of layouts to be published. * * @param sourceGroupId the primary key of the source group * @param targetGroupId the primary key of the target group * @param privateLayout whether the layout is private to the group * @param layoutIds the layouts considered for publishing, specified by the * layout IDs * @param parameterMap the mapping of parameters indicating which * information will be used. See {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param groupName the group name (optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. * @param cronText the cron text. See {@link * com.liferay.portal.kernel.cal.RecurrenceSerializer #toCronText} * @param schedulerStartDate the scheduler start date * @param schedulerEndDate the scheduler end date * @param description the scheduler description */ @Override public void schedulePublishToLive( long sourceGroupId, long targetGroupId, boolean privateLayout, long[] layoutIds, Map<String, String[]> parameterMap, String groupName, String cronText, Date schedulerStartDate, Date schedulerEndDate, String description) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.PUBLISH_STAGING); Trigger trigger = TriggerFactoryUtil.createTrigger( PortalUUIDUtil.generate(), groupName, schedulerStartDate, schedulerEndDate, cronText); User user = userPersistence.findByPrimaryKey(getUserId()); Map<String, Serializable> publishLayoutLocalSettingsMap = ExportImportConfigurationSettingsMapFactory. buildPublishLayoutLocalSettingsMap( user, sourceGroupId, targetGroupId, privateLayout, layoutIds, parameterMap); ExportImportConfiguration exportImportConfiguration = exportImportConfigurationLocalService. addDraftExportImportConfiguration( getUserId(), description, ExportImportConfigurationConstants. TYPE_SCHEDULED_PUBLISH_LAYOUT_LOCAL, publishLayoutLocalSettingsMap); SchedulerEngineHelperUtil.schedule( trigger, StorageType.PERSISTED, description, DestinationNames.LAYOUTS_LOCAL_PUBLISHER, exportImportConfiguration.getExportImportConfigurationId(), 0); } /** * Schedules a range of layouts to be published. * * @param sourceGroupId the primary key of the source group * @param targetGroupId the primary key of the target group * @param privateLayout whether the layout is private to the group * @param layoutIdMap the layouts considered for publishing, specified * by the layout IDs and booleans indicating whether they have * children * @param parameterMap the mapping of parameters indicating which * information will be used. See {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param groupName the group name (optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. * @param cronText the cron text. See {@link * com.liferay.portal.kernel.cal.RecurrenceSerializer * #toCronText} * @param schedulerStartDate the scheduler start date * @param schedulerEndDate the scheduler end date * @param description the scheduler description * @deprecated As of 7.0.0, replaced by {@link #schedulePublishToLive(long, * long, boolean, long[], Map, String, Date, Date, String, * String, Date, Date, String)} */ @Deprecated @Override public void schedulePublishToLive( long sourceGroupId, long targetGroupId, boolean privateLayout, Map<Long, Boolean> layoutIdMap, Map<String, String[]> parameterMap, String scope, Date startDate, Date endDate, String groupName, String cronText, Date schedulerStartDate, Date schedulerEndDate, String description) throws PortalException { schedulePublishToLive( sourceGroupId, targetGroupId, privateLayout, ExportImportHelperUtil.getLayoutIds(layoutIdMap, targetGroupId), parameterMap, groupName, cronText, schedulerStartDate, schedulerEndDate, description); } /** * Schedules a range of layouts to be stored. * * @param sourceGroupId the primary key of the source group * @param privateLayout whether the layout is private to the group * @param layoutIdMap the layouts considered for publishing, specified by * the layout IDs and booleans indicating whether they have children * @param parameterMap the mapping of parameters indicating which * information will be used. See {@link * com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys}. * @param remoteAddress the remote address * @param remotePort the remote port * @param remotePathContext the remote path context * @param secureConnection whether the connection is secure * @param remoteGroupId the primary key of the remote group * @param remotePrivateLayout whether remote group's layout is private * @param startDate the start date * @param endDate the end date * @param groupName the group name. Optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. * @param cronText the cron text. See {@link * com.liferay.portal.kernel.cal.RecurrenceSerializer #toCronText} * @param schedulerStartDate the scheduler start date * @param schedulerEndDate the scheduler end date * @param description the scheduler description */ @Override public void schedulePublishToRemote( long sourceGroupId, boolean privateLayout, Map<Long, Boolean> layoutIdMap, Map<String, String[]> parameterMap, String remoteAddress, int remotePort, String remotePathContext, boolean secureConnection, long remoteGroupId, boolean remotePrivateLayout, Date startDate, Date endDate, String groupName, String cronText, Date schedulerStartDate, Date schedulerEndDate, String description) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), sourceGroupId, ActionKeys.PUBLISH_STAGING); Trigger trigger = TriggerFactoryUtil.createTrigger( PortalUUIDUtil.generate(), groupName, schedulerStartDate, schedulerEndDate, cronText); User user = userPersistence.findByPrimaryKey(getUserId()); Map<String, Serializable> publishLayoutRemoteSettingsMap = ExportImportConfigurationSettingsMapFactory. buildPublishLayoutRemoteSettingsMap( getUserId(), sourceGroupId, privateLayout, layoutIdMap, parameterMap, remoteAddress, remotePort, remotePathContext, secureConnection, remoteGroupId, remotePrivateLayout, user.getLocale(), user.getTimeZone()); ExportImportConfiguration exportImportConfiguration = exportImportConfigurationLocalService. addDraftExportImportConfiguration( getUserId(), description, ExportImportConfigurationConstants. TYPE_SCHEDULED_PUBLISH_LAYOUT_REMOTE, publishLayoutRemoteSettingsMap); SchedulerEngineHelperUtil.schedule( trigger, StorageType.PERSISTED, description, DestinationNames.LAYOUTS_REMOTE_PUBLISHER, exportImportConfiguration.getExportImportConfigurationId(), 0); } /** * Sets the layouts for the group, replacing and prioritizing all layouts of * the parent layout. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param parentLayoutId the primary key of the parent layout * @param layoutIds the primary keys of the layouts * @param serviceContext the service context to be applied */ @Override public void setLayouts( long groupId, boolean privateLayout, long parentLayoutId, long[] layoutIds, ServiceContext serviceContext) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.UPDATE); layoutLocalService.setLayouts( groupId, privateLayout, parentLayoutId, layoutIds, serviceContext); } /** * Deletes the job from the scheduler's queue. * * @param groupId the primary key of the group * @param jobName the job name * @param groupName the group name (optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. */ @Override public void unschedulePublishToLive( long groupId, String jobName, String groupName) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.PUBLISH_STAGING); SchedulerEngineHelperUtil.delete( jobName, groupName, StorageType.PERSISTED); } /** * Deletes the job from the scheduler's persistent queue. * * @param groupId the primary key of the group * @param jobName the job name * @param groupName the group name (optionally {@link * DestinationNames#LAYOUTS_LOCAL_PUBLISHER}). See {@link * DestinationNames}. */ @Override public void unschedulePublishToRemote( long groupId, String jobName, String groupName) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.PUBLISH_STAGING); SchedulerEngineHelperUtil.delete( jobName, groupName, StorageType.PERSISTED); } @Override public Layout updateIconImage(long plid, byte[] bytes) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.UPDATE); return layoutLocalService.updateIconImage(plid, bytes); } /** * Updates the layout with additional parameters. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param parentLayoutId the primary key of the layout's new parent layout * @param localeNamesMap the layout's locales and localized names * @param localeTitlesMap the layout's locales and localized titles * @param descriptionMap the locales and localized descriptions to merge * (optionally <code>null</code>) * @param keywordsMap the locales and localized keywords to merge * (optionally <code>null</code>) * @param robotsMap the locales and localized robots to merge (optionally * <code>null</code>) * @param type the layout's new type (optionally {@link * LayoutConstants#TYPE_PORTLET}) * @param hidden whether the layout is hidden * @param friendlyURLMap the layout's locales and localized friendly URLs. * To see how the URL is normalized when accessed see {@link * com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil#normalize( * String)}. * @param iconImage whether the icon image will be updated * @param iconBytes the byte array of the layout's new icon image * @param serviceContext the service context to be applied. Can set the * modification date and expando bridge attributes for the layout. * @return the updated layout */ @Override public Layout updateLayout( long groupId, boolean privateLayout, long layoutId, long parentLayoutId, Map<Locale, String> localeNamesMap, Map<Locale, String> localeTitlesMap, Map<Locale, String> descriptionMap, Map<Locale, String> keywordsMap, Map<Locale, String> robotsMap, String type, boolean hidden, Map<Locale, String> friendlyURLMap, boolean iconImage, byte[] iconBytes, ServiceContext serviceContext) throws PortalException { Layout layout = layoutLocalService.getLayout( groupId, privateLayout, layoutId); LayoutPermissionUtil.check( getPermissionChecker(), layout, ActionKeys.UPDATE); Layout updatedLayout = layoutLocalService.updateLayout( groupId, privateLayout, layoutId, parentLayoutId, localeNamesMap, localeTitlesMap, descriptionMap, keywordsMap, robotsMap, type, hidden, friendlyURLMap, iconImage, iconBytes, serviceContext); if (!(layout.getLayoutType() instanceof LayoutTypePortlet)) { checkLayoutTypeSettings( layout, StringPool.BLANK, updatedLayout.getTypeSettings()); } return updatedLayout; } /** * Updates the layout replacing its type settings. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param typeSettings the settings to load the unicode properties object. * See {@link com.liferay.portal.kernel.util.UnicodeProperties * #fastLoad(String)}. * @return the updated layout */ @Override public Layout updateLayout( long groupId, boolean privateLayout, long layoutId, String typeSettings) throws PortalException { Layout layout = layoutLocalService.getLayout( groupId, privateLayout, layoutId); LayoutPermissionUtil.check( getPermissionChecker(), layout, ActionKeys.UPDATE); checkLayoutTypeSettings(layout, layout.getTypeSettings(), typeSettings); return layoutLocalService.updateLayout( groupId, privateLayout, layoutId, typeSettings); } /** * Updates the look and feel of the layout. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param themeId the primary key of the layout's new theme * @param colorSchemeId the primary key of the layout's new color scheme * @param css the layout's new CSS * @return the updated layout */ @Override public Layout updateLookAndFeel( long groupId, boolean privateLayout, long layoutId, String themeId, String colorSchemeId, String css) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.UPDATE); if (Validator.isNotNull(themeId)) { pluginSettingLocalService.checkPermission( getUserId(), themeId, Plugin.TYPE_THEME); } return layoutLocalService.updateLookAndFeel( groupId, privateLayout, layoutId, themeId, colorSchemeId, css); } /** * Updates the name of the layout matching the group, layout ID, and * privacy. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param name the layout's new name * @param languageId the primary key of the language. For more information * see {@link Locale}. * @return the updated layout */ @Override public Layout updateName( long groupId, boolean privateLayout, long layoutId, String name, String languageId) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.UPDATE); return layoutLocalService.updateName( groupId, privateLayout, layoutId, name, languageId); } /** * Updates the name of the layout matching the primary key. * * @param plid the primary key of the layout * @param name the name to be assigned * @param languageId the primary key of the language. For more information * see {@link Locale}. * @return the updated layout */ @Override public Layout updateName(long plid, String name, String languageId) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.UPDATE); return layoutLocalService.updateName(plid, name, languageId); } /** * Updates the parent layout ID of the layout matching the group, layout ID, * and privacy. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param parentLayoutId the primary key to be assigned to the parent * layout * @return the matching layout */ @Override public Layout updateParentLayoutId( long groupId, boolean privateLayout, long layoutId, long parentLayoutId) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.UPDATE); return layoutLocalService.updateParentLayoutId( groupId, privateLayout, layoutId, parentLayoutId); } /** * Updates the parent layout ID of the layout matching the primary key. If a * layout matching the parent primary key is found, the layout ID of that * layout is assigned, otherwise {@link * LayoutConstants#DEFAULT_PARENT_LAYOUT_ID} is assigned. * * @param plid the primary key of the layout * @param parentPlid the primary key of the parent layout * @return the layout matching the primary key */ @Override public Layout updateParentLayoutId(long plid, long parentPlid) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.UPDATE); return layoutLocalService.updateParentLayoutId(plid, parentPlid); } /** * Updates the parent layout ID and priority of the layout. * * @param plid the primary key of the layout * @param parentPlid the primary key of the parent layout * @param priority the layout's new priority * @return the layout matching the primary key */ @Override public Layout updateParentLayoutIdAndPriority( long plid, long parentPlid, int priority) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.UPDATE); return layoutLocalService.updateParentLayoutIdAndPriority( plid, parentPlid, priority); } /** * Updates the priority of the layout matching the group, layout ID, and * privacy. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param priority the layout's new priority * @return the updated layout */ @Override public Layout updatePriority( long groupId, boolean privateLayout, long layoutId, int priority) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.UPDATE); return layoutLocalService.updatePriority( groupId, privateLayout, layoutId, priority); } /** * Updates the priority of the layout matching the group, layout ID, and * privacy, setting the layout's priority based on the priorities of the * next and previous layouts. * * @param groupId the primary key of the group * @param privateLayout whether the layout is private to the group * @param layoutId the primary key of the layout * @param nextLayoutId the primary key of the next layout * @param previousLayoutId the primary key of the previous layout * @return the updated layout */ @Override public Layout updatePriority( long groupId, boolean privateLayout, long layoutId, long nextLayoutId, long previousLayoutId) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), groupId, privateLayout, layoutId, ActionKeys.UPDATE); return layoutLocalService.updatePriority( groupId, privateLayout, layoutId, nextLayoutId, previousLayoutId); } /** * Updates the priority of the layout matching the primary key. * * @param plid the primary key of the layout * @param priority the layout's new priority * @return the updated layout */ @Override public Layout updatePriority(long plid, int priority) throws PortalException { LayoutPermissionUtil.check( getPermissionChecker(), plid, ActionKeys.UPDATE); return layoutLocalService.updatePriority(plid, priority); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#validateImportLayoutsFile( * ExportImportConfiguration, File)} */ @Deprecated @Override public MissingReferences validateImportLayoutsFile( ExportImportConfiguration exportImportConfiguration, File file) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.validateImportLayoutsFile( exportImportConfiguration, file); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#validateImportLayoutsFile( * ExportImportConfiguration, InputStream)} */ @Deprecated @Override public MissingReferences validateImportLayoutsFile( ExportImportConfiguration exportImportConfiguration, InputStream inputStream) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetGroupId = MapUtil.getLong(settingsMap, "targetGroupId"); GroupPermissionUtil.check( getPermissionChecker(), targetGroupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.validateImportLayoutsFile( exportImportConfiguration, inputStream); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public MissingReferences validateImportLayoutsFile( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, File file) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.validateImportLayoutsFile( getUserId(), groupId, privateLayout, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public MissingReferences validateImportLayoutsFile( long groupId, boolean privateLayout, Map<String, String[]> parameterMap, InputStream inputStream) throws PortalException { GroupPermissionUtil.check( getPermissionChecker(), groupId, ActionKeys.EXPORT_IMPORT_LAYOUTS); return layoutLocalService.validateImportLayoutsFile( getUserId(), groupId, privateLayout, parameterMap, inputStream); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#validateImportPortletInfo( * ExportImportConfiguration, File)} */ @Deprecated @Override public MissingReferences validateImportPortletInfo( ExportImportConfiguration exportImportConfiguration, File file) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetPlid = MapUtil.getLong(settingsMap, "targetPlid"); String portletId = MapUtil.getString(settingsMap, "portletId"); PortletPermissionUtil.check( getPermissionChecker(), targetPlid, portletId, ActionKeys.CONFIGURATION); return layoutLocalService.validateImportPortletInfo( exportImportConfiguration, file); } /** * @deprecated As of 7.0.0, replaced by {@link * com.liferay.exportimport.kernel.service.ExportImportService#validateImportPortletInfo( * ExportImportConfiguration, InputStream)} */ @Deprecated @Override public MissingReferences validateImportPortletInfo( ExportImportConfiguration exportImportConfiguration, InputStream inputStream) throws PortalException { Map<String, Serializable> settingsMap = exportImportConfiguration.getSettingsMap(); long targetPlid = MapUtil.getLong(settingsMap, "targetPlid"); String portletId = MapUtil.getString(settingsMap, "portletId"); PortletPermissionUtil.check( getPermissionChecker(), targetPlid, portletId, ActionKeys.CONFIGURATION); return layoutLocalService.validateImportPortletInfo( exportImportConfiguration, inputStream); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public MissingReferences validateImportPortletInfo( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, File file) throws PortalException { PortletPermissionUtil.check( getPermissionChecker(), plid, portletId, ActionKeys.CONFIGURATION); return layoutLocalService.validateImportPortletInfo( getUserId(), plid, groupId, portletId, parameterMap, file); } /** * @deprecated As of 7.0.0, with no direct replacement */ @Deprecated @Override public MissingReferences validateImportPortletInfo( long plid, long groupId, String portletId, Map<String, String[]> parameterMap, InputStream inputStream) throws PortalException { PortletPermissionUtil.check( getPermissionChecker(), plid, portletId, ActionKeys.CONFIGURATION); return layoutLocalService.validateImportPortletInfo( getUserId(), plid, groupId, portletId, parameterMap, inputStream); } protected void checkLayoutTypeSettings( Layout layout, String originalTypeSettings, String newTypeSettings) throws PortalException { if (!(layout.getLayoutType() instanceof LayoutTypePortlet)) { return; } List<String> originalPortletIds = getPortletIds( layout, originalTypeSettings); List<String> newPortletIds = getPortletIds(layout, newTypeSettings); for (String portletId : newPortletIds) { if (originalPortletIds.contains(portletId)) { continue; } PortletPermissionUtil.check( getPermissionChecker(), layout.getPlid(), portletId, ActionKeys.ADD_TO_PAGE); } } protected List<Layout> filterLayouts(List<Layout> layouts) throws PortalException { List<Layout> filteredLayouts = new ArrayList<>(); for (Layout layout : layouts) { if (LayoutPermissionUtil.contains( getPermissionChecker(), layout, ActionKeys.VIEW)) { filteredLayouts.add(layout); } } return filteredLayouts; } protected List<String> getPortletIds(Layout layout, String typeSettings) { if (Validator.isBlank(typeSettings)) { return Collections.emptyList(); } Layout clonedLayout = (Layout)layout.clone(); clonedLayout.setType(LayoutConstants.TYPE_PORTLET); clonedLayout.setTypeSettings(typeSettings); LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet)clonedLayout.getLayoutType(); return layoutTypePortlet.getPortletIds(); } private static final Log _log = LogFactoryUtil.getLog( LayoutServiceImpl.class); }