001    /**
002     * Copyright (c) 2000-present 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.model.ResourceBlock;
019    import com.liferay.portal.model.ResourceBlockConstants;
020    import com.liferay.portal.model.ResourceBlockPermission;
021    import com.liferay.portal.model.ResourceBlockPermissionsContainer;
022    import com.liferay.portal.service.base.ResourceBlockPermissionLocalServiceBaseImpl;
023    
024    import java.util.Collections;
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    
049                    Map<Long, Long> permissions =
050                            resourceBlockPermissionsContainer.getPermissions();
051    
052                    for (Map.Entry<Long, Long> permission : permissions.entrySet()) {
053                            long resourceBlockPermissionId = counterLocalService.increment();
054    
055                            ResourceBlockPermission resourceBlockPermission =
056                                    resourceBlockPermissionPersistence.create(
057                                            resourceBlockPermissionId);
058    
059                            resourceBlockPermission.setResourceBlockId(resourceBlockId);
060                            resourceBlockPermission.setRoleId(permission.getKey());
061                            resourceBlockPermission.setActionIds(permission.getValue());
062    
063                            updateResourceBlockPermission(resourceBlockPermission);
064                    }
065            }
066    
067            @Override
068            public void deleteResourceBlockPermissions(long resourceBlockId) {
069                    resourceBlockPermissionPersistence.removeByResourceBlockId(
070                            resourceBlockId);
071            }
072    
073            /**
074             * @deprecated As of 7.0.0, replaced by {@link
075             *             #getAvailableResourceBlockPermissionActionIds(String, long,
076             *             List)}
077             */
078            @Deprecated
079            @Override
080            public Map<Long, Set<String>> getAvailableResourceBlockPermissionActionIds(
081                            long[] roleIds, String name, long primKey, List<String> actionIds)
082                    throws PortalException {
083    
084                    return getAvailableResourceBlockPermissionActionIds(
085                            name, primKey, actionIds);
086            }
087    
088            @Override
089            public Map<Long, Set<String>> getAvailableResourceBlockPermissionActionIds(
090                            String name, long primKey, List<String> actionIds)
091                    throws PortalException {
092    
093                    if (actionIds.isEmpty()) {
094                            return Collections.emptyMap();
095                    }
096    
097                    ResourceBlock resourceBlock =
098                            resourceBlockLocalService.getResourceBlock(name, primKey);
099    
100                    List<ResourceBlockPermission> resourceBlockPermissions =
101                            resourceBlockPermissionPersistence.findByResourceBlockId(
102                                    resourceBlock.getResourceBlockId());
103    
104                    Map<Long, Set<String>> roleIdsToActionIds =
105                            new HashMap<Long, Set<String>>();
106    
107                    for (ResourceBlockPermission resourceBlockPermission :
108                                    resourceBlockPermissions) {
109    
110                            Set<String> availableActionIds = new HashSet<String>();
111    
112                            List<String> resourceBlockActionIds =
113                                    resourceBlockLocalService.getActionIds(
114                                            name, resourceBlockPermission.getActionIds());
115    
116                            for (String actionId : actionIds) {
117                                    if (resourceBlockActionIds.contains(actionId)) {
118                                            availableActionIds.add(actionId);
119                                    }
120                            }
121    
122                            if (!availableActionIds.isEmpty()) {
123                                    roleIdsToActionIds.put(
124                                            resourceBlockPermission.getRoleId(), availableActionIds);
125                            }
126                    }
127    
128                    return roleIdsToActionIds;
129            }
130    
131            @Override
132            public ResourceBlockPermissionsContainer
133                            getResourceBlockPermissionsContainer(long resourceBlockId) {
134    
135                    List<ResourceBlockPermission> resourceBlockPermissions =
136                            resourceBlockPermissionPersistence.findByResourceBlockId(
137                                    resourceBlockId);
138    
139                    ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
140                            new ResourceBlockPermissionsContainer();
141    
142                    for (ResourceBlockPermission resourceBlockPermission :
143                                    resourceBlockPermissions) {
144    
145                            resourceBlockPermissionContainer.setPermissions(
146                                    resourceBlockPermission.getRoleId(),
147                                    resourceBlockPermission.getActionIds());
148                    }
149    
150                    return resourceBlockPermissionContainer;
151            }
152    
153            @Override
154            public int getResourceBlockPermissionsCount(
155                    long resourceBlockId, long roleId) {
156    
157                    return resourceBlockPermissionPersistence.countByR_R(
158                            resourceBlockId, roleId);
159            }
160    
161            @Override
162            public void updateResourceBlockPermission(
163                    long resourceBlockId, long roleId, long actionIdsLong, int operator) {
164    
165                    ResourceBlockPermission resourceBlockPermission =
166                            resourceBlockPermissionPersistence.fetchByR_R(
167                                    resourceBlockId, roleId);
168    
169                    if (resourceBlockPermission == null) {
170                            if (actionIdsLong == 0) {
171                                    return;
172                            }
173    
174                            long resourceBlockPermissionId = counterLocalService.increment();
175    
176                            resourceBlockPermission = resourceBlockPermissionPersistence.create(
177                                    resourceBlockPermissionId);
178    
179                            resourceBlockPermission.setResourceBlockId(resourceBlockId);
180                            resourceBlockPermission.setRoleId(roleId);
181                    }
182    
183                    if (operator == ResourceBlockConstants.OPERATOR_ADD) {
184                            actionIdsLong |= resourceBlockPermission.getActionIds();
185                    }
186                    else if (operator == ResourceBlockConstants.OPERATOR_REMOVE) {
187                            actionIdsLong =
188                                    resourceBlockPermission.getActionIds() & (~actionIdsLong);
189                    }
190    
191                    if (actionIdsLong == 0) {
192                            deleteResourceBlockPermission(resourceBlockPermission);
193                    }
194                    else {
195                            resourceBlockPermission.setActionIds(actionIdsLong);
196    
197                            updateResourceBlockPermission(resourceBlockPermission);
198                    }
199            }
200    
201    }