/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.upgrade.v7_0_0; import com.liferay.portal.kernel.dao.db.DB; import com.liferay.portal.kernel.dao.db.DBManagerUtil; import com.liferay.portal.kernel.dao.db.DBType; import com.liferay.portal.kernel.dao.jdbc.AutoBatchPreparedStatementUtil; import com.liferay.portal.kernel.dao.orm.WildcardMode; import com.liferay.portal.kernel.upgrade.UpgradeException; import com.liferay.portal.kernel.upgrade.UpgradeProcess; import com.liferay.portal.kernel.util.LoggingTimer; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @author Preston Crary */ public class UpgradeKernelPackage extends UpgradeProcess { @Override protected void doUpgrade() throws UpgradeException { try { upgradeTable( "Counter", "name", getClassNames(), WildcardMode.SURROUND); upgradeTable( "ClassName_", "value", getClassNames(), WildcardMode.SURROUND); upgradeTable( "Lock_", "className", getClassNames(), WildcardMode.SURROUND); upgradeTable( "ResourceAction", "name", getClassNames(), WildcardMode.SURROUND); upgradeTable( "ResourceBlock", "name", getClassNames(), WildcardMode.SURROUND); upgradeTable( "ResourcePermission", "name", getClassNames(), WildcardMode.SURROUND); upgradeLongTextTable( "UserNotificationEvent", "payload", getClassNames(), WildcardMode.SURROUND); upgradeTable( "ListType", "type_", getClassNames(), WildcardMode.TRAILING); upgradeTable( "ResourceAction", "name", getResourceNames(), WildcardMode.LEADING); upgradeTable( "ResourceBlock", "name", getResourceNames(), WildcardMode.LEADING); upgradeTable( "ResourcePermission", "name", getResourceNames(), WildcardMode.LEADING); upgradeLongTextTable( "UserNotificationEvent", "payload", getResourceNames(), WildcardMode.LEADING); } catch (Exception e) { throw new UpgradeException(e); } } protected String[][] getClassNames() { return _CLASS_NAMES; } protected String[][] getResourceNames() { return _RESOURCE_NAMES; } protected void upgradeLongTextTable( String columnName, String selectSQL, String updateSQL, String[] name) throws SQLException { try (PreparedStatement ps1 = connection.prepareStatement(selectSQL); ResultSet rs = ps1.executeQuery(); PreparedStatement ps2 = AutoBatchPreparedStatementUtil.autoBatch( connection.prepareStatement(updateSQL))) { while (rs.next()) { String oldValue = rs.getString(columnName); String newValue = StringUtil.replace( oldValue, name[0], name[1]); ps2.setString(1, newValue); ps2.setString(2, oldValue); ps2.addBatch(); } ps2.executeBatch(); } } protected void upgradeLongTextTable( String tableName, String columnName, String[][] names, WildcardMode wildcardMode) throws Exception { DB db = DBManagerUtil.getDB(); if (db.getDBType() != DBType.SYBASE) { upgradeTable(tableName, columnName, names, wildcardMode); return; } try (LoggingTimer loggingTimer = new LoggingTimer(tableName)) { StringBundler updateSB = new StringBundler(7); updateSB.append("update "); updateSB.append(tableName); updateSB.append(" set "); updateSB.append(columnName); updateSB.append(" = ? where "); updateSB.append(columnName); updateSB.append(" = ?"); String updateSQL = updateSB.toString(); StringBundler selectPrefixSB = new StringBundler(7); selectPrefixSB.append("select "); selectPrefixSB.append(columnName); selectPrefixSB.append(" from "); selectPrefixSB.append(tableName); selectPrefixSB.append(" where "); selectPrefixSB.append(columnName); if (wildcardMode.equals(WildcardMode.LEADING) || wildcardMode.equals(WildcardMode.SURROUND)) { selectPrefixSB.append(" like '%"); } else { selectPrefixSB.append(" like '"); } String selectPrefix = selectPrefixSB.toString(); String selectPostfix = StringPool.APOSTROPHE; if (wildcardMode.equals(WildcardMode.SURROUND) || wildcardMode.equals(WildcardMode.TRAILING)) { selectPostfix = "%'"; } for (String[] name : names) { String selectSQL = selectPrefix.concat(name[0]).concat( selectPostfix); upgradeLongTextTable(columnName, selectSQL, updateSQL, name); } } } protected void upgradeTable( String tableName, String columnName, String[][] names, WildcardMode wildcardMode) throws Exception { try (LoggingTimer loggingTimer = new LoggingTimer(tableName)) { StringBundler sb1 = new StringBundler(7); sb1.append("update "); sb1.append(tableName); sb1.append(" set "); sb1.append(columnName); sb1.append(" = replace("); sb1.append(_transformColumnName(columnName)); sb1.append(", '"); String tableSQL = sb1.toString(); StringBundler sb2 = new StringBundler(9); for (String[] name : names) { sb2.append(tableSQL); sb2.append(name[0]); sb2.append("', '"); sb2.append(name[1]); sb2.append("') where "); sb2.append(columnName); if (wildcardMode.equals(WildcardMode.LEADING) || wildcardMode.equals(WildcardMode.SURROUND)) { sb2.append(" like '%"); } else { sb2.append(" like '"); } sb2.append(name[0]); if (wildcardMode.equals(WildcardMode.SURROUND) || wildcardMode.equals(WildcardMode.TRAILING)) { sb2.append("%'"); } else { sb2.append("'"); } runSQL(sb2.toString()); sb2.setIndex(0); } } } private String _transformColumnName(String columnName) { DB db = DBManagerUtil.getDB(); if (db.getDBType() == DBType.SQLSERVER) { return "CAST_TEXT(" + columnName + ")"; } return columnName; } private static final String[][] _CLASS_NAMES = new String[][] { { "com.liferay.counter.model.Counter", "com.liferay.counter.kernel.model.Counter" }, { "com.liferay.portal.kernel.mail.Account", "com.liferay.mail.kernel.model.Account" }, { "com.liferay.portal.model.BackgroundTask", "com.liferay.portal.background.task.model.BackgroundTask" }, { "com.liferay.portal.model.Lock", "com.liferay.portal.lock.model.Lock" }, {"com.liferay.portal.model.", "com.liferay.portal.kernel.model."}, { "com.liferay.portlet.announcements.model.", "com.liferay.announcements.kernel.model." }, { "com.liferay.portlet.asset.model.", "com.liferay.asset.kernel.model." }, { "com.liferay.portlet.blogs.model.", "com.liferay.blogs.kernel.model." }, { "com.liferay.portlet.documentlibrary.model.", "com.liferay.document.library.kernel.model." }, { "com.liferay.portlet.documentlibrary.util.", "com.liferay.document.library.kernel.util." }, { "com.liferay.portlet.expando.model.", "com.liferay.expando.kernel.model." }, { "com.liferay.portlet.messageboards.model.", "com.liferay.message.boards.kernel.model." }, { "com.liferay.portlet.mobiledevicerules.model.", "com.liferay.mobile.device.rules.model." }, { "com.liferay.portlet.ratings.model.", "com.liferay.ratings.kernel.model." }, { "com.liferay.portlet.social.model.", "com.liferay.social.kernel.model." }, { "com.liferay.portlet.trash.model.", "com.liferay.trash.kernel.model." }, { "com.liferay.socialnetworking.model.", "com.liferay.social.networking.model." } }; private static final String[][] _RESOURCE_NAMES = new String[][] { {"com.liferay.portlet.asset", "com.liferay.asset"}, {"com.liferay.portlet.blogs", "com.liferay.blogs"}, { "com.liferay.portlet.documentlibrary", "com.liferay.document.library" }, {"com.liferay.portlet.messageboards", "com.liferay.message.boards"} }; }