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