001
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
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
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
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 }