/** * 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.exportimport.lar; import aQute.bnd.annotation.ProviderType; import com.liferay.exportimport.internal.util.ExportImportPermissionUtil; import com.liferay.exportimport.kernel.lar.ExportImportPathUtil; import com.liferay.exportimport.kernel.lar.PortletDataContext; 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.model.Layout; import com.liferay.portal.kernel.model.LayoutConstants; import com.liferay.portal.kernel.model.PortletConstants; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.security.permission.ResourceActionsUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.permission.PortletPermissionUtil; import com.liferay.portal.kernel.util.CharPool; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.KeyValuePair; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import java.util.List; import java.util.Map; import java.util.Set; /** * @author Brian Wing Shun Chan * @author Joel Kozikowski * @author Charles May * @author Raymond Augé * @author Jorge Ferrer * @author Bruno Farache * @author Zsigmond Rab * @author Douglas Wong */ @ProviderType public class PermissionExporter { public static PermissionExporter getInstance() { return _instance; } public void exportPortletDataPermissions( PortletDataContext portletDataContext) throws Exception { Document document = SAXReaderUtil.createDocument(); Element rootElement = document.addElement("portlet-data-permissions"); Map<String, List<KeyValuePair>> permissionsMap = portletDataContext.getPermissions(); for (Map.Entry<String, List<KeyValuePair>> entry : permissionsMap.entrySet()) { String[] permissionParts = StringUtil.split( entry.getKey(), CharPool.POUND); String resourceName = permissionParts[0]; long resourcePK = GetterUtil.getLong(permissionParts[1]); Element portletDataElement = rootElement.addElement("portlet-data"); portletDataElement.addAttribute("resource-name", resourceName); portletDataElement.addAttribute( "resource-pk", String.valueOf(resourcePK)); List<KeyValuePair> permissions = entry.getValue(); for (KeyValuePair permission : permissions) { String roleName = permission.getKey(); String actions = permission.getValue(); Element permissionsElement = portletDataElement.addElement( "permissions"); permissionsElement.addAttribute("role-name", roleName); permissionsElement.addAttribute("actions", actions); } } portletDataContext.addZipEntry( ExportImportPathUtil.getRootPath(portletDataContext) + "/portlet-data-permissions.xml", document.formattedString()); } public void exportPortletPermissions( PortletDataContext portletDataContext, String portletId, Layout layout, Element portletElement) throws Exception { String resourceName = PortletConstants.getRootPortletId(portletId); String resourcePrimKey = StringPool.BLANK; if (layout != null) { resourcePrimKey = PortletPermissionUtil.getPrimaryKey( layout.getPlid(), portletId); } else { resourcePrimKey = PortletPermissionUtil.getPrimaryKey( LayoutConstants.DEFAULT_PLID, portletId); } Element permissionsElement = portletElement.addElement("permissions"); exportPermissions( portletDataContext, resourceName, resourcePrimKey, permissionsElement); } protected void exportPermissions( PortletDataContext portletDataContext, String resourceName, String resourcePrimKey, Element permissionsElement) throws Exception { List<String> actionIds = ResourceActionsUtil.getPortletResourceActions( resourceName); Map<Long, Set<String>> roleToActionIds = ExportImportPermissionUtil.getRoleIdsToActionIds( portletDataContext.getCompanyId(), resourceName, resourcePrimKey, actionIds); for (Map.Entry<Long, Set<String>> entry : roleToActionIds.entrySet()) { long roleId = entry.getKey(); Role role = RoleLocalServiceUtil.fetchRole(roleId); String roleName = role.getName(); if (role.isTeam()) { try { roleName = ExportImportPermissionUtil.getTeamRoleName( role.getDescriptiveName()); } catch (PortalException pe) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(pe, pe); } } } Element roleElement = permissionsElement.addElement("role"); roleElement.addAttribute("uuid", role.getUuid()); roleElement.addAttribute("name", roleName); roleElement.addAttribute("title", role.getTitle()); roleElement.addAttribute("description", role.getDescription()); roleElement.addAttribute("type", String.valueOf(role.getType())); roleElement.addAttribute("subtype", role.getSubtype()); Set<String> availableActionIds = entry.getValue(); for (String actionId : availableActionIds) { Element actionKeyElement = roleElement.addElement("action-key"); actionKeyElement.addText(actionId); } } } private PermissionExporter() { } private static final Log _log = LogFactoryUtil.getLog( PermissionExporter.class); private static final PermissionExporter _instance = new PermissionExporter(); }