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.v5_1_5;
016    
017    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
018    import com.liferay.portal.kernel.upgrade.UpgradeProcess;
019    import com.liferay.portal.kernel.upgrade.util.UpgradeTable;
020    import com.liferay.portal.kernel.upgrade.util.UpgradeTableFactoryUtil;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portal.upgrade.v5_1_5.util.DLFileEntryTable;
024    import com.liferay.portal.upgrade.v5_1_5.util.DLFileRankTable;
025    import com.liferay.portal.upgrade.v5_1_5.util.DLFileShortcutTable;
026    import com.liferay.portal.upgrade.v5_1_5.util.DLFileVersionTable;
027    import com.liferay.portlet.PortletPreferencesFactoryUtil;
028    
029    import java.sql.Connection;
030    import java.sql.PreparedStatement;
031    import java.sql.ResultSet;
032    
033    import javax.portlet.PortletPreferences;
034    
035    /**
036     * @author Samuel Kong
037     * @author Brian Wing Shun Chan
038     * @author Douglas Wong
039     */
040    public class UpgradeDocumentLibrary extends UpgradeProcess {
041    
042            protected void deletePortletPreferences(long portletPreferencesId)
043                    throws Exception {
044    
045                    runSQL(
046                            "delete from PortletPreferences where portletPreferencesId = " +
047                                    portletPreferencesId);
048            }
049    
050            @Override
051            protected void doUpgrade() throws Exception {
052                    try {
053                            runSQL("alter_column_type DLFileEntry name VARCHAR(255) null");
054                    }
055                    catch (Exception e) {
056    
057                            // DLFileEntry
058    
059                            UpgradeTable upgradeTable = UpgradeTableFactoryUtil.getUpgradeTable(
060                                    DLFileEntryTable.TABLE_NAME, DLFileEntryTable.TABLE_COLUMNS);
061    
062                            upgradeTable.setCreateSQL(DLFileEntryTable.TABLE_SQL_CREATE);
063                            upgradeTable.setIndexesSQL(DLFileEntryTable.TABLE_SQL_ADD_INDEXES);
064    
065                            upgradeTable.updateTable();
066                    }
067    
068                    try {
069                            runSQL("alter_column_type DLFileRank name VARCHAR(255) null");
070                    }
071                    catch (Exception e) {
072    
073                            // DLFileRank
074    
075                            UpgradeTable upgradeTable = UpgradeTableFactoryUtil.getUpgradeTable(
076                                    DLFileRankTable.TABLE_NAME, DLFileRankTable.TABLE_COLUMNS);
077    
078                            upgradeTable.setCreateSQL(DLFileRankTable.TABLE_SQL_CREATE);
079                            upgradeTable.setIndexesSQL(DLFileRankTable.TABLE_SQL_ADD_INDEXES);
080    
081                            upgradeTable.updateTable();
082                    }
083    
084                    try {
085                            runSQL("alter_column_type DLFileShortcut toName VARCHAR(255) null");
086                    }
087                    catch (Exception e) {
088    
089                            // DLFileShortcut
090    
091                            UpgradeTable upgradeTable = UpgradeTableFactoryUtil.getUpgradeTable(
092                                    DLFileShortcutTable.TABLE_NAME,
093                                    DLFileShortcutTable.TABLE_COLUMNS);
094    
095                            upgradeTable.setCreateSQL(DLFileShortcutTable.TABLE_SQL_CREATE);
096                            upgradeTable.setIndexesSQL(
097                                    DLFileShortcutTable.TABLE_SQL_ADD_INDEXES);
098    
099                            upgradeTable.updateTable();
100                    }
101    
102                    try {
103                            runSQL("alter_column_type DLFileVersion name VARCHAR(255) null");
104                    }
105                    catch (Exception e) {
106    
107                            // DLFileVersion
108    
109                            UpgradeTable upgradeTable = UpgradeTableFactoryUtil.getUpgradeTable(
110                                    DLFileVersionTable.TABLE_NAME,
111                                    DLFileVersionTable.TABLE_COLUMNS);
112    
113                            upgradeTable.setCreateSQL(DLFileVersionTable.TABLE_SQL_CREATE);
114                            upgradeTable.setIndexesSQL(
115                                    DLFileVersionTable.TABLE_SQL_ADD_INDEXES);
116    
117                            upgradeTable.updateTable();
118                    }
119    
120                    // groupId
121    
122                    updateGroupId();
123    
124                    // PortletPreferences
125    
126                    updatePortletPreferences();
127            }
128    
129            protected Object[] getLayout(long plid) throws Exception {
130                    Object[] layout = null;
131    
132                    Connection con = null;
133                    PreparedStatement ps = null;
134                    ResultSet rs = null;
135    
136                    try {
137                            con = DataAccess.getUpgradeOptimizedConnection();
138    
139                            ps = con.prepareStatement(_GET_LAYOUT);
140    
141                            ps.setLong(1, plid);
142    
143                            rs = ps.executeQuery();
144    
145                            while (rs.next()) {
146                                    long companyId = rs.getLong("companyId");
147    
148                                    layout = new Object[] {companyId};
149                            }
150                    }
151                    finally {
152                            DataAccess.cleanUp(con, ps, rs);
153                    }
154    
155                    return layout;
156            }
157    
158            protected void updateGroupId() throws Exception {
159                    StringBuilder sb = new StringBuilder();
160    
161                    sb.append("update DLFileEntry set groupId = (select groupId from ");
162                    sb.append("DLFolder where DLFolder.folderId = DLFileEntry.folderId)");
163    
164                    runSQL(sb.toString());
165    
166                    sb = new StringBuilder();
167    
168                    sb.append("update DLFileRank set groupId = (select groupId from ");
169                    sb.append("DLFolder where DLFolder.folderId = DLFileRank.folderId)");
170    
171                    runSQL(sb.toString());
172    
173                    sb = new StringBuilder();
174    
175                    sb.append("update DLFileShortcut set groupId = (select groupId from ");
176                    sb.append("DLFolder where DLFolder.folderId = ");
177                    sb.append("DLFileShortcut.folderId)");
178    
179                    runSQL(sb.toString());
180    
181                    sb = new StringBuilder();
182    
183                    sb.append("update DLFileVersion set groupId = (select groupId from ");
184                    sb.append("DLFolder where DLFolder.folderId = DLFileVersion.folderId)");
185    
186                    runSQL(sb.toString());
187            }
188    
189            protected void updatePortletPreferences() throws Exception {
190                    Connection con = null;
191                    PreparedStatement ps = null;
192                    ResultSet rs = null;
193    
194                    try {
195                            con = DataAccess.getUpgradeOptimizedConnection();
196    
197                            ps = con.prepareStatement(
198                                    "select portletPreferencesId, ownerId, ownerType, plid, " +
199                                            "portletId, preferences from PortletPreferences where " +
200                                                    "portletId = '20' and preferences like " +
201                                                            "'%<name>fileEntryColumns</name><value></value>%'");
202    
203                            rs = ps.executeQuery();
204    
205                            while (rs.next()) {
206                                    long portletPreferencesId = rs.getLong("portletPreferencesId");
207                                    long ownerId = rs.getLong("ownerId");
208                                    int ownerType = rs.getInt("ownerType");
209                                    long plid = rs.getLong("plid");
210                                    String portletId = rs.getString("portletId");
211                                    String preferences = rs.getString("preferences");
212    
213                                    Object[] layout = getLayout(plid);
214    
215                                    if (layout != null) {
216                                            long companyId = (Long)layout[0];
217    
218                                            String newPreferences = upgradePreferences(
219                                                    companyId, ownerId, ownerType, plid, portletId,
220                                                    preferences);
221    
222                                            updatePortletPreferences(
223                                                    portletPreferencesId, newPreferences);
224                                    }
225                                    else {
226                                            deletePortletPreferences(portletPreferencesId);
227                                    }
228                            }
229                    }
230                    finally {
231                            DataAccess.cleanUp(con, ps, rs);
232                    }
233            }
234    
235            protected void updatePortletPreferences(
236                            long portletPreferencesId, String preferences)
237                    throws Exception {
238    
239                    Connection con = null;
240                    PreparedStatement ps = null;
241    
242                    try {
243                            con = DataAccess.getUpgradeOptimizedConnection();
244    
245                            ps = con.prepareStatement(
246                                    "update PortletPreferences set preferences = ? where " +
247                                            "portletPreferencesId = " + portletPreferencesId);
248    
249                            ps.setString(1, preferences);
250    
251                            ps.executeUpdate();
252                    }
253                    finally {
254                            DataAccess.cleanUp(con, ps);
255                    }
256            }
257    
258            protected String upgradePreferences(
259                            long companyId, long ownerId, int ownerType, long plid,
260                            String portletId, String xml)
261                    throws Exception {
262    
263                    PortletPreferences portletPreferences =
264                            PortletPreferencesFactoryUtil.fromXML(
265                                    companyId, ownerId, ownerType, plid, portletId, xml);
266    
267                    String fileEntryColumns = portletPreferences.getValue(
268                            "fileEntryColumns", StringPool.BLANK);
269    
270                    if (Validator.isNull(fileEntryColumns)) {
271                            portletPreferences.reset("fileEntryColumns");
272                    }
273    
274                    return PortletPreferencesFactoryUtil.toXML(portletPreferences);
275            }
276    
277            private static final String _GET_LAYOUT =
278                    "select companyId from Layout where plid = ?";
279    
280    }