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