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