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