001    /**
002     * Copyright (c) 2000-2012 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            public long getCompanyScopeActionIds(
041                            long companyId, String name, long roleId)
042                    throws SystemException {
043    
044                    return getGroupScopeActionIds(companyId, 0, name, roleId);
045            }
046    
047            public long getGroupScopeActionIds(
048                            long companyId, long groupId, String name, long roleId)
049                    throws SystemException {
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            public List<ResourceTypePermission> getGroupScopeResourceTypePermissions(
064                            long companyId, String name, long roleId)
065                    throws SystemException {
066    
067                    return resourceTypePermissionFinder.findByGroupScopeC_N_R(
068                            companyId, name, roleId);
069            }
070    
071            public ResourceBlockPermissionsContainer
072                            getResourceBlockPermissionsContainer(
073                                    long companyId, long groupId, String name)
074                    throws SystemException {
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            public List<ResourceTypePermission> getRoleResourceTypePermissions(
095                            long roleId)
096                    throws SystemException {
097    
098                    return resourceTypePermissionPersistence.findByRoleId(roleId);
099            }
100    
101            public boolean hasCompanyScopePermission(
102                            long companyId, String name, long roleId, String actionId)
103                    throws PortalException, SystemException {
104    
105                    return hasGroupScopePermission(companyId, 0, name, roleId, actionId);
106            }
107    
108            public boolean hasEitherScopePermission(
109                            long companyId, String name, long roleId, String actionId)
110                    throws PortalException, SystemException {
111    
112                    ResourceAction resourceAction =
113                            resourceActionLocalService.getResourceAction(name, actionId);
114    
115                    List<ResourceTypePermission> resourceTypePermissions =
116                            resourceTypePermissionPersistence.findByC_N_R(
117                                    companyId, name, roleId);
118    
119                    for (ResourceTypePermission resourceTypePermission :
120                            resourceTypePermissions) {
121    
122                            long actionIdsLong = resourceTypePermission.getActionIds();
123                            long bitwiseValue = resourceAction.getBitwiseValue();
124    
125                            if ((actionIdsLong & bitwiseValue) == bitwiseValue) {
126                                    return true;
127                            }
128                    }
129    
130                    return false;
131            }
132    
133            public boolean hasGroupScopePermission(
134                            long companyId, long groupId, String name, long roleId,
135                            String actionId)
136                    throws PortalException, SystemException {
137    
138                    ResourceAction resourceAction =
139                            resourceActionLocalService.getResourceAction(name, actionId);
140    
141                    ResourceTypePermission resourceTypePermission =
142                            resourceTypePermissionPersistence.findByC_G_N_R(
143                                    companyId, groupId, name, roleId);
144    
145                    long actionIdsLong = resourceTypePermission.getActionIds();
146                    long bitwiseValue = resourceAction.getBitwiseValue();
147    
148                    if ((actionIdsLong & bitwiseValue) == bitwiseValue) {
149                            return true;
150                    }
151                    else {
152                            return false;
153                    }
154            }
155    
156            public void updateCompanyScopeResourceTypePermissions(
157                            long companyId, String name, long roleId, long actionIdsLong,
158                            long operator)
159                    throws SystemException {
160    
161                    updateGroupScopeResourceTypePermissions(
162                            companyId, 0, name, roleId, actionIdsLong, operator);
163            }
164    
165            public void updateGroupScopeResourceTypePermissions(
166                            long companyId, long groupId, String name, long roleId,
167                            long actionIdsLong, long operator)
168                    throws SystemException {
169    
170                    ResourceTypePermission resourceTypePermission =
171                            resourceTypePermissionPersistence.fetchByC_G_N_R(
172                                    companyId, groupId, name, roleId);
173    
174                    if (resourceTypePermission == null) {
175                            if (actionIdsLong == 0) {
176                                    return;
177                            }
178    
179                            long resourceTypePermissionId = counterLocalService.increment();
180    
181                            resourceTypePermission = resourceTypePermissionPersistence.create(
182                                    resourceTypePermissionId);
183    
184                            resourceTypePermission.setCompanyId(companyId);
185                            resourceTypePermission.setGroupId(groupId);
186                            resourceTypePermission.setName(name);
187                            resourceTypePermission.setRoleId(roleId);
188                    }
189    
190                    if (operator == ResourceBlockConstants.OPERATOR_ADD) {
191                            actionIdsLong |= resourceTypePermission.getActionIds();
192                    }
193                    else if (operator == ResourceBlockConstants.OPERATOR_REMOVE) {
194                            actionIdsLong =
195                                    resourceTypePermission.getActionIds() & (~actionIdsLong);
196                    }
197    
198                    if (actionIdsLong == 0) {
199                            deleteResourceTypePermission(resourceTypePermission);
200                    }
201                    else {
202                            resourceTypePermission.setActionIds(actionIdsLong);
203    
204                            updateResourceTypePermission(resourceTypePermission);
205                    }
206            }
207    
208    }