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.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 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
045 public void checkResourceActions() {
046 List<ResourceAction> resourceActions =
047 resourceActionPersistence.findAll();
048
049 for (ResourceAction resourceAction : resourceActions) {
050 String key = encodeKey(
051 resourceAction.getName(), resourceAction.getActionId());
052
053 _resourceActions.put(key, resourceAction);
054 }
055 }
056
057 @Override
058 public void checkResourceActions(String name, List<String> actionIds) {
059 checkResourceActions(name, actionIds, false);
060 }
061
062 @Override
063 public void checkResourceActions(
064 String name, List<String> actionIds, boolean addDefaultActions) {
065
066 long lastBitwiseValue = -1;
067 List<ResourceAction> newResourceActions = null;
068
069 for (String actionId : actionIds) {
070 String key = encodeKey(name, actionId);
071
072 ResourceAction resourceAction = _resourceActions.get(key);
073
074 if (resourceAction != null) {
075 continue;
076 }
077
078 resourceAction = resourceActionPersistence.fetchByN_A(
079 name, actionId);
080
081 if (resourceAction == null) {
082 long bitwiseValue = 1;
083
084 if (!actionId.equals(ActionKeys.VIEW)) {
085 if (lastBitwiseValue < 0) {
086 ResourceAction lastResourceAction =
087 resourceActionPersistence.fetchByName_First(
088 name,
089 new ResourceActionBitwiseValueComparator());
090
091 if (lastResourceAction != null) {
092 lastBitwiseValue =
093 lastResourceAction.getBitwiseValue();
094 }
095 else {
096 lastBitwiseValue = 1;
097 }
098 }
099
100 lastBitwiseValue = lastBitwiseValue << 1;
101
102 bitwiseValue = lastBitwiseValue;
103 }
104
105 long resourceActionId = counterLocalService.increment(
106 ResourceAction.class.getName());
107
108 resourceAction = resourceActionPersistence.create(
109 resourceActionId);
110
111 resourceAction.setName(name);
112 resourceAction.setActionId(actionId);
113 resourceAction.setBitwiseValue(bitwiseValue);
114
115 resourceActionPersistence.update(resourceAction);
116
117 if (newResourceActions == null) {
118 newResourceActions = new ArrayList<ResourceAction>();
119 }
120
121 newResourceActions.add(resourceAction);
122 }
123
124 _resourceActions.put(key, resourceAction);
125 }
126
127 if (!addDefaultActions || (newResourceActions == null)) {
128 return;
129 }
130
131 List<String> groupDefaultActions =
132 ResourceActionsUtil.getModelResourceGroupDefaultActions(name);
133
134 List<String> guestDefaultActions =
135 ResourceActionsUtil.getModelResourceGuestDefaultActions(name);
136
137 long guestBitwiseValue = 0;
138 long ownerBitwiseValue = 0;
139 long siteMemberBitwiseValue = 0;
140
141 for (ResourceAction resourceAction : newResourceActions) {
142 String actionId = resourceAction.getActionId();
143
144 if (guestDefaultActions.contains(actionId)) {
145 guestBitwiseValue |= resourceAction.getBitwiseValue();
146 }
147
148 ownerBitwiseValue |= resourceAction.getBitwiseValue();
149
150 if (groupDefaultActions.contains(actionId)) {
151 siteMemberBitwiseValue |= resourceAction.getBitwiseValue();
152 }
153 }
154
155 if (guestBitwiseValue > 0) {
156 resourcePermissionLocalService.addResourcePermissions(
157 name, RoleConstants.GUEST, ResourceConstants.SCOPE_INDIVIDUAL,
158 guestBitwiseValue);
159 }
160
161 if (ownerBitwiseValue > 0) {
162 resourcePermissionLocalService.addResourcePermissions(
163 name, RoleConstants.OWNER, ResourceConstants.SCOPE_INDIVIDUAL,
164 ownerBitwiseValue);
165 }
166
167 if (siteMemberBitwiseValue > 0) {
168 resourcePermissionLocalService.addResourcePermissions(
169 name, RoleConstants.SITE_MEMBER,
170 ResourceConstants.SCOPE_INDIVIDUAL, siteMemberBitwiseValue);
171 }
172 }
173
174 @Override
175 @Skip
176 public ResourceAction fetchResourceAction(String name, String actionId) {
177 String key = encodeKey(name, actionId);
178
179 return _resourceActions.get(key);
180 }
181
182 @Override
183 @Skip
184 public ResourceAction getResourceAction(String name, String actionId)
185 throws PortalException {
186
187 String key = encodeKey(name, actionId);
188
189 ResourceAction resourceAction = _resourceActions.get(key);
190
191 if (resourceAction == null) {
192 throw new NoSuchResourceActionException(key);
193 }
194
195 return resourceAction;
196 }
197
198 @Override
199 public List<ResourceAction> getResourceActions(String name) {
200 return resourceActionPersistence.findByName(name);
201 }
202
203 @Override
204 public int getResourceActionsCount(String name) {
205 return resourceActionPersistence.countByName(name);
206 }
207
208 protected String encodeKey(String name, String actionId) {
209 return name.concat(StringPool.POUND).concat(actionId);
210 }
211
212 private static Map<String, ResourceAction> _resourceActions =
213 new ConcurrentHashMap<String, ResourceAction>();
214
215 }