001    /**
002     * Copyright (c) 2000-present 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.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    /**
037     * @author Brian Wing Shun Chan
038     * @author Shuyang Zhou
039     */
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    }