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.portal.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.model.ResourceBlock;
020    import com.liferay.portal.model.ResourceBlockConstants;
021    import com.liferay.portal.model.ResourceBlockPermission;
022    import com.liferay.portal.model.ResourceBlockPermissionsContainer;
023    import com.liferay.portal.service.base.ResourceBlockPermissionLocalServiceBaseImpl;
024    
025    import java.util.HashMap;
026    import java.util.HashSet;
027    import java.util.List;
028    import java.util.Map;
029    import java.util.Set;
030    
031    /**
032     * Manages resource block permissions.
033     *
034     * <p>
035     * Never directly access this service, always go through the resource block
036     * local service.
037     * </p>
038     *
039     * @author Connor McKay
040     */
041    public class ResourceBlockPermissionLocalServiceImpl
042            extends ResourceBlockPermissionLocalServiceBaseImpl {
043    
044            @Override
045            public void addResourceBlockPermissions(
046                            long resourceBlockId,
047                            ResourceBlockPermissionsContainer resourceBlockPermissionsContainer)
048                    throws SystemException {
049    
050                    Map<Long, Long> permissions =
051                            resourceBlockPermissionsContainer.getPermissions();
052    
053                    for (Map.Entry<Long, Long> permission : permissions.entrySet()) {
054                            long resourceBlockPermissionId = counterLocalService.increment();
055    
056                            ResourceBlockPermission resourceBlockPermission =
057                                    resourceBlockPermissionPersistence.create(
058                                            resourceBlockPermissionId);
059    
060                            resourceBlockPermission.setResourceBlockId(resourceBlockId);
061                            resourceBlockPermission.setRoleId(permission.getKey());
062                            resourceBlockPermission.setActionIds(permission.getValue());
063    
064                            updateResourceBlockPermission(resourceBlockPermission);
065                    }
066            }
067    
068            @Override
069            public void deleteResourceBlockPermissions(long resourceBlockId)
070                    throws SystemException {
071    
072                    resourceBlockPermissionPersistence.removeByResourceBlockId(
073                            resourceBlockId);
074            }
075    
076            @Override
077            public Map<Long, Set<String>> getAvailableResourceBlockPermissionActionIds(
078                            long[] roleIds, String name, long primKey, List<String> actionIds)
079                    throws PortalException, SystemException {
080    
081                    ResourceBlock resourceBlock =
082                            resourceBlockLocalService.getResourceBlock(name, primKey);
083    
084                    Map<Long, Set<String>> roleIdsToActionIds =
085                            new HashMap<Long, Set<String>>();
086    
087                    for (long roleId : roleIds) {
088                            Set<String> availableActionIds = roleIdsToActionIds.get(roleId);
089    
090                            if (availableActionIds != null) {
091                                    continue;
092                            }
093    
094                            List<String> resourceBlockActionIds =
095                                    resourceBlockLocalService.getPermissions(resourceBlock, roleId);
096    
097                            if (resourceBlockActionIds.isEmpty()) {
098                                    continue;
099                            }
100    
101                            availableActionIds = new HashSet<String>();
102    
103                            roleIdsToActionIds.put(roleId, availableActionIds);
104    
105                            for (String actionId : actionIds) {
106                                    if (resourceBlockActionIds.contains(actionId)) {
107                                            availableActionIds.add(actionId);
108                                    }
109                            }
110                    }
111    
112                    return roleIdsToActionIds;
113            }
114    
115            @Override
116            public ResourceBlockPermissionsContainer
117                            getResourceBlockPermissionsContainer(long resourceBlockId)
118                    throws SystemException {
119    
120                    List<ResourceBlockPermission> resourceBlockPermissions =
121                            resourceBlockPermissionPersistence.findByResourceBlockId(
122                                    resourceBlockId);
123    
124                    ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
125                            new ResourceBlockPermissionsContainer();
126    
127                    for (ResourceBlockPermission resourceBlockPermission :
128                                    resourceBlockPermissions) {
129    
130                            resourceBlockPermissionContainer.setPermissions(
131                                    resourceBlockPermission.getRoleId(),
132                                    resourceBlockPermission.getActionIds());
133                    }
134    
135                    return resourceBlockPermissionContainer;
136            }
137    
138            @Override
139            public int getResourceBlockPermissionsCount(
140                            long resourceBlockId, long roleId)
141                    throws SystemException {
142    
143                    return resourceBlockPermissionPersistence.countByR_R(
144                            resourceBlockId, roleId);
145            }
146    
147            @Override
148            public void updateResourceBlockPermission(
149                            long resourceBlockId, long roleId, long actionIdsLong, int operator)
150                    throws SystemException {
151    
152                    ResourceBlockPermission resourceBlockPermission =
153                            resourceBlockPermissionPersistence.fetchByR_R(
154                                    resourceBlockId, roleId);
155    
156                    if (resourceBlockPermission == null) {
157                            if (actionIdsLong == 0) {
158                                    return;
159                            }
160    
161                            long resourceBlockPermissionId = counterLocalService.increment();
162    
163                            resourceBlockPermission = resourceBlockPermissionPersistence.create(
164                                    resourceBlockPermissionId);
165    
166                            resourceBlockPermission.setResourceBlockId(resourceBlockId);
167                            resourceBlockPermission.setRoleId(roleId);
168                    }
169    
170                    if (operator == ResourceBlockConstants.OPERATOR_ADD) {
171                            actionIdsLong |= resourceBlockPermission.getActionIds();
172                    }
173                    else if (operator == ResourceBlockConstants.OPERATOR_REMOVE) {
174                            actionIdsLong =
175                                    resourceBlockPermission.getActionIds() & (~actionIdsLong);
176                    }
177    
178                    if (actionIdsLong == 0) {
179                            deleteResourceBlockPermission(resourceBlockPermission);
180                    }
181                    else {
182                            resourceBlockPermission.setActionIds(actionIdsLong);
183    
184                            updateResourceBlockPermission(resourceBlockPermission);
185                    }
186            }
187    
188    }