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.ResourceAction;
019    import com.liferay.portal.model.ResourceBlockConstants;
020    import com.liferay.portal.model.ResourceBlockPermissionsContainer;
021    import com.liferay.portal.model.ResourceTypePermission;
022    import com.liferay.portal.service.base.ResourceTypePermissionLocalServiceBaseImpl;
023    
024    import java.util.List;
025    
026    /**
027     * Provides the local service for accessing and updating resource type
028     * permissions.
029     *
030     * <p>
031     * Never call the update methods of this service directly, always go through the
032     * resource block local service.
033     * </p>
034     *
035     * @author Connor McKay
036     */
037    public class ResourceTypePermissionLocalServiceImpl
038            extends ResourceTypePermissionLocalServiceBaseImpl {
039    
040            @Override
041            public long getCompanyScopeActionIds(
042                    long companyId, String name, long roleId) {
043    
044                    return getGroupScopeActionIds(companyId, 0, name, roleId);
045            }
046    
047            @Override
048            public long getGroupScopeActionIds(
049                    long companyId, long groupId, String name, long roleId) {
050    
051                    ResourceTypePermission resourceTypePermission =
052                            resourceTypePermissionPersistence.fetchByC_G_N_R(
053                                    companyId, groupId, name, roleId);
054    
055                    if (resourceTypePermission == null) {
056                            return 0;
057                    }
058                    else {
059                            return resourceTypePermission.getActionIds();
060                    }
061            }
062    
063            @Override
064            public List<ResourceTypePermission> getGroupScopeResourceTypePermissions(
065                    long companyId, String name, long roleId) {
066    
067                    return resourceTypePermissionFinder.findByGroupScopeC_N_R(
068                            companyId, name, roleId);
069            }
070    
071            @Override
072            public ResourceBlockPermissionsContainer
073                    getResourceBlockPermissionsContainer(
074                            long companyId, long groupId, String name) {
075    
076                    List<ResourceTypePermission> resourceTypePermissions =
077                            resourceTypePermissionFinder.findByEitherScopeC_G_N(
078                                    companyId, groupId, name);
079    
080                    ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
081                            new ResourceBlockPermissionsContainer();
082    
083                    for (ResourceTypePermission resourceTypePermission :
084                                    resourceTypePermissions) {
085    
086                            resourceBlockPermissionContainer.setPermissions(
087                                    resourceTypePermission.getRoleId(),
088                                    resourceTypePermission.getActionIds());
089                    }
090    
091                    return resourceBlockPermissionContainer;
092            }
093    
094            @Override
095            public List<ResourceTypePermission> getRoleResourceTypePermissions(
096                    long roleId) {
097    
098                    return resourceTypePermissionPersistence.findByRoleId(roleId);
099            }
100    
101            @Override
102            public boolean hasCompanyScopePermission(
103                            long companyId, String name, long roleId, String actionId)
104                    throws PortalException {
105    
106                    return hasGroupScopePermission(companyId, 0, name, roleId, actionId);
107            }
108    
109            @Override
110            public boolean hasEitherScopePermission(
111                            long companyId, String name, long roleId, String actionId)
112                    throws PortalException {
113    
114                    ResourceAction resourceAction =
115                            resourceActionLocalService.getResourceAction(name, actionId);
116    
117                    List<ResourceTypePermission> resourceTypePermissions =
118                            resourceTypePermissionPersistence.findByC_N_R(
119                                    companyId, name, roleId);
120    
121                    for (ResourceTypePermission resourceTypePermission :
122                                    resourceTypePermissions) {
123    
124                            long actionIdsLong = resourceTypePermission.getActionIds();
125                            long bitwiseValue = resourceAction.getBitwiseValue();
126    
127                            if ((actionIdsLong & bitwiseValue) == bitwiseValue) {
128                                    return true;
129                            }
130                    }
131    
132                    return false;
133            }
134    
135            @Override
136            public boolean hasGroupScopePermission(
137                            long companyId, long groupId, String name, long roleId,
138                            String actionId)
139                    throws PortalException {
140    
141                    ResourceAction resourceAction =
142                            resourceActionLocalService.getResourceAction(name, actionId);
143    
144                    ResourceTypePermission resourceTypePermission =
145                            resourceTypePermissionPersistence.findByC_G_N_R(
146                                    companyId, groupId, name, roleId);
147    
148                    long actionIdsLong = resourceTypePermission.getActionIds();
149                    long bitwiseValue = resourceAction.getBitwiseValue();
150    
151                    if ((actionIdsLong & bitwiseValue) == bitwiseValue) {
152                            return true;
153                    }
154                    else {
155                            return false;
156                    }
157            }
158    
159            @Override
160            public void updateCompanyScopeResourceTypePermissions(
161                    long companyId, String name, long roleId, long actionIdsLong,
162                    long operator) {
163    
164                    updateGroupScopeResourceTypePermissions(
165                            companyId, 0, name, roleId, actionIdsLong, operator);
166            }
167    
168            @Override
169            public void updateGroupScopeResourceTypePermissions(
170                    long companyId, long groupId, String name, long roleId,
171                    long actionIdsLong, long operator) {
172    
173                    ResourceTypePermission resourceTypePermission =
174                            resourceTypePermissionPersistence.fetchByC_G_N_R(
175                                    companyId, groupId, name, roleId);
176    
177                    if (resourceTypePermission == null) {
178                            if (actionIdsLong == 0) {
179                                    return;
180                            }
181    
182                            long resourceTypePermissionId = counterLocalService.increment();
183    
184                            resourceTypePermission = resourceTypePermissionPersistence.create(
185                                    resourceTypePermissionId);
186    
187                            resourceTypePermission.setCompanyId(companyId);
188                            resourceTypePermission.setGroupId(groupId);
189                            resourceTypePermission.setName(name);
190                            resourceTypePermission.setRoleId(roleId);
191                    }
192    
193                    if (operator == ResourceBlockConstants.OPERATOR_ADD) {
194                            actionIdsLong |= resourceTypePermission.getActionIds();
195                    }
196                    else if (operator == ResourceBlockConstants.OPERATOR_REMOVE) {
197                            actionIdsLong =
198                                    resourceTypePermission.getActionIds() & (~actionIdsLong);
199                    }
200    
201                    if (actionIdsLong == 0) {
202                            deleteResourceTypePermission(resourceTypePermission);
203                    }
204                    else {
205                            resourceTypePermission.setActionIds(actionIdsLong);
206    
207                            updateResourceTypePermission(resourceTypePermission);
208                    }
209            }
210    
211    }