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.upgrade.v7_0_0;
016    
017    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.settings.SettingsDescriptor;
021    import com.liferay.portal.kernel.settings.SettingsFactory;
022    import com.liferay.portal.kernel.settings.SettingsFactoryUtil;
023    import com.liferay.portal.kernel.upgrade.UpgradeProcess;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.upgrade.v7_0_0.util.PortletPreferencesRow;
026    import com.liferay.portal.util.PortletKeys;
027    import com.liferay.portlet.PortletPreferencesFactoryUtil;
028    import com.liferay.portlet.blogs.util.BlogsConstants;
029    import com.liferay.portlet.documentlibrary.util.DLConstants;
030    import com.liferay.portlet.messageboards.util.MBConstants;
031    import com.liferay.portlet.shopping.util.ShoppingConstants;
032    
033    import java.sql.Connection;
034    import java.sql.PreparedStatement;
035    import java.sql.ResultSet;
036    
037    import java.util.Enumeration;
038    
039    /**
040     * @author Sergio Gonz??lez
041     * @author Iv??n Zaera
042     */
043    public class UpgradePortletSettings extends UpgradeProcess {
044    
045            public UpgradePortletSettings() {
046                    _settingsFactory = SettingsFactoryUtil.getSettingsFactory();
047            }
048    
049            public UpgradePortletSettings(SettingsFactory settingsFactory) {
050                    _settingsFactory = settingsFactory;
051            }
052    
053            protected void addPortletPreferences(
054                            PortletPreferencesRow portletPreferencesRow)
055                    throws Exception {
056    
057                    Connection con = null;
058                    PreparedStatement ps = null;
059    
060                    try {
061                            con = DataAccess.getUpgradeOptimizedConnection();
062    
063                            ps = con.prepareStatement(
064                                    "insert into PortletPreferences (mvccVersion, " +
065                                            "portletPreferencesId, ownerId, ownerType, plid, " +
066                                                    "portletId, preferences) values (?, ?, ?, ?, ?, ?, ?)");
067    
068                            ps.setLong(1, portletPreferencesRow.getMvccVersion());
069                            ps.setLong(2, portletPreferencesRow.getPortletPreferencesId());
070                            ps.setLong(3, portletPreferencesRow.getOwnerId());
071                            ps.setInt(4, portletPreferencesRow.getOwnerType());
072                            ps.setLong(5, portletPreferencesRow.getPlid());
073                            ps.setString(6, portletPreferencesRow.getPortletId());
074                            ps.setString(7, portletPreferencesRow.getPreferences());
075    
076                            ps.executeUpdate();
077                    }
078                    finally {
079                            DataAccess.cleanUp(con, ps);
080                    }
081            }
082    
083            protected void copyPortletSettingsAsServiceSettings(
084                            String portletId, int ownerType, String serviceName)
085                    throws Exception {
086    
087                    if (_log.isDebugEnabled()) {
088                            _log.debug("Copy portlet settings as service settings");
089                    }
090    
091                    ResultSet rs = null;
092    
093                    try {
094                            rs = getPortletPreferencesResultSet(portletId, ownerType);
095    
096                            while (rs.next()) {
097                                    PortletPreferencesRow portletPreferencesRow =
098                                            getPortletPreferencesRow(rs);
099    
100                                    portletPreferencesRow.setPortletPreferencesId(increment());
101                                    portletPreferencesRow.setOwnerType(
102                                            PortletKeys.PREFS_OWNER_TYPE_GROUP);
103                                    portletPreferencesRow.setPortletId(serviceName);
104    
105                                    if (ownerType == PortletKeys.PREFS_OWNER_TYPE_LAYOUT) {
106                                            long plid = portletPreferencesRow.getPlid();
107    
108                                            long groupId = getGroupId(plid);
109    
110                                            portletPreferencesRow.setOwnerId(groupId);
111                                            portletPreferencesRow.setPlid(0);
112    
113                                            if (_log.isInfoEnabled()) {
114                                                    StringBundler sb = new StringBundler(8);
115    
116                                                    sb.append("Copying portlet ");
117                                                    sb.append(portletId);
118                                                    sb.append(" settings from layout ");
119                                                    sb.append(plid);
120                                                    sb.append(" to service ");
121                                                    sb.append(serviceName);
122                                                    sb.append(" in group ");
123                                                    sb.append(groupId);
124    
125                                                    _log.info(sb.toString());
126                                            }
127                                    }
128    
129                                    addPortletPreferences(portletPreferencesRow);
130                            }
131                    }
132                    finally {
133                            DataAccess.deepCleanUp(rs);
134                    }
135            }
136    
137            @Override
138            protected void doUpgrade() throws Exception {
139    
140                    // Main portlets
141    
142                    upgradeMainPortlet(
143                            PortletKeys.BLOGS, BlogsConstants.SERVICE_NAME,
144                            PortletKeys.PREFS_OWNER_TYPE_GROUP, true);
145                    upgradeMainPortlet(
146                            PortletKeys.DOCUMENT_LIBRARY, DLConstants.SERVICE_NAME,
147                            PortletKeys.PREFS_OWNER_TYPE_GROUP, true);
148                    upgradeMainPortlet(
149                            PortletKeys.MESSAGE_BOARDS, MBConstants.SERVICE_NAME,
150                            PortletKeys.PREFS_OWNER_TYPE_GROUP, false);
151                    upgradeMainPortlet(
152                            PortletKeys.SHOPPING, ShoppingConstants.SERVICE_NAME,
153                            PortletKeys.PREFS_OWNER_TYPE_GROUP, false);
154    
155                    // Display portlets
156    
157                    upgradeDisplayPortlet(
158                            PortletKeys.DOCUMENT_LIBRARY_DISPLAY, DLConstants.SERVICE_NAME,
159                            PortletKeys.PREFS_OWNER_TYPE_LAYOUT);
160                    upgradeDisplayPortlet(
161                            PortletKeys.MEDIA_GALLERY_DISPLAY, DLConstants.SERVICE_NAME,
162                            PortletKeys.PREFS_OWNER_TYPE_LAYOUT);
163            }
164    
165            protected long getGroupId(long plid) throws Exception {
166                    Connection con = null;
167                    PreparedStatement ps = null;
168                    ResultSet rs = null;
169    
170                    long groupId = 0;
171    
172                    try {
173                            con = DataAccess.getUpgradeOptimizedConnection();
174    
175                            ps = con.prepareStatement(
176                                    "select groupId from Layout where plid = ?");
177    
178                            ps.setLong(1, plid);
179    
180                            rs = ps.executeQuery();
181    
182                            if (rs.next()) {
183                                    groupId = rs.getLong("groupId");
184                            }
185                    }
186                    finally {
187                            DataAccess.cleanUp(con, ps, rs);
188                    }
189    
190                    return groupId;
191            }
192    
193            protected ResultSet getPortletPreferencesResultSet(
194                            String portletId, int ownerType)
195                    throws Exception {
196    
197                    Connection con = DataAccess.getUpgradeOptimizedConnection();
198    
199                    PreparedStatement ps = con.prepareStatement(
200                            "select portletPreferencesId, ownerId, ownerType, plid, " +
201                                    "portletId, preferences from PortletPreferences where " +
202                                            "ownerType = ? and portletId = ?");
203    
204                    ps.setInt(1, ownerType);
205                    ps.setString(2, portletId);
206    
207                    return ps.executeQuery();
208            }
209    
210            protected void resetPortletPreferencesValues(
211                            String portletId, int ownerType,
212                            SettingsDescriptor settingsDescriptor)
213                    throws Exception {
214    
215                    ResultSet rs = null;
216    
217                    try {
218                            rs = getPortletPreferencesResultSet(portletId, ownerType);
219    
220                            while (rs.next()) {
221                                    PortletPreferencesRow portletPreferencesRow =
222                                            getPortletPreferencesRow(rs);
223    
224                                    javax.portlet.PortletPreferences jxPortletPreferences =
225                                            PortletPreferencesFactoryUtil.fromDefaultXML(
226                                                    portletPreferencesRow.getPreferences());
227    
228                                    Enumeration<String> names = jxPortletPreferences.getNames();
229    
230                                    while (names.hasMoreElements()) {
231                                            String name = names.nextElement();
232    
233                                            for (String key : settingsDescriptor.getAllKeys()) {
234                                                    if (name.startsWith(key)) {
235                                                            jxPortletPreferences.reset(key);
236    
237                                                            break;
238                                                    }
239                                            }
240                                    }
241    
242                                    portletPreferencesRow.setPreferences(
243                                            PortletPreferencesFactoryUtil.toXML(jxPortletPreferences));
244    
245                                    updatePortletPreferences(portletPreferencesRow);
246                            }
247                    }
248                    finally {
249                            DataAccess.deepCleanUp(rs);
250                    }
251            }
252    
253            protected void updatePortletPreferences(
254                            PortletPreferencesRow portletPreferencesRow)
255                    throws Exception {
256    
257                    Connection con = null;
258                    PreparedStatement ps = null;
259    
260                    try {
261                            con = DataAccess.getUpgradeOptimizedConnection();
262    
263                            ps = con.prepareStatement(
264                                    "update PortletPreferences set mvccVersion = ?, ownerId = ?, " +
265                                            "ownerType = ?, plid = ?, portletId = ?, preferences = ? " +
266                                                    "where portletPreferencesId = ?");
267    
268                            ps.setLong(1, portletPreferencesRow.getMvccVersion());
269                            ps.setLong(2, portletPreferencesRow.getOwnerId());
270                            ps.setInt(3, portletPreferencesRow.getOwnerType());
271                            ps.setLong(4, portletPreferencesRow.getPlid());
272                            ps.setString(5, portletPreferencesRow.getPortletId());
273                            ps.setString(6, portletPreferencesRow.getPreferences());
274                            ps.setLong(7, portletPreferencesRow.getPortletPreferencesId());
275    
276                            ps.executeUpdate();
277                    }
278                    finally {
279                            DataAccess.cleanUp(con, ps);
280                    }
281            }
282    
283            protected void upgradeDisplayPortlet(
284                            String portletId, String serviceName, int ownerType)
285                    throws Exception {
286    
287                    if (_log.isDebugEnabled()) {
288                            _log.debug("Upgrading display portlet " + portletId + " settings");
289                    }
290    
291                    if (_log.isDebugEnabled()) {
292                            _log.debug("Delete service keys from portlet settings");
293                    }
294    
295                    SettingsDescriptor settingsDescriptor =
296                            _settingsFactory.getSettingsDescriptor(serviceName);
297    
298                    resetPortletPreferencesValues(portletId, ownerType, settingsDescriptor);
299    
300                    resetPortletPreferencesValues(
301                            portletId, PortletKeys.PREFS_OWNER_TYPE_ARCHIVED,
302                            settingsDescriptor);
303            }
304    
305            protected void upgradeMainPortlet(
306                            String portletId, String serviceName, int ownerType,
307                            boolean resetPortletInstancePreferences)
308                    throws Exception {
309    
310                    if (_log.isDebugEnabled()) {
311                            _log.debug("Upgrading main portlet " + portletId + " settings");
312                    }
313    
314                    copyPortletSettingsAsServiceSettings(portletId, ownerType, serviceName);
315    
316                    if (resetPortletInstancePreferences) {
317                            SettingsDescriptor portletInstanceSettingsDescriptor =
318                                    _settingsFactory.getSettingsDescriptor(portletId);
319    
320                            if (_log.isDebugEnabled()) {
321                                    _log.debug(
322                                            "Delete portlet instance keys from service settings");
323                            }
324    
325                            resetPortletPreferencesValues(
326                                    serviceName, PortletKeys.PREFS_OWNER_TYPE_GROUP,
327                                    portletInstanceSettingsDescriptor);
328                    }
329    
330                    if (_log.isDebugEnabled()) {
331                            _log.debug("Delete service keys from portlet settings");
332                    }
333    
334                    SettingsDescriptor serviceSettingsDescriptor =
335                            _settingsFactory.getSettingsDescriptor(serviceName);
336    
337                    resetPortletPreferencesValues(
338                            portletId, ownerType, serviceSettingsDescriptor);
339    
340                    resetPortletPreferencesValues(
341                            portletId, PortletKeys.PREFS_OWNER_TYPE_ARCHIVED,
342                            serviceSettingsDescriptor);
343            }
344    
345            private PortletPreferencesRow getPortletPreferencesRow(ResultSet rs)
346                    throws Exception {
347    
348                    return new PortletPreferencesRow(
349                            rs.getLong("portletPreferencesId"), rs.getLong("ownerId"),
350                            rs.getInt("ownerType"), rs.getLong("plid"),
351                            rs.getString("portletId"), rs.getString("preferences"));
352            }
353    
354            private static final Log _log = LogFactoryUtil.getLog(
355                    UpgradePortletSettings.class);
356    
357            private final SettingsFactory _settingsFactory;
358    
359    }