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.upgrade.v6_0_12_to_6_1_0;
016    
017    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
022    import com.liferay.portal.kernel.upgrade.UpgradeProcess;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.model.GroupedModel;
025    import com.liferay.portal.model.PermissionedModel;
026    import com.liferay.portal.model.ResourceBlock;
027    import com.liferay.portal.model.ResourceBlockPermissionsContainer;
028    import com.liferay.portal.model.ResourceConstants;
029    import com.liferay.portal.model.ResourcePermission;
030    import com.liferay.portal.service.ResourceBlockLocalServiceUtil;
031    import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
032    import com.liferay.portal.util.PropsValues;
033    import com.liferay.portlet.bookmarks.model.BookmarksEntry;
034    import com.liferay.portlet.bookmarks.model.BookmarksFolder;
035    
036    import java.sql.Connection;
037    import java.sql.PreparedStatement;
038    import java.sql.ResultSet;
039    
040    import java.util.List;
041    
042    /**
043     * @author Alexander Chow
044     * @author Connor McKay
045     */
046    public class UpgradePermission extends UpgradeProcess {
047    
048            protected ResourceBlock convertResourcePermissions(
049                            long companyId, String name, long primKey)
050                    throws PortalException, SystemException {
051    
052                    PermissionedModel permissionedModel =
053                            ResourceBlockLocalServiceUtil.getPermissionedModel(name, primKey);
054    
055                    long groupId = 0;
056    
057                    if (permissionedModel instanceof GroupedModel) {
058                            GroupedModel groupedModel = (GroupedModel)permissionedModel;
059    
060                            groupId = groupedModel.getGroupId();
061                    }
062    
063                    ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
064                            getResourceBlockPermissionsContainer(
065                                    companyId, groupId, name, primKey);
066    
067                    String permissionsHash =
068                            resourceBlockPermissionsContainer.getPermissionsHash();
069    
070                    ResourceBlock resourceBlock =
071                            ResourceBlockLocalServiceUtil.updateResourceBlockId(
072                                    companyId, groupId, name, permissionedModel, permissionsHash,
073                                    resourceBlockPermissionsContainer);
074    
075                    return resourceBlock;
076            }
077    
078            protected void convertResourcePermissions(
079                            String name, String tableName, String pkColumnName)
080                    throws Exception {
081    
082                    Connection con = null;
083                    PreparedStatement ps = null;
084                    ResultSet rs = null;
085    
086                    try {
087                            con = DataAccess.getUpgradeOptimizedConnection();
088    
089                            ps = con.prepareStatement(
090                                    "select " + pkColumnName + ", companyId from " + tableName);
091    
092                            rs = ps.executeQuery();
093    
094                            while (rs.next()) {
095                                    long primKey = rs.getLong(pkColumnName);
096                                    long companyId = rs.getLong("companyId");
097    
098                                    ResourceBlock resourceBlock = convertResourcePermissions(
099                                            companyId, name, primKey);
100    
101                                    if (_log.isInfoEnabled() &&
102                                            ((resourceBlock.getResourceBlockId() % 100) == 0)) {
103    
104                                            _log.info("Processed 100 resource blocks for " + name);
105                                    }
106                            }
107                    }
108                    finally {
109                            DataAccess.cleanUp(con, ps, rs);
110                    }
111    
112                    List<ResourcePermission> resourcePermissions =
113                            ResourcePermissionLocalServiceUtil.getScopeResourcePermissions(
114                                    _SCOPES);
115    
116                    for (ResourcePermission resourcePermission : resourcePermissions) {
117                            int scope = resourcePermission.getScope();
118    
119                            if (!name.equals(resourcePermission.getName())) {
120                                    continue;
121                            }
122    
123                            if ((scope == ResourceConstants.SCOPE_COMPANY) ||
124                                    (scope == ResourceConstants.SCOPE_GROUP_TEMPLATE)) {
125    
126                                    ResourceBlockLocalServiceUtil.setCompanyScopePermissions(
127                                            resourcePermission.getCompanyId(), name,
128                                            resourcePermission.getRoleId(),
129                                            resourcePermission.getActionIds());
130                            }
131                            else if (scope == ResourceConstants.SCOPE_GROUP) {
132                                    ResourceBlockLocalServiceUtil.setGroupScopePermissions(
133                                            resourcePermission.getCompanyId(),
134                                            GetterUtil.getLong(resourcePermission.getPrimaryKey()),
135                                            name, resourcePermission.getRoleId(),
136                                            resourcePermission.getActionIds());
137                            }
138                    }
139            }
140    
141            @Override
142            protected void doUpgrade() throws Exception {
143                    if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) {
144                            convertResourcePermissions(
145                                    BookmarksEntry.class.getName(), "BookmarksEntry", "entryId");
146                            convertResourcePermissions(
147                                    BookmarksFolder.class.getName(), "BookmarksFolder", "folderId");
148                    }
149            }
150    
151            protected ResourceBlockPermissionsContainer
152                            getResourceBlockPermissionsContainer(
153                                    long companyId, long groupId, String name, long primKey)
154                    throws SystemException {
155    
156                    ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
157                            new ResourceBlockPermissionsContainer();
158    
159                    List<ResourcePermission> resourcePermissions =
160                            ResourcePermissionLocalServiceUtil.getResourceResourcePermissions(
161                                    companyId, groupId, name, String.valueOf(primKey));
162    
163                    for (ResourcePermission resourcePermission : resourcePermissions) {
164                            resourceBlockPermissionContainer.addPermission(
165                                    resourcePermission.getRoleId(),
166                                    resourcePermission.getActionIds());
167                    }
168    
169                    return resourceBlockPermissionContainer;
170            }
171    
172            private static final int[] _SCOPES = {
173                    ResourceConstants.SCOPE_COMPANY, ResourceConstants.SCOPE_GROUP,
174                    ResourceConstants.SCOPE_GROUP_TEMPLATE
175            };
176    
177            private static Log _log = LogFactoryUtil.getLog(UpgradePermission.class);
178    
179    }