001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
038     * @author Brian Wing Shun Chan
039     * @author Shuyang Zhou
040     */
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    }