1
22
23 package com.liferay.portal.service.impl;
24
25 import com.liferay.portal.NoSuchResourcePermissionException;
26 import com.liferay.portal.PortalException;
27 import com.liferay.portal.SystemException;
28 import com.liferay.portal.kernel.search.SearchEngineUtil;
29 import com.liferay.portal.model.ResourceAction;
30 import com.liferay.portal.model.ResourceConstants;
31 import com.liferay.portal.model.ResourcePermission;
32 import com.liferay.portal.model.ResourcePermissionConstants;
33 import com.liferay.portal.security.permission.PermissionCacheUtil;
34 import com.liferay.portal.service.base.ResourcePermissionLocalServiceBaseImpl;
35
36 import java.util.ArrayList;
37 import java.util.Collections;
38 import java.util.List;
39
40
48 public class ResourcePermissionLocalServiceImpl
49 extends ResourcePermissionLocalServiceBaseImpl {
50
51 public void addResourcePermission(
52 long companyId, String name, int scope, String primKey, long roleId,
53 String actionId)
54 throws PortalException, SystemException {
55
56 if (scope == ResourceConstants.SCOPE_COMPANY) {
57
58
60 removeResourcePermissions(
61 companyId, name, ResourceConstants.SCOPE_GROUP, roleId,
62 actionId);
63 }
64 else if (scope == ResourceConstants.SCOPE_GROUP) {
65
66
68 removeResourcePermissions(
69 companyId, name, ResourceConstants.SCOPE_COMPANY, roleId,
70 actionId);
71 }
72 else if (scope == ResourceConstants.SCOPE_INDIVIDUAL) {
73 throw new NoSuchResourcePermissionException();
74 }
75
76 updateResourcePermission(
77 companyId, name, scope, primKey, roleId, new String[] {actionId},
78 ResourcePermissionConstants.OPERATOR_ADD);
79
80 PermissionCacheUtil.clearCache();
81 }
82
83 public List<String> getAvailableResourcePermissionActionIds(
84 long companyId, String name, int scope, String primKey, long roleId,
85 List<String> actionIds)
86 throws PortalException, SystemException {
87
88 ResourcePermission resourcePermission =
89 resourcePermissionPersistence.fetchByC_N_S_P_R(
90 companyId, name, scope, primKey, roleId);
91
92 if (resourcePermission == null) {
93 return Collections.EMPTY_LIST;
94 }
95
96 List<String> availableActionIds = new ArrayList<String>(
97 actionIds.size());
98
99 for (String actionId : actionIds) {
100 ResourceAction resourceAction =
101 resourceActionLocalService.getResourceAction(name, actionId);
102
103 if (hasActionId(resourcePermission, resourceAction)) {
104 availableActionIds.add(actionId);
105 }
106 }
107
108 return availableActionIds;
109 }
110
111 public int getResourcePermissionsCount(
112 long companyId, String name, int scope, String primKey)
113 throws SystemException {
114
115 return resourcePermissionPersistence.countByC_N_S_P(
116 companyId, name, scope, primKey);
117 }
118
119 public List<ResourcePermission> getRoleResourcePermissions(long roleId)
120 throws SystemException {
121
122 return resourcePermissionPersistence.findByRoleId(roleId);
123 }
124
125 public boolean hasActionId(
126 ResourcePermission resourcePermission, ResourceAction resourceAction) {
127
128 long actionIds = resourcePermission.getActionIds();
129 long bitwiseValue = resourceAction.getBitwiseValue();
130
131 if ((actionIds & bitwiseValue) == bitwiseValue) {
132 return true;
133 }
134 else {
135 return false;
136 }
137 }
138
139 public boolean hasResourcePermission(
140 long companyId, String name, int scope, String primKey, long roleId,
141 String actionId)
142 throws PortalException, SystemException {
143
144 ResourcePermission resourcePermission =
145 resourcePermissionPersistence.fetchByC_N_S_P_R(
146 companyId, name, scope, primKey, roleId);
147
148 if (resourcePermission == null) {
149 return false;
150 }
151
152 ResourceAction resourceAction =
153 resourceActionLocalService.getResourceAction(name, actionId);
154
155 if (hasActionId(resourcePermission, resourceAction)) {
156 return true;
157 }
158 else {
159 return false;
160 }
161 }
162
163 public boolean hasScopeResourcePermission(
164 long companyId, String name, int scope, long roleId,
165 String actionId)
166 throws PortalException, SystemException {
167
168 List<ResourcePermission> resourcePermissions =
169 resourcePermissionPersistence.findByC_N_S(companyId, name, scope);
170
171 for (ResourcePermission resourcePermission : resourcePermissions) {
172 if (hasResourcePermission(
173 companyId, name, scope, resourcePermission.getPrimKey(),
174 roleId, actionId)) {
175
176 return true;
177 }
178 }
179
180 return false;
181 }
182
183 public void removeResourcePermission(
184 long companyId, String name, int scope, String primKey, long roleId,
185 String actionId)
186 throws PortalException, SystemException {
187
188 updateResourcePermission(
189 companyId, name, scope, primKey, roleId, new String[] {actionId},
190 ResourcePermissionConstants.OPERATOR_REMOVE);
191
192 PermissionCacheUtil.clearCache();
193 }
194
195 public void removeResourcePermissions(
196 long companyId, String name, int scope, long roleId,
197 String actionId)
198 throws PortalException, SystemException {
199
200 List<ResourcePermission> resourcePermissions =
201 resourcePermissionPersistence.findByC_N_S(companyId, name, scope);
202
203 for (ResourcePermission resourcePermission : resourcePermissions) {
204 updateResourcePermission(
205 companyId, name, scope, resourcePermission.getPrimKey(), roleId,
206 new String[] {actionId},
207 ResourcePermissionConstants.OPERATOR_REMOVE);
208 }
209
210 PermissionCacheUtil.clearCache();
211 }
212
213 public void setResourcePermissions(
214 long companyId, String name, int scope, String primKey, long roleId,
215 String[] actionIds)
216 throws PortalException, SystemException {
217
218 updateResourcePermission(
219 companyId, name, scope, primKey, roleId, actionIds,
220 ResourcePermissionConstants.OPERATOR_SET);
221 }
222
223 protected void updateResourcePermission(
224 long companyId, String name, int scope, String primKey, long roleId,
225 String[] actionIds, int operator)
226 throws PortalException, SystemException {
227
228 ResourcePermission resourcePermission =
229 resourcePermissionPersistence.fetchByC_N_S_P_R(
230 companyId, name, scope, primKey, roleId);
231
232 if (resourcePermission == null) {
233 if (operator == ResourcePermissionConstants.OPERATOR_REMOVE) {
234 return;
235 }
236
237 long resourcePermissionId = counterLocalService.increment(
238 ResourcePermission.class.getName());
239
240 resourcePermission = resourcePermissionPersistence.create(
241 resourcePermissionId);
242
243 resourcePermission.setCompanyId(companyId);
244 resourcePermission.setName(name);
245 resourcePermission.setScope(scope);
246 resourcePermission.setPrimKey(primKey);
247 resourcePermission.setRoleId(roleId);
248 }
249
250 long actionIdsLong = resourcePermission.getActionIds();
251
252 if (operator == ResourcePermissionConstants.OPERATOR_SET) {
253 actionIdsLong = 0;
254 }
255
256 for (String actionId : actionIds) {
257 ResourceAction resourceAction =
258 resourceActionLocalService.getResourceAction(name, actionId);
259
260 if ((operator == ResourcePermissionConstants.OPERATOR_ADD) ||
261 (operator == ResourcePermissionConstants.OPERATOR_SET)) {
262
263 actionIdsLong |= resourceAction.getBitwiseValue();
264 }
265 else {
266 actionIdsLong =
267 actionIdsLong & (~resourceAction.getBitwiseValue());
268 }
269 }
270
271 resourcePermission.setActionIds(actionIdsLong);
272
273 resourcePermissionPersistence.update(resourcePermission, false);
274
275 PermissionCacheUtil.clearCache();
276
277 SearchEngineUtil.updatePermissionFields(name, primKey);
278 }
279
280 }