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