001
014
015 package com.liferay.portal.service.impl;
016
017 import com.liferay.portal.exception.NoSuchResourceActionException;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.spring.aop.Skip;
020 import com.liferay.portal.kernel.transaction.Propagation;
021 import com.liferay.portal.kernel.transaction.Transactional;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.model.ResourceAction;
024 import com.liferay.portal.model.ResourceConstants;
025 import com.liferay.portal.model.RoleConstants;
026 import com.liferay.portal.security.permission.ActionKeys;
027 import com.liferay.portal.security.permission.ResourceActionsUtil;
028 import com.liferay.portal.service.base.ResourceActionLocalServiceBaseImpl;
029 import com.liferay.portal.util.comparator.ResourceActionBitwiseValueComparator;
030
031 import java.util.ArrayList;
032 import java.util.List;
033 import java.util.Map;
034 import java.util.concurrent.ConcurrentHashMap;
035
036
040 public class ResourceActionLocalServiceImpl
041 extends ResourceActionLocalServiceBaseImpl {
042
043 @Override
044 public ResourceAction addResourceAction(
045 String name, String actionId, long bitwiseValue) {
046
047 ResourceAction resourceAction = resourceActionPersistence.fetchByN_A(
048 name, actionId);
049
050 if (resourceAction == null) {
051 long resourceActionId = counterLocalService.increment(
052 ResourceAction.class.getName());
053
054 resourceAction = resourceActionPersistence.create(resourceActionId);
055
056 resourceAction.setName(name);
057 resourceAction.setActionId(actionId);
058 resourceAction.setBitwiseValue(bitwiseValue);
059
060 resourceActionPersistence.update(resourceAction);
061 }
062
063 return resourceAction;
064 }
065
066 @Override
067 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
068 public void checkResourceActions() {
069 List<ResourceAction> resourceActions =
070 resourceActionPersistence.findAll();
071
072 for (ResourceAction resourceAction : resourceActions) {
073 String key = encodeKey(
074 resourceAction.getName(), resourceAction.getActionId());
075
076 _resourceActions.put(key, resourceAction);
077 }
078 }
079
080 @Override
081 public void checkResourceActions(String name, List<String> actionIds) {
082 checkResourceActions(name, actionIds, false);
083 }
084
085 @Override
086 public void checkResourceActions(
087 String name, List<String> actionIds, boolean addDefaultActions) {
088
089 long lastBitwiseValue = -1;
090 List<ResourceAction> newResourceActions = null;
091
092 for (String actionId : actionIds) {
093 String key = encodeKey(name, actionId);
094
095 ResourceAction resourceAction = _resourceActions.get(key);
096
097 if (resourceAction != null) {
098 continue;
099 }
100
101 resourceAction = resourceActionPersistence.fetchByN_A(
102 name, actionId);
103
104 if (resourceAction == null) {
105 long bitwiseValue = 1;
106
107 if (!actionId.equals(ActionKeys.VIEW)) {
108 if (lastBitwiseValue < 0) {
109 ResourceAction lastResourceAction =
110 resourceActionPersistence.fetchByName_First(
111 name,
112 new ResourceActionBitwiseValueComparator());
113
114 if (lastResourceAction != null) {
115 lastBitwiseValue =
116 lastResourceAction.getBitwiseValue();
117 }
118 else {
119 lastBitwiseValue = 1;
120 }
121 }
122
123 lastBitwiseValue = lastBitwiseValue << 1;
124
125 bitwiseValue = lastBitwiseValue;
126 }
127
128 try {
129 resourceAction =
130 resourceActionLocalService.addResourceAction(
131 name, actionId, bitwiseValue);
132 }
133 catch (Throwable t) {
134 resourceAction =
135 resourceActionLocalService.addResourceAction(
136 name, actionId, bitwiseValue);
137 }
138
139 if (newResourceActions == null) {
140 newResourceActions = new ArrayList<>();
141 }
142
143 newResourceActions.add(resourceAction);
144 }
145
146 _resourceActions.put(key, resourceAction);
147 }
148
149 if (!addDefaultActions || (newResourceActions == null)) {
150 return;
151 }
152
153 List<String> groupDefaultActions =
154 ResourceActionsUtil.getModelResourceGroupDefaultActions(name);
155
156 List<String> guestDefaultActions =
157 ResourceActionsUtil.getModelResourceGuestDefaultActions(name);
158
159 long guestBitwiseValue = 0;
160 long ownerBitwiseValue = 0;
161 long siteMemberBitwiseValue = 0;
162
163 for (ResourceAction resourceAction : newResourceActions) {
164 String actionId = resourceAction.getActionId();
165
166 if (guestDefaultActions.contains(actionId)) {
167 guestBitwiseValue |= resourceAction.getBitwiseValue();
168 }
169
170 ownerBitwiseValue |= resourceAction.getBitwiseValue();
171
172 if (groupDefaultActions.contains(actionId)) {
173 siteMemberBitwiseValue |= resourceAction.getBitwiseValue();
174 }
175 }
176
177 if (guestBitwiseValue > 0) {
178 resourcePermissionLocalService.addResourcePermissions(
179 name, RoleConstants.GUEST, ResourceConstants.SCOPE_INDIVIDUAL,
180 guestBitwiseValue);
181 }
182
183 if (ownerBitwiseValue > 0) {
184 resourcePermissionLocalService.addResourcePermissions(
185 name, RoleConstants.OWNER, ResourceConstants.SCOPE_INDIVIDUAL,
186 ownerBitwiseValue);
187 }
188
189 if (siteMemberBitwiseValue > 0) {
190 resourcePermissionLocalService.addResourcePermissions(
191 name, RoleConstants.SITE_MEMBER,
192 ResourceConstants.SCOPE_INDIVIDUAL, siteMemberBitwiseValue);
193 }
194 }
195
196 @Override
197 public ResourceAction deleteResourceAction(long resourceActionId)
198 throws PortalException {
199
200 return deleteResourceAction(
201 resourceActionPersistence.findByPrimaryKey(resourceActionId));
202 }
203
204 @Override
205 public ResourceAction deleteResourceAction(ResourceAction resourceAction) {
206 _resourceActions.remove(
207 encodeKey(resourceAction.getName(), resourceAction.getActionId()));
208
209 return resourceActionPersistence.remove(resourceAction);
210 }
211
212 @Override
213 @Skip
214 public ResourceAction fetchResourceAction(String name, String actionId) {
215 String key = encodeKey(name, actionId);
216
217 return _resourceActions.get(key);
218 }
219
220 @Override
221 @Skip
222 public ResourceAction getResourceAction(String name, String actionId)
223 throws PortalException {
224
225 String key = encodeKey(name, actionId);
226
227 ResourceAction resourceAction = _resourceActions.get(key);
228
229 if (resourceAction == null) {
230 throw new NoSuchResourceActionException(key);
231 }
232
233 return resourceAction;
234 }
235
236 @Override
237 public List<ResourceAction> getResourceActions(String name) {
238 return resourceActionPersistence.findByName(name);
239 }
240
241 @Override
242 public int getResourceActionsCount(String name) {
243 return resourceActionPersistence.countByName(name);
244 }
245
246 protected String encodeKey(String name, String actionId) {
247 return name.concat(StringPool.POUND).concat(actionId);
248 }
249
250 private static final Map<String, ResourceAction> _resourceActions =
251 new ConcurrentHashMap<>();
252
253 }