001
014
015 package com.liferay.portal.upgrade.v6_2_0;
016
017 import com.liferay.portal.kernel.json.JSONException;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
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.LoggingTimer;
024 import com.liferay.portal.kernel.util.PortalUtil;
025 import com.liferay.portal.kernel.util.StringBundler;
026 import com.liferay.portal.kernel.util.StringPool;
027
028 import java.sql.PreparedStatement;
029 import java.sql.ResultSet;
030 import java.sql.SQLException;
031
032 import java.util.HashMap;
033 import java.util.Map;
034
035
040 public class UpgradeSocial extends UpgradeProcess {
041
042 protected String createExtraData(
043 ExtraDataFactory extraDataFactory, long companyId, long groupId,
044 long userId, long classNameId, long classPK, int type,
045 String extraData)
046 throws Exception {
047
048 if (extraDataFactory == null) {
049 return null;
050 }
051
052 try (PreparedStatement preparedStatement = connection.prepareStatement(
053 extraDataFactory.getSQL())) {
054
055 extraDataFactory.setModelSQLParameters(
056 preparedStatement, groupId, companyId, userId, classNameId,
057 classPK, type, extraData);
058
059 try (ResultSet resultSet = preparedStatement.executeQuery()) {
060 if (resultSet.next()) {
061 JSONObject extraDataJSONObject =
062 extraDataFactory.createExtraDataJSONObject(
063 resultSet, extraData);
064
065 return extraDataJSONObject.toString();
066 }
067
068 return null;
069 }
070 }
071 }
072
073 protected Map<Long, String> createExtraDataMap(
074 ExtraDataFactory extraDataFactory)
075 throws Exception {
076
077 Map<Long, String> extraDataMap = new HashMap<>();
078
079 StringBundler sb = new StringBundler(4);
080
081 sb.append("select activityId, groupId, companyId, userId, ");
082 sb.append("classNameId, classPK, type_, extraData from ");
083 sb.append("SocialActivity where ");
084 sb.append(extraDataFactory.getActivitySQLWhereClause());
085
086 try (PreparedStatement preparedStatement = connection.prepareStatement(
087 sb.toString())) {
088
089 extraDataFactory.setActivitySQLParameters(preparedStatement);
090
091 try (ResultSet resultSet = preparedStatement.executeQuery()) {
092 while (resultSet.next()) {
093 long activityId = resultSet.getLong("activityId");
094 long classNameId = resultSet.getLong("classNameId");
095 long classPK = resultSet.getLong("classPK");
096 long companyId = resultSet.getLong("companyId");
097 String extraData = resultSet.getString("extraData");
098 long groupId = resultSet.getLong("groupId");
099 int type = resultSet.getInt("type_");
100 long userId = resultSet.getLong("userId");
101
102 String newExtraData = createExtraData(
103 extraDataFactory, groupId, companyId, userId,
104 classNameId, classPK, type, extraData);
105
106 if (newExtraData != null) {
107 extraDataMap.put(activityId, newExtraData);
108 }
109 }
110 }
111 }
112
113 return extraDataMap;
114 }
115
116 @Override
117 protected void doUpgrade() throws Exception {
118 updateJournalActivities();
119 updateSOSocialActivities();
120
121 updateActivities();
122 }
123
124 protected void updateActivities() throws Exception {
125 ExtraDataFactory[] extraDataFactories = {
126 new AddAssetCommentExtraDataFactory(),
127 new AddMessageExtraDataFactory(), new BlogsEntryExtraDataFactory(),
128 new BookmarksEntryExtraDataFactory(),
129 new DLFileEntryExtraDataFactory(), new KBArticleExtraDataFactory(),
130 new KBCommentExtraDataFactory(), new KBTemplateExtraDataFactory(),
131 new WikiPageExtraDataFactory()
132 };
133
134 for (ExtraDataFactory extraDataFactory : extraDataFactories) {
135 updateActivities(extraDataFactory);
136 }
137 }
138
139 protected void updateActivities(ExtraDataFactory extraDataFactory)
140 throws Exception {
141
142 Map<Long, String> extraDataMap = createExtraDataMap(extraDataFactory);
143
144 for (Map.Entry<Long, String> entry : extraDataMap.entrySet()) {
145 long activityId = entry.getKey();
146 String extraData = entry.getValue();
147
148 try (PreparedStatement preparedStatement =
149 connection.prepareStatement(
150 "update SocialActivity set extraData = ? where " +
151 "activityId = ?")) {
152
153 preparedStatement.setString(1, extraData);
154 preparedStatement.setLong(2, activityId);
155
156 preparedStatement.executeUpdate();
157 }
158 catch (Exception e) {
159 if (_log.isWarnEnabled()) {
160 _log.warn("Unable to update activity " + activityId, e);
161 }
162 }
163 }
164 }
165
166 protected void updateJournalActivities() throws Exception {
167 try (LoggingTimer loggingTimer = new LoggingTimer()) {
168 long classNameId = PortalUtil.getClassNameId(
169 "com.liferay.portlet.journal.model.JournalArticle");
170
171 String[] tableNames = {"SocialActivity", "SocialActivityCounter"};
172
173 for (String tableName : tableNames) {
174 StringBundler sb = new StringBundler(7);
175
176 sb.append("update ");
177 sb.append(tableName);
178 sb.append(" set classPK = (select resourcePrimKey from ");
179 sb.append("JournalArticle where id_ = ");
180 sb.append(tableName);
181 sb.append(".classPK) where classNameId = ");
182 sb.append(classNameId);
183
184 runSQL(sb.toString());
185 }
186 }
187 }
188
189 protected void updateSOSocialActivities() throws Exception {
190 try (LoggingTimer loggingTimer = new LoggingTimer()) {
191 if (!hasTable("SO_SocialActivity")) {
192 return;
193 }
194
195 try (PreparedStatement preparedStatement =
196 connection.prepareStatement(
197 "select activityId, activitySetId from " +
198 "SO_SocialActivity");
199 ResultSet resultSet = preparedStatement.executeQuery()) {
200
201 while (resultSet.next()) {
202 long activityId = resultSet.getLong("activityId");
203 long activitySetId = resultSet.getLong("activitySetId");
204
205 StringBundler sb = new StringBundler(4);
206
207 sb.append("update SocialActivity set activitySetId = ");
208 sb.append(activitySetId);
209 sb.append(" where activityId = ");
210 sb.append(activityId);
211
212 runSQL(sb.toString());
213 }
214 }
215
216 runSQL("drop table SO_SocialActivity");
217 }
218 }
219
220 protected interface ExtraDataFactory {
221
222 public JSONObject createExtraDataJSONObject(
223 ResultSet resultSet, String extraData)
224 throws SQLException;
225
226 public String getActivityClassName();
227
228 public String getActivitySQLWhereClause();
229
230 public String getSQL();
231
232 public void setActivitySQLParameters(
233 PreparedStatement preparedStatement)
234 throws SQLException;
235
236 public void setModelSQLParameters(
237 PreparedStatement preparedStatement, long companyId,
238 long groupId, long userId, long classNameId, long classPK,
239 int type, String extraData)
240 throws SQLException;
241
242 }
243
244 private static final Log _log = LogFactoryUtil.getLog(UpgradeSocial.class);
245
246 private class AddAssetCommentExtraDataFactory implements ExtraDataFactory {
247
248 @Override
249 public JSONObject createExtraDataJSONObject(
250 ResultSet resultSet, String extraData)
251 throws SQLException {
252
253 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
254
255 long messageId = 0;
256
257 try {
258 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
259 extraData);
260
261 messageId = jsonObject.getLong("messageId");
262 }
263 catch (JSONException jsone) {
264 }
265
266 extraDataJSONObject.put("messageId", messageId);
267
268 extraDataJSONObject.put("title", resultSet.getString("subject"));
269
270 return extraDataJSONObject;
271 }
272
273 @Override
274 public String getActivityClassName() {
275 return StringPool.BLANK;
276 }
277
278 @Override
279 public String getActivitySQLWhereClause() {
280 return "type_ = ?";
281 }
282
283 @Override
284 public String getSQL() {
285 return "select subject from MBMessage where messageId = ?";
286 }
287
288 @Override
289 public void setActivitySQLParameters(
290 PreparedStatement preparedStatement)
291 throws SQLException {
292
293 preparedStatement.setInt(1, _TYPE_ADD_COMMENT);
294 }
295
296 @Override
297 public void setModelSQLParameters(
298 PreparedStatement preparedStatement, long companyId,
299 long groupId, long userId, long classNameId, long classPK,
300 int type, String extraData)
301 throws SQLException {
302
303 long messageId = 0;
304
305 try {
306 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
307 extraData);
308
309 messageId = jsonObject.getLong("messageId");
310 }
311 catch (JSONException jsone) {
312 }
313
314 preparedStatement.setLong(1, messageId);
315 }
316
317 private static final int _TYPE_ADD_COMMENT = 10005;
318
319 };
320
321 private class AddMessageExtraDataFactory implements ExtraDataFactory {
322
323 @Override
324 public JSONObject createExtraDataJSONObject(
325 ResultSet resultSet, String extraData)
326 throws SQLException {
327
328 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
329
330 extraDataJSONObject.put("title", resultSet.getString("subject"));
331
332 return extraDataJSONObject;
333 }
334
335 @Override
336 public String getActivityClassName() {
337 return "com.liferay.portlet.messageboards.model.MBMessage";
338 }
339
340 @Override
341 public String getActivitySQLWhereClause() {
342 return "classNameId = ? and (type_ = ? or type_ = ?)";
343 }
344
345 @Override
346 public String getSQL() {
347 return "select subject from MBMessage where messageId = ?";
348 }
349
350 @Override
351 public void setActivitySQLParameters(
352 PreparedStatement preparedStatement)
353 throws SQLException {
354
355 preparedStatement.setLong(
356 1, PortalUtil.getClassNameId(getActivityClassName()));
357 preparedStatement.setInt(2, _ADD_MESSAGE);
358 preparedStatement.setInt(3, _REPLY_MESSAGE);
359 }
360
361 @Override
362 public void setModelSQLParameters(
363 PreparedStatement preparedStatement, long companyId,
364 long groupId, long userId, long classNameId, long classPK,
365 int type, String extraData)
366 throws SQLException {
367
368 preparedStatement.setLong(1, classPK);
369 }
370
371 private static final int _ADD_MESSAGE = 1;
372
373 private static final int _REPLY_MESSAGE = 2;
374
375 };
376
377 private class BlogsEntryExtraDataFactory implements ExtraDataFactory {
378
379 @Override
380 public JSONObject createExtraDataJSONObject(
381 ResultSet resultSet, String extraData)
382 throws SQLException {
383
384 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
385
386 extraDataJSONObject.put("title", resultSet.getString("title"));
387
388 return extraDataJSONObject;
389 }
390
391 @Override
392 public String getActivityClassName() {
393 return "com.liferay.portlet.blogs.model.BlogsEntry";
394 }
395
396 @Override
397 public String getActivitySQLWhereClause() {
398 return "classNameId = ? and (type_ = ? or type_ = ?)";
399 }
400
401 @Override
402 public String getSQL() {
403 return "select title from BlogsEntry where entryId = ?";
404 }
405
406 @Override
407 public void setActivitySQLParameters(
408 PreparedStatement preparedStatement)
409 throws SQLException {
410
411 preparedStatement.setLong(
412 1, PortalUtil.getClassNameId(getActivityClassName()));
413 preparedStatement.setInt(2, _ADD_ENTRY);
414 preparedStatement.setInt(3, _UPDATE_ENTRY);
415 }
416
417 @Override
418 public void setModelSQLParameters(
419 PreparedStatement preparedStatement, long companyId,
420 long groupId, long userId, long classNameId, long classPK,
421 int type, String extraData)
422 throws SQLException {
423
424 preparedStatement.setLong(1, classPK);
425 }
426
427 private static final int _ADD_ENTRY = 2;
428
429 private static final int _UPDATE_ENTRY = 3;
430
431 };
432
433 private class BookmarksEntryExtraDataFactory implements ExtraDataFactory {
434
435 @Override
436 public JSONObject createExtraDataJSONObject(
437 ResultSet resultSet, String extraData)
438 throws SQLException {
439
440 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
441
442 extraDataJSONObject.put("title", resultSet.getString("name"));
443
444 return extraDataJSONObject;
445 }
446
447 @Override
448 public String getActivityClassName() {
449 return "com.liferay.portlet.bookmarks.model.BookmarksEntry";
450 }
451
452 @Override
453 public String getActivitySQLWhereClause() {
454 return "classNameId = ? and (type_ = ? or type_ = ?)";
455 }
456
457 @Override
458 public String getSQL() {
459 return "select name from BookmarksEntry where entryId = ?";
460 }
461
462 @Override
463 public void setActivitySQLParameters(
464 PreparedStatement preparedStatement)
465 throws SQLException {
466
467 preparedStatement.setLong(
468 1, PortalUtil.getClassNameId(getActivityClassName()));
469 preparedStatement.setInt(2, _ADD_ENTRY);
470 preparedStatement.setInt(3, _UPDATE_ENTRY);
471 }
472
473 @Override
474 public void setModelSQLParameters(
475 PreparedStatement preparedStatement, long companyId,
476 long groupId, long userId, long classNameId, long classPK,
477 int type, String extraData)
478 throws SQLException {
479
480 preparedStatement.setLong(1, classPK);
481 }
482
483 private static final int _ADD_ENTRY = 1;
484
485 private static final int _UPDATE_ENTRY = 2;
486
487 };
488
489 private class DLFileEntryExtraDataFactory implements ExtraDataFactory {
490
491 @Override
492 public JSONObject createExtraDataJSONObject(
493 ResultSet resultSet, String extraData)
494 throws SQLException {
495
496 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
497
498 extraDataJSONObject.put("title", resultSet.getString("title"));
499
500 return extraDataJSONObject;
501 }
502
503 @Override
504 public String getActivityClassName() {
505 return "com.liferay.portlet.documentlibrary.model.DLFileEntry";
506 }
507
508 @Override
509 public String getActivitySQLWhereClause() {
510 return "classNameId = ?";
511 }
512
513 @Override
514 public String getSQL() {
515 return "select title from DLFileEntry where companyId = ? and " +
516 "groupId = ? and fileEntryId = ?";
517 }
518
519 @Override
520 public void setActivitySQLParameters(
521 PreparedStatement preparedStatement)
522 throws SQLException {
523
524 preparedStatement.setLong(
525 1, PortalUtil.getClassNameId(getActivityClassName()));
526 }
527
528 @Override
529 public void setModelSQLParameters(
530 PreparedStatement preparedStatement, long companyId,
531 long groupId, long userId, long classNameId, long classPK,
532 int type, String extraData)
533 throws SQLException {
534
535 preparedStatement.setLong(1, companyId);
536 preparedStatement.setLong(2, groupId);
537 preparedStatement.setLong(3, classPK);
538 }
539
540 };
541
542 private class KBArticleExtraDataFactory implements ExtraDataFactory {
543
544 @Override
545 public JSONObject createExtraDataJSONObject(
546 ResultSet resultSet, String extraData)
547 throws SQLException {
548
549 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
550
551 extraDataJSONObject.put("title", resultSet.getString("title"));
552
553 return extraDataJSONObject;
554 }
555
556 @Override
557 public String getActivityClassName() {
558 return "com.liferay.knowledgebase.model.KBArticle";
559 }
560
561 @Override
562 public String getActivitySQLWhereClause() {
563 return "classNameId = ? and (type_ = ? or type_ = ? or type_ = ?)";
564 }
565
566 @Override
567 public String getSQL() {
568 return "select title from KBArticle where resourcePrimKey = ?";
569 }
570
571 @Override
572 public void setActivitySQLParameters(
573 PreparedStatement preparedStatement)
574 throws SQLException {
575
576 preparedStatement.setLong(
577 1, PortalUtil.getClassNameId(getActivityClassName()));
578 preparedStatement.setInt(2, _ADD_KB_ARTICLE);
579 preparedStatement.setInt(3, _UPDATE_KB_ARTICLE);
580 preparedStatement.setInt(4, _MOVE_KB_ARTICLE);
581 }
582
583 @Override
584 public void setModelSQLParameters(
585 PreparedStatement preparedStatement, long companyId,
586 long groupId, long userId, long classNameId, long classPK,
587 int type, String extraData)
588 throws SQLException {
589
590 preparedStatement.setLong(1, classPK);
591 }
592
593 private static final int _ADD_KB_ARTICLE = 1;
594
595 private static final int _MOVE_KB_ARTICLE = 7;
596
597 private static final int _UPDATE_KB_ARTICLE = 3;
598
599 };
600
601 private class KBCommentExtraDataFactory implements ExtraDataFactory {
602
603 @Override
604 public JSONObject createExtraDataJSONObject(
605 ResultSet resultSet, String extraData)
606 throws SQLException {
607
608 long classNameId = resultSet.getLong("classNameId");
609 long classPK = resultSet.getLong("classPK");
610
611 ExtraDataFactory extraDataFactory = null;
612
613 if (classNameId == PortalUtil.getClassNameId(
614 _kbArticleExtraDataFactory.getActivityClassName())) {
615
616 extraDataFactory = _kbArticleExtraDataFactory;
617 }
618 else if (classNameId == PortalUtil.getClassNameId(
619 _kbTemplateExtraDataFactory.getActivityClassName())) {
620
621 extraDataFactory = _kbTemplateExtraDataFactory;
622 }
623
624 if (extraDataFactory == null) {
625 return null;
626 }
627
628 try (PreparedStatement preparedStatement =
629 connection.prepareStatement(
630 extraDataFactory.getSQL())) {
631
632 preparedStatement.setLong(1, classPK);
633
634 try (ResultSet curResultSet =
635 preparedStatement.executeQuery()) {
636
637 while (curResultSet.next()) {
638 return extraDataFactory.createExtraDataJSONObject(
639 curResultSet, StringPool.BLANK);
640 }
641 }
642 }
643
644 return null;
645 }
646
647 @Override
648 public String getActivityClassName() {
649 return "com.liferay.knowledgebase.model.KBComment";
650 }
651
652 @Override
653 public String getActivitySQLWhereClause() {
654 return "classNameId = ? and (type_ = ? or type_ = ?)";
655 }
656
657 @Override
658 public String getSQL() {
659 return "select classNameId, classPK from KBComment where " +
660 "kbCommentId = ?";
661 }
662
663 @Override
664 public void setActivitySQLParameters(
665 PreparedStatement preparedStatement)
666 throws SQLException {
667
668 preparedStatement.setLong(
669 1, PortalUtil.getClassNameId(getActivityClassName()));
670 preparedStatement.setInt(2, _ADD_KB_COMMENT);
671 preparedStatement.setInt(3, _UPDATE_KB_COMMENT);
672 }
673
674 @Override
675 public void setModelSQLParameters(
676 PreparedStatement preparedStatement, long companyId,
677 long groupId, long userId, long classNameId, long classPK,
678 int type, String extraData)
679 throws SQLException {
680
681 preparedStatement.setLong(1, classPK);
682 }
683
684 private static final int _ADD_KB_COMMENT = 5;
685
686 private static final int _UPDATE_KB_COMMENT = 6;
687
688 private final KBArticleExtraDataFactory _kbArticleExtraDataFactory =
689 new KBArticleExtraDataFactory();
690 private final KBTemplateExtraDataFactory _kbTemplateExtraDataFactory =
691 new KBTemplateExtraDataFactory();
692
693 };
694
695 private class KBTemplateExtraDataFactory implements ExtraDataFactory {
696
697 @Override
698 public JSONObject createExtraDataJSONObject(
699 ResultSet resultSet, String extraData)
700 throws SQLException {
701
702 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
703
704 extraDataJSONObject.put("title", resultSet.getString("title"));
705
706 return extraDataJSONObject;
707 }
708
709 @Override
710 public String getActivityClassName() {
711 return "com.liferay.knowledgebase.model.KBTemplate";
712 }
713
714 @Override
715 public String getActivitySQLWhereClause() {
716 return "classNameId = ? and (type_ = ? or type_ = ?)";
717 }
718
719 @Override
720 public String getSQL() {
721 return "select title from KBTemplate where kbTemplateId = ?";
722 }
723
724 @Override
725 public void setActivitySQLParameters(
726 PreparedStatement preparedStatement)
727 throws SQLException {
728
729 preparedStatement.setLong(
730 1, PortalUtil.getClassNameId(getActivityClassName()));
731 preparedStatement.setInt(2, _ADD_KB_TEMPLATE);
732 preparedStatement.setInt(3, _UPDATE_KB_TEMPLATE);
733 }
734
735 @Override
736 public void setModelSQLParameters(
737 PreparedStatement preparedStatement, long companyId,
738 long groupId, long userId, long classNameId, long classPK,
739 int type, String extraData)
740 throws SQLException {
741
742 preparedStatement.setLong(1, classPK);
743 }
744
745 private static final int _ADD_KB_TEMPLATE = 2;
746
747 private static final int _UPDATE_KB_TEMPLATE = 4;
748
749 };
750
751 private class WikiPageExtraDataFactory implements ExtraDataFactory {
752
753 @Override
754 public JSONObject createExtraDataJSONObject(
755 ResultSet resultSet, String extraData)
756 throws SQLException {
757
758 JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
759
760 extraDataJSONObject.put("title", resultSet.getString("title"));
761 extraDataJSONObject.put("version", resultSet.getDouble("version"));
762
763 return extraDataJSONObject;
764 }
765
766 @Override
767 public String getActivityClassName() {
768 return "com.liferay.portlet.wiki.model.WikiPage";
769 }
770
771 @Override
772 public String getActivitySQLWhereClause() {
773 return "classNameId = ? and (type_ = ? or type_ = ?)";
774 }
775
776 @Override
777 public String getSQL() {
778 return "select title, version from WikiPage where companyId = ? " +
779 "and groupId = ? and resourcePrimKey = ? and head = ?";
780 }
781
782 @Override
783 public void setActivitySQLParameters(
784 PreparedStatement preparedStatement)
785 throws SQLException {
786
787 preparedStatement.setLong(
788 1, PortalUtil.getClassNameId(getActivityClassName()));
789 preparedStatement.setInt(2, _ADD_PAGE);
790 preparedStatement.setInt(3, _UPDATE_PAGE);
791 }
792
793 @Override
794 public void setModelSQLParameters(
795 PreparedStatement preparedStatement, long companyId,
796 long groupId, long userId, long classNameId, long classPK,
797 int type, String extraData)
798 throws SQLException {
799
800 preparedStatement.setLong(1, companyId);
801 preparedStatement.setLong(2, groupId);
802 preparedStatement.setLong(3, classPK);
803 preparedStatement.setBoolean(4, true);
804 }
805
806 private static final int _ADD_PAGE = 1;
807
808 private static final int _UPDATE_PAGE = 2;
809
810 };
811
812 }