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