001
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
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 }