001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.rolesadmin.lar;
016    
017    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.Junction;
019    import com.liferay.portal.kernel.dao.orm.Property;
020    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
021    import com.liferay.portal.kernel.dao.orm.QueryUtil;
022    import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
023    import com.liferay.portal.kernel.exception.PortalException;
024    import com.liferay.portal.kernel.exception.SystemException;
025    import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
026    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
027    import com.liferay.portal.kernel.lar.PortletDataContext;
028    import com.liferay.portal.kernel.log.Log;
029    import com.liferay.portal.kernel.log.LogFactoryUtil;
030    import com.liferay.portal.kernel.util.GetterUtil;
031    import com.liferay.portal.kernel.xml.Element;
032    import com.liferay.portal.model.Group;
033    import com.liferay.portal.model.GroupConstants;
034    import com.liferay.portal.model.Permission;
035    import com.liferay.portal.model.ResourceConstants;
036    import com.liferay.portal.model.ResourcePermission;
037    import com.liferay.portal.model.ResourceTypePermission;
038    import com.liferay.portal.model.Role;
039    import com.liferay.portal.security.permission.PermissionConversionFilter;
040    import com.liferay.portal.security.permission.PermissionConverterUtil;
041    import com.liferay.portal.service.GroupLocalServiceUtil;
042    import com.liferay.portal.service.ResourceBlockLocalServiceUtil;
043    import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
044    import com.liferay.portal.service.ResourcePermissionServiceUtil;
045    import com.liferay.portal.service.ResourceTypePermissionLocalServiceUtil;
046    import com.liferay.portal.service.RoleLocalServiceUtil;
047    import com.liferay.portal.service.ServiceContext;
048    
049    import java.util.List;
050    
051    /**
052     * @author David Mendez Gonzalez
053     * @author Michael C. Han
054     */
055    public class RoleStagedModelDataHandler
056            extends BaseStagedModelDataHandler<Role> {
057    
058            public static final String[] CLASS_NAMES = {Role.class.getName()};
059    
060            @Override
061            public void deleteStagedModel(
062                            String uuid, long groupId, String className, String extraData)
063                    throws PortalException, SystemException {
064    
065                    Group group = GroupLocalServiceUtil.getGroup(groupId);
066    
067                    Role role = RoleLocalServiceUtil.fetchRoleByUuidAndCompanyId(
068                            uuid, group.getCompanyId());
069    
070                    if (role != null) {
071                            RoleLocalServiceUtil.deleteRole(role);
072                    }
073            }
074    
075            @Override
076            public String[] getClassNames() {
077                    return CLASS_NAMES;
078            }
079    
080            @Override
081            public String getDisplayName(Role role) {
082                    return role.getName();
083            }
084    
085            protected void deleteRolePermissions(
086                            PortletDataContext portletDataContext, Role importedRole)
087                    throws SystemException {
088    
089                    List<ResourcePermission> resourcePermissions =
090                            ResourcePermissionLocalServiceUtil.getRoleResourcePermissions(
091                                    importedRole.getRoleId(),
092                                    new int[] {
093                                            ResourceConstants.SCOPE_COMPANY,
094                                            ResourceConstants.SCOPE_GROUP_TEMPLATE
095                                    },
096                                    QueryUtil.ALL_POS, QueryUtil.ALL_POS);
097    
098                    for (ResourcePermission resourcePermission : resourcePermissions) {
099                            ResourcePermissionLocalServiceUtil.deleteResourcePermission(
100                                    resourcePermission);
101                    }
102    
103                    List<ResourcePermission> groupResourcePermissions =
104                            ResourcePermissionLocalServiceUtil.getRoleResourcePermissions(
105                                    importedRole.getRoleId(),
106                                    new int[] {ResourceConstants.SCOPE_GROUP},
107                                    QueryUtil.ALL_POS, QueryUtil.ALL_POS);
108    
109                    for (ResourcePermission groupResourcePermission :
110                                    groupResourcePermissions) {
111    
112                            long groupId = GetterUtil.getLong(
113                                    groupResourcePermission.getPrimKey());
114    
115                            if ((groupId == portletDataContext.getCompanyGroupId()) ||
116                                    (groupId == portletDataContext.getUserPersonalSiteGroupId())) {
117    
118                                    ResourcePermissionLocalServiceUtil.deleteResourcePermission(
119                                            groupResourcePermission);
120                            }
121                    }
122    
123                    List<ResourceTypePermission> resourceTypePermissions =
124                            getResourceTypePermissions(portletDataContext, importedRole);
125    
126                    for (ResourceTypePermission resourceTypePermission :
127                                    resourceTypePermissions) {
128    
129                            ResourceTypePermissionLocalServiceUtil.deleteResourceTypePermission(
130                                    resourceTypePermission);
131                    }
132            }
133    
134            @Override
135            protected void doExportStagedModel(
136                            PortletDataContext portletDataContext, Role role)
137                    throws Exception {
138    
139                    String permissionsPath = ExportImportPathUtil.getModelPath(
140                            role, "permissions.xml");
141    
142                    List<Permission> permissions =
143                            PermissionConverterUtil.convertPermissions(
144                                    role, _permissionConversionFilter);
145    
146                    String xml = portletDataContext.toXML(permissions);
147    
148                    portletDataContext.addZipEntry(permissionsPath, xml);
149    
150                    Element roleElement = portletDataContext.getExportDataElement(role);
151    
152                    portletDataContext.addClassedModel(
153                            roleElement, ExportImportPathUtil.getModelPath(role), role);
154            }
155    
156            @Override
157            protected void doImportStagedModel(
158                            PortletDataContext portletDataContext, Role role)
159                    throws Exception {
160    
161                    long userId = portletDataContext.getUserId(role.getUserUuid());
162    
163                    ServiceContext serviceContext = portletDataContext.createServiceContext(
164                            role);
165    
166                    Role existingRole = RoleLocalServiceUtil.fetchRoleByUuidAndCompanyId(
167                            role.getUuid(), portletDataContext.getCompanyId());
168    
169                    if (existingRole == null) {
170                            existingRole = RoleLocalServiceUtil.fetchRole(
171                                    portletDataContext.getCompanyId(), role.getName());
172                    }
173    
174                    Role importedRole = null;
175    
176                    if (existingRole == null) {
177                            serviceContext.setUuid(role.getUuid());
178    
179                            importedRole = RoleLocalServiceUtil.addRole(
180                                    userId, null, 0, role.getName(), role.getTitleMap(),
181                                    role.getDescriptionMap(), role.getType(), role.getSubtype(),
182                                    serviceContext);
183                    }
184                    else {
185                            importedRole = RoleLocalServiceUtil.updateRole(
186                                    existingRole.getRoleId(), role.getName(), role.getTitleMap(),
187                                    role.getDescriptionMap(), role.getSubtype(), serviceContext);
188    
189                            deleteRolePermissions(portletDataContext, importedRole);
190                    }
191    
192                    String permissionsPath = ExportImportPathUtil.getModelPath(
193                            role, "permissions.xml");
194    
195                    List<Permission> permissions =
196                            (List<Permission>)portletDataContext.getZipEntryAsObject(
197                                    permissionsPath);
198    
199                    for (Permission permission : permissions) {
200                            if (ResourceBlockLocalServiceUtil.isSupported(
201                                            permission.getName())) {
202    
203                                    importResourceBlock(
204                                            portletDataContext, importedRole, permission);
205                            }
206                            else {
207                                    importResourcePermissions(
208                                            portletDataContext, importedRole, permission);
209                            }
210                    }
211    
212                    portletDataContext.importClassedModel(role, importedRole);
213            }
214    
215            protected List<ResourceTypePermission> getResourceTypePermissions(
216                            PortletDataContext portletDataContext, Role importedRole)
217                    throws SystemException {
218    
219                    DynamicQuery dynamicQuery =
220                            ResourceTypePermissionLocalServiceUtil.dynamicQuery();
221    
222                    Property companyIdProperty = PropertyFactoryUtil.forName("companyId");
223    
224                    dynamicQuery.add(
225                            companyIdProperty.eq(portletDataContext.getCompanyId()));
226    
227                    Junction junction = RestrictionsFactoryUtil.disjunction();
228    
229                    long[] permissibleGroupIds = {
230                            GroupConstants.DEFAULT_PARENT_GROUP_ID,
231                            portletDataContext.getCompanyId(),
232                            portletDataContext.getCompanyGroupId(),
233                            portletDataContext.getUserPersonalSiteGroupId()
234                    };
235    
236                    for (long permissibleGroupId : permissibleGroupIds) {
237                            Property property = PropertyFactoryUtil.forName("groupId");
238    
239                            junction.add(property.eq(permissibleGroupId));
240                    }
241    
242                    dynamicQuery.add(junction);
243    
244                    Property roleIdProperty = PropertyFactoryUtil.forName("roleId");
245    
246                    dynamicQuery.add(roleIdProperty.eq(importedRole.getRoleId()));
247    
248                    return ResourceTypePermissionLocalServiceUtil.dynamicQuery(
249                            dynamicQuery);
250            }
251    
252            protected void importResourceBlock(
253                            PortletDataContext portletDataContext, Role importedRole,
254                            Permission permission)
255                    throws PortalException, SystemException {
256    
257                    int scope = permission.getScope();
258    
259                    if (scope == ResourceConstants.SCOPE_COMPANY) {
260                            ResourceBlockLocalServiceUtil.addCompanyScopePermission(
261                                    portletDataContext.getCompanyId(), permission.getName(),
262                                    importedRole.getRoleId(), permission.getActionId());
263                    }
264                    else if (scope == ResourceConstants.SCOPE_GROUP) {
265                            long groupId = portletDataContext.getCompanyGroupId();
266    
267                            long sourceGroupId = GetterUtil.getLong(permission.getPrimKey());
268    
269                            if (sourceGroupId ==
270                                            portletDataContext.getSourceUserPersonalSiteGroupId()) {
271    
272                                    groupId = portletDataContext.getUserPersonalSiteGroupId();
273                            }
274    
275                            ResourceBlockLocalServiceUtil.addGroupScopePermission(
276                                    portletDataContext.getCompanyId(), groupId,
277                                    permission.getName(), importedRole.getRoleId(),
278                                    permission.getActionId());
279                    }
280                    else if (scope == ResourceConstants.SCOPE_GROUP_TEMPLATE) {
281                            ResourceBlockLocalServiceUtil.addGroupScopePermission(
282                                    portletDataContext.getCompanyId(),
283                                    GroupConstants.DEFAULT_PARENT_GROUP_ID, permission.getName(),
284                                    importedRole.getRoleId(), permission.getActionId());
285                    }
286                    else {
287                            if (_log.isDebugEnabled()) {
288                                    _log.debug("Individually scoped permissions are not exported");
289                            }
290                    }
291            }
292    
293            protected void importResourcePermissions(
294                            PortletDataContext portletDataContext, Role importedRole,
295                            Permission permission)
296                    throws PortalException, SystemException {
297    
298                    int scope = permission.getScope();
299    
300                    if (scope == ResourceConstants.SCOPE_COMPANY) {
301                            ResourcePermissionServiceUtil.addResourcePermission(
302                                    portletDataContext.getCompanyGroupId(),
303                                    portletDataContext.getCompanyId(), permission.getName(), scope,
304                                    String.valueOf(portletDataContext.getCompanyId()),
305                                    importedRole.getRoleId(), permission.getActionId());
306                    }
307                    else if (scope == ResourceConstants.SCOPE_GROUP) {
308                            long groupId = portletDataContext.getCompanyGroupId();
309    
310                            long sourceGroupId = GetterUtil.getLong(permission.getPrimKey());
311    
312                            if (sourceGroupId ==
313                                            portletDataContext.getSourceUserPersonalSiteGroupId()) {
314    
315                                    groupId = portletDataContext.getUserPersonalSiteGroupId();
316                            }
317    
318                            ResourcePermissionServiceUtil.addResourcePermission(
319                                    groupId, portletDataContext.getCompanyId(),
320                                    permission.getName(), ResourceConstants.SCOPE_GROUP,
321                                    String.valueOf(groupId), importedRole.getRoleId(),
322                                    permission.getActionId());
323                    }
324                    else if (scope == ResourceConstants.SCOPE_GROUP_TEMPLATE) {
325                            ResourcePermissionServiceUtil.addResourcePermission(
326                                    GroupConstants.DEFAULT_PARENT_GROUP_ID,
327                                    portletDataContext.getCompanyId(), permission.getName(),
328                                    ResourceConstants.SCOPE_GROUP_TEMPLATE,
329                                    String.valueOf(GroupConstants.DEFAULT_PARENT_GROUP_ID),
330                                    importedRole.getRoleId(), permission.getActionId());
331                    }
332                    else {
333                            if (_log.isDebugEnabled()) {
334                                    _log.debug("Individually scoped permissions are not imported");
335                            }
336                    }
337            }
338    
339            private static Log _log = LogFactoryUtil.getLog(
340                    RoleStagedModelDataHandler.class);
341    
342            private PermissionConversionFilter _permissionConversionFilter =
343                    new ImportExportPermissionConversionFilter();
344    
345    }