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.spring.aop.Skip;
021 import com.liferay.portal.kernel.transaction.Propagation;
022 import com.liferay.portal.kernel.transaction.Transactional;
023 import com.liferay.portal.kernel.util.StringPool;
024 import com.liferay.portal.model.ResourceAction;
025 import com.liferay.portal.model.ResourceConstants;
026 import com.liferay.portal.model.RoleConstants;
027 import com.liferay.portal.security.permission.ActionKeys;
028 import com.liferay.portal.security.permission.ResourceActionsUtil;
029 import com.liferay.portal.service.base.ResourceActionLocalServiceBaseImpl;
030 import com.liferay.portal.util.comparator.ResourceActionBitwiseValueComparator;
031
032 import java.util.ArrayList;
033 import java.util.List;
034 import java.util.Map;
035 import java.util.concurrent.ConcurrentHashMap;
036
037
041 public class ResourceActionLocalServiceImpl
042 extends ResourceActionLocalServiceBaseImpl {
043
044 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
045 public void checkResourceActions() throws SystemException {
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 public void checkResourceActions(String name, List<String> actionIds)
058 throws SystemException {
059
060 checkResourceActions(name, actionIds, false);
061 }
062
063 public void checkResourceActions(
064 String name, List<String> actionIds, boolean addDefaultActions)
065 throws SystemException {
066
067 long lastBitwiseValue = -1;
068 List<ResourceAction> newResourceActions = null;
069
070 for (String actionId : actionIds) {
071 String key = encodeKey(name, actionId);
072
073 ResourceAction resourceAction = _resourceActions.get(key);
074
075 if (resourceAction != null) {
076 continue;
077 }
078
079 resourceAction = resourceActionPersistence.fetchByN_A(
080 name, actionId);
081
082 if (resourceAction == null) {
083 long bitwiseValue = 1;
084
085 if (!actionId.equals(ActionKeys.VIEW)) {
086 if (lastBitwiseValue < 0) {
087 ResourceAction lastResourceAction =
088 resourceActionPersistence.fetchByName_First(
089 name,
090 new ResourceActionBitwiseValueComparator());
091
092 if (lastResourceAction != null) {
093 lastBitwiseValue =
094 lastResourceAction.getBitwiseValue();
095 }
096 else {
097 lastBitwiseValue = 1;
098 }
099 }
100
101 lastBitwiseValue = lastBitwiseValue << 1;
102
103 bitwiseValue = lastBitwiseValue;
104 }
105
106 long resourceActionId = counterLocalService.increment(
107 ResourceAction.class.getName());
108
109 resourceAction = resourceActionPersistence.create(
110 resourceActionId);
111
112 resourceAction.setName(name);
113 resourceAction.setActionId(actionId);
114 resourceAction.setBitwiseValue(bitwiseValue);
115
116 resourceActionPersistence.update(resourceAction);
117
118 if (newResourceActions == null) {
119 newResourceActions = new ArrayList<ResourceAction>();
120 }
121
122 newResourceActions.add(resourceAction);
123 }
124
125 _resourceActions.put(key, resourceAction);
126 }
127
128 if (addDefaultActions && (newResourceActions != null)) {
129 List<String> groupDefaultActions =
130 ResourceActionsUtil.getModelResourceGroupDefaultActions(name);
131
132 List<String> guestDefaultActions =
133 ResourceActionsUtil.getModelResourceGuestDefaultActions(name);
134
135 long guestBitwiseValue = 0;
136 long ownerBitwiseValue = 0;
137 long siteMemberBitwiseValue = 0;
138
139 for (ResourceAction resourceAction : newResourceActions) {
140 String actionId = resourceAction.getActionId();
141
142 if (guestDefaultActions.contains(actionId)) {
143 guestBitwiseValue |= resourceAction.getBitwiseValue();
144 }
145
146 ownerBitwiseValue |= resourceAction.getBitwiseValue();
147
148 if (groupDefaultActions.contains(actionId)) {
149 siteMemberBitwiseValue |= resourceAction.getBitwiseValue();
150 }
151 }
152
153 if (guestBitwiseValue > 0) {
154 resourcePermissionLocalService.addResourcePermissions(
155 name, RoleConstants.GUEST,
156 ResourceConstants.SCOPE_INDIVIDUAL, guestBitwiseValue);
157 }
158
159 if (ownerBitwiseValue > 0) {
160 resourcePermissionLocalService.addResourcePermissions(
161 name, RoleConstants.OWNER,
162 ResourceConstants.SCOPE_INDIVIDUAL, ownerBitwiseValue);
163 }
164
165 if (siteMemberBitwiseValue > 0) {
166 resourcePermissionLocalService.addResourcePermissions(
167 name, RoleConstants.SITE_MEMBER,
168 ResourceConstants.SCOPE_INDIVIDUAL, siteMemberBitwiseValue);
169 }
170 }
171 }
172
173 @Skip
174 public ResourceAction fetchResourceAction(String name, String actionId) {
175 String key = encodeKey(name, actionId);
176
177 return _resourceActions.get(key);
178 }
179
180 @Skip
181 public ResourceAction getResourceAction(String name, String actionId)
182 throws PortalException {
183
184 String key = encodeKey(name, actionId);
185
186 ResourceAction resourceAction = _resourceActions.get(key);
187
188 if (resourceAction == null) {
189 throw new NoSuchResourceActionException(key);
190 }
191
192 return resourceAction;
193 }
194
195 public List<ResourceAction> getResourceActions(String name)
196 throws SystemException {
197
198 return resourceActionPersistence.findByName(name);
199 }
200
201 protected String encodeKey(String name, String actionId) {
202 return name.concat(StringPool.POUND).concat(actionId);
203 }
204
205 private static Map<String, ResourceAction> _resourceActions =
206 new ConcurrentHashMap<String, ResourceAction>();
207
208 }