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.v6_1_0;
016    
017    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
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.GetterUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.Tuple;
027    import com.liferay.portal.model.User;
028    import com.liferay.portal.security.permission.ActionKeys;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.portlet.blogs.model.BlogsEntry;
031    import com.liferay.portlet.journal.model.JournalArticle;
032    import com.liferay.portlet.messageboards.model.MBCategory;
033    import com.liferay.portlet.messageboards.model.MBMessage;
034    import com.liferay.portlet.messageboards.model.MBThread;
035    import com.liferay.portlet.social.model.SocialActivityConstants;
036    import com.liferay.portlet.social.model.SocialActivityCounterConstants;
037    import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
038    import com.liferay.portlet.social.util.SocialCounterPeriodUtil;
039    import com.liferay.portlet.wiki.model.WikiNode;
040    import com.liferay.portlet.wiki.model.WikiPage;
041    
042    import java.sql.Connection;
043    import java.sql.PreparedStatement;
044    import java.sql.ResultSet;
045    
046    import java.util.Date;
047    import java.util.HashMap;
048    import java.util.Map;
049    
050    /**
051     * @author Zsolt Berentey
052     */
053    public class UpgradeSocial extends UpgradeProcess {
054    
055            public UpgradeSocial() {
056                    putEquityToActivityMap(
057                            BlogsEntry.class, ActionKeys.ADD_DISCUSSION,
058                            SocialActivityConstants.TYPE_ADD_COMMENT);
059                    putEquityToActivityMap(BlogsEntry.class, ActionKeys.ADD_ENTRY, 2);
060                    putEquityToActivityMap(
061                            BlogsEntry.class, ActionKeys.ADD_VOTE,
062                            SocialActivityConstants.TYPE_ADD_VOTE);
063                    putEquityToActivityMap(
064                            BlogsEntry.class, ActionKeys.SUBSCRIBE,
065                            SocialActivityConstants.TYPE_SUBSCRIBE);
066                    putEquityToActivityMap(BlogsEntry.class, ActionKeys.UPDATE, 3);
067                    putEquityToActivityMap(
068                            BlogsEntry.class, ActionKeys.VIEW,
069                            SocialActivityConstants.TYPE_VIEW);
070    
071                    putEquityToActivityMap(JournalArticle.class, ActionKeys.ADD_ARTICLE, 1);
072                    putEquityToActivityMap(
073                            JournalArticle.class, ActionKeys.ADD_DISCUSSION,
074                            SocialActivityConstants.TYPE_ADD_COMMENT);
075                    putEquityToActivityMap(JournalArticle.class, ActionKeys.UPDATE, 2);
076                    putEquityToActivityMap(
077                            JournalArticle.class, ActionKeys.VIEW,
078                            SocialActivityConstants.TYPE_VIEW);
079    
080                    putEquityToActivityMap(
081                            MBCategory.class, ActionKeys.SUBSCRIBE,
082                            SocialActivityConstants.TYPE_SUBSCRIBE);
083                    putEquityToActivityMap(MBMessage.class, ActionKeys.ADD_MESSAGE, 1);
084                    putEquityToActivityMap(
085                            MBMessage.class, ActionKeys.ADD_VOTE,
086                            SocialActivityConstants.TYPE_ADD_VOTE);
087                    putEquityToActivityMap(MBMessage.class, ActionKeys.REPLY_TO_MESSAGE, 2);
088                    putEquityToActivityMap(
089                            MBMessage.class, ActionKeys.VIEW,
090                            SocialActivityConstants.TYPE_VIEW);
091                    putEquityToActivityMap(
092                            MBThread.class, ActionKeys.SUBSCRIBE, MBMessage.class,
093                            SocialActivityConstants.TYPE_SUBSCRIBE);
094    
095                    putEquityToActivityMap(
096                            WikiNode.class, ActionKeys.SUBSCRIBE,
097                            SocialActivityConstants.TYPE_SUBSCRIBE);
098                    putEquityToActivityMap(
099                            WikiPage.class, ActionKeys.ADD_ATTACHMENT,
100                            SocialActivityConstants.TYPE_ADD_ATTACHMENT);
101                    putEquityToActivityMap(
102                            WikiPage.class, ActionKeys.ADD_DISCUSSION,
103                            SocialActivityConstants.TYPE_ADD_COMMENT);
104                    putEquityToActivityMap(WikiPage.class, ActionKeys.ADD_PAGE, 1);
105                    putEquityToActivityMap(
106                            WikiPage.class, ActionKeys.SUBSCRIBE,
107                            SocialActivityConstants.TYPE_SUBSCRIBE);
108                    putEquityToActivityMap(WikiPage.class, ActionKeys.UPDATE, 2);
109                    putEquityToActivityMap(
110                            WikiPage.class, ActionKeys.VIEW, SocialActivityConstants.TYPE_VIEW);
111            }
112    
113            protected void addActivityCounter(
114                            long activityCounterId, long groupId, long companyId,
115                            long classNameId, long classPK, String name, int ownerType,
116                            int currentValue, int totalValue, int graceValue, int startPeriod,
117                            int endPeriod)
118                    throws Exception {
119    
120                    Connection con = null;
121                    PreparedStatement ps = null;
122                    ResultSet rs = null;
123    
124                    try {
125                            con = DataAccess.getUpgradeOptimizedConnection();
126    
127                            StringBundler sb = new StringBundler(5);
128    
129                            sb.append("insert into SocialActivityCounter (activityCounterId, ");
130                            sb.append("groupId, companyId, classNameId, classPK, name, ");
131                            sb.append("ownerType, currentValue, totalValue, graceValue, ");
132                            sb.append("startPeriod, endPeriod) values (?, ?, ?, ?, ?, ?, ?, ");
133                            sb.append("?, ?, ?, ?, ?)");
134    
135                            ps = con.prepareStatement(sb.toString());
136    
137                            ps.setLong(1, activityCounterId);
138                            ps.setLong(2, groupId);
139                            ps.setLong(3, companyId);
140                            ps.setLong(4, classNameId);
141                            ps.setLong(5, classPK);
142                            ps.setString(6, name);
143                            ps.setInt(7, ownerType);
144                            ps.setInt(8, currentValue);
145                            ps.setInt(9, totalValue);
146                            ps.setInt(10, graceValue);
147                            ps.setInt(11, startPeriod);
148                            ps.setInt(12, endPeriod);
149    
150                            ps.executeUpdate();
151                    }
152                    finally {
153                            DataAccess.cleanUp(con, ps, rs);
154                    }
155            }
156    
157            protected void addActivitySetting(
158                            long groupId, long companyId, long classNameId, int activityType,
159                            String name, int ownerType, int limitValue, int value)
160                    throws Exception {
161    
162                    JSONObject valueJSONObject = JSONFactoryUtil.createJSONObject();
163    
164                    valueJSONObject.put("enabled", true);
165                    valueJSONObject.put(
166                            "limitPeriod", SocialActivityCounterDefinition.LIMIT_PERIOD_DAY);
167                    valueJSONObject.put("limitValue", limitValue);
168                    valueJSONObject.put("ownerType", ownerType);
169                    valueJSONObject.put("value", value);
170    
171                    addActivitySetting(
172                            increment(), groupId, companyId, classNameId, activityType, name,
173                            valueJSONObject.toString());
174            }
175    
176            protected void addActivitySetting(
177                            long activitySettingId, long groupId, long companyId,
178                            long classNameId, int activityType, String name, String value)
179                    throws Exception {
180    
181                    Connection con = null;
182                    PreparedStatement ps = null;
183                    ResultSet rs = null;
184    
185                    try {
186                            con = DataAccess.getUpgradeOptimizedConnection();
187    
188                            ps = con.prepareStatement(
189                                    "insert into SocialActivitySetting (activitySettingId, " +
190                                            "groupId, companyId, classNameId, activityType, name, " +
191                                                    "value) values (?, ?, ?, ?, ?, ?, ?)");
192    
193                            ps.setLong(1, activitySettingId);
194                            ps.setLong(2, groupId);
195                            ps.setLong(3, companyId);
196                            ps.setLong(4, classNameId);
197                            ps.setInt(5, activityType);
198                            ps.setString(6, name);
199                            ps.setString(7, value);
200    
201                            ps.executeUpdate();
202                    }
203                    finally {
204                            DataAccess.cleanUp(con, ps, rs);
205                    }
206            }
207    
208            @Override
209            protected void doUpgrade() throws Exception {
210                    migrateEquityGroupSettings();
211                    migrateEquitySettings();
212                    migrateEquityLogs();
213    
214                    dropEquityTables();
215            }
216    
217            protected void dropEquityTables() throws Exception {
218                    runSQL("drop table SocialEquityAssetEntry");
219                    runSQL("drop table SocialEquityGroupSetting");
220                    runSQL("drop table SocialEquityHistory");
221                    runSQL("drop table SocialEquityLog");
222                    runSQL("drop table SocialEquitySetting");
223                    runSQL("drop table SocialEquityUser");
224            }
225    
226            protected String encodeEquityToActivityKey(
227                    long classNameId, String actionId) {
228    
229                    StringBundler sb = new StringBundler(3);
230    
231                    sb.append(classNameId);
232                    sb.append(StringPool.POUND);
233                    sb.append(actionId);
234    
235                    return sb.toString();
236            }
237    
238            protected Object[] getActivityCounter(
239                            long groupId, long classNameId, long classPK, String name,
240                            int ownerType, int startPeriod, int endPeriod)
241                    throws Exception {
242    
243                    Connection con = null;
244                    PreparedStatement ps = null;
245                    ResultSet rs = null;
246    
247                    try {
248                            con = DataAccess.getUpgradeOptimizedConnection();
249    
250                            StringBundler sb = new StringBundler(4);
251    
252                            sb.append("select activityCounterId, totalValue from ");
253                            sb.append("SocialActivityCounter where groupId = ? and ");
254                            sb.append("classNameId = ? and classPK = ? and name = ? and ");
255                            sb.append("ownerType = ? and startPeriod = ? and endPeriod = ?");
256    
257                            ps = con.prepareStatement(sb.toString());
258    
259                            ps.setLong(1, groupId);
260                            ps.setLong(2, classNameId);
261                            ps.setLong(3, classPK);
262                            ps.setString(4, name);
263                            ps.setInt(5, ownerType);
264                            ps.setInt(6, startPeriod);
265                            ps.setInt(7, endPeriod);
266    
267                            rs = ps.executeQuery();
268    
269                            if (rs.next()) {
270                                    long activityCounterId = rs.getLong("activityCounterId");
271                                    int totalValue = rs.getInt("totalValue");
272    
273                                    return new Object[] {activityCounterId, totalValue};
274                            }
275    
276                            return null;
277                    }
278                    finally {
279                            DataAccess.cleanUp(con, ps, rs);
280                    }
281            }
282    
283            protected long[] getAssetEntryArray(long assetEntryId) throws Exception {
284                    Connection con = null;
285                    PreparedStatement ps = null;
286                    ResultSet rs = null;
287    
288                    try {
289                            con = DataAccess.getUpgradeOptimizedConnection();
290    
291                            ps = con.prepareStatement(
292                                    "select groupId, companyId, userId, classNameId, classPK " +
293                                            "from AssetEntry where entryId = " + assetEntryId);
294    
295                            rs = ps.executeQuery();
296    
297                            if (rs.next()) {
298                                    long groupId = rs.getLong("groupId");
299                                    long companyId = rs.getLong("companyId");
300                                    long userId = rs.getLong("userId");
301                                    long classNameId = rs.getLong("classNameId");
302                                    long classPK = rs.getLong("classPK");
303    
304                                    return new long[] {
305                                            groupId, companyId, userId, classNameId, classPK
306                                    };
307                            }
308    
309                            return null;
310                    }
311                    finally {
312                            DataAccess.cleanUp(con, ps, rs);
313                    }
314            }
315    
316            protected long[] getAssetEntryArray(String className, long classPK)
317                    throws Exception {
318    
319                    Connection con = null;
320                    PreparedStatement ps = null;
321                    ResultSet rs = null;
322    
323                    try {
324                            con = DataAccess.getUpgradeOptimizedConnection();
325    
326                            long classNameId = PortalUtil.getClassNameId(className);
327    
328                            StringBundler sb = new StringBundler(5);
329    
330                            sb.append("select groupId, companyId, userId from AssetEntry ");
331                            sb.append("where classNameId = ");
332                            sb.append(classNameId);
333                            sb.append(" and classPK = ");
334                            sb.append(classPK);
335    
336                            ps = con.prepareStatement(sb.toString());
337    
338                            rs = ps.executeQuery();
339    
340                            if (rs.next()) {
341                                    long groupId = rs.getLong("groupId");
342                                    long companyId = rs.getLong("companyId");
343                                    long userId = rs.getLong("userId");
344    
345                                    return new long[] {
346                                            groupId, companyId, userId, classNameId, classPK
347                                    };
348                            }
349    
350                            return null;
351                    }
352                    finally {
353                            DataAccess.cleanUp(con, ps, rs);
354                    }
355            }
356    
357            protected long getMBThreadRootMessageId(long mbThreadId) throws Exception {
358                    Connection con = null;
359                    PreparedStatement ps = null;
360                    ResultSet rs = null;
361    
362                    try {
363                            con = DataAccess.getUpgradeOptimizedConnection();
364    
365                            ps = con.prepareStatement(
366                                    "select rootMessageId from MBThread where threadId = " +
367                                            mbThreadId);
368    
369                            rs = ps.executeQuery();
370    
371                            if (rs.next()) {
372                                    return rs.getLong("rootMessageId");
373                            }
374    
375                            return -1;
376                    }
377                    finally {
378                            DataAccess.cleanUp(con, ps, rs);
379                    }
380            }
381    
382            protected int getTotalValue(
383                            long groupId, long classNameId, long classPK, String name,
384                            int ownerType, int startPeriod)
385                    throws Exception {
386    
387                    Connection con = null;
388                    PreparedStatement ps = null;
389                    ResultSet rs = null;
390    
391                    try {
392                            con = DataAccess.getUpgradeOptimizedConnection();
393    
394                            StringBundler sb = new StringBundler(4);
395    
396                            sb.append("select max(totalValue) as totalValue from ");
397                            sb.append("SocialActivityCounter where groupId = ? and ");
398                            sb.append("classNameId = ? and classPK = ? and name = ? and ");
399                            sb.append("ownerType = ? and startPeriod < ?");
400    
401                            ps = con.prepareStatement(sb.toString());
402    
403                            ps.setLong(1, groupId);
404                            ps.setLong(2, classNameId);
405                            ps.setLong(3, classPK);
406                            ps.setString(4, name);
407                            ps.setInt(5, ownerType);
408                            ps.setInt(6, startPeriod);
409    
410                            rs = ps.executeQuery();
411    
412                            if (rs.next()) {
413                                    return rs.getInt("totalValue");
414                            }
415    
416                            return 0;
417                    }
418                    finally {
419                            DataAccess.cleanUp(con, ps, rs);
420                    }
421            }
422    
423            protected void migrateEquityGroupSettings() throws Exception {
424                    Connection con = null;
425                    PreparedStatement ps = null;
426                    ResultSet rs = null;
427    
428                    try {
429                            con = DataAccess.getUpgradeOptimizedConnection();
430    
431                            ps = con.prepareStatement(
432                                    "select groupId, companyId, classNameId, enabled from " +
433                                            "SocialEquityGroupSetting where type_ = 1");
434    
435                            rs = ps.executeQuery();
436    
437                            while (rs.next()) {
438                                    long groupId = rs.getLong("groupId");
439                                    long companyId = rs.getLong("companyId");
440                                    long classNameId = rs.getLong("classNameId");
441                                    boolean enabled = rs.getBoolean("enabled");
442    
443                                    addActivitySetting(
444                                            increment(), groupId, companyId, classNameId, 0, "enabled",
445                                            String.valueOf(enabled));
446                            }
447    
448                            DataAccess.cleanUp(null, ps, rs);
449    
450                            StringBundler sb = new StringBundler(12);
451    
452                            sb.append("select groupId from SocialActivitySetting where ");
453                            sb.append("activityType = 0 and name = 'enabled' and ");
454                            sb.append("value = 'true' and classNameId in (");
455    
456                            long mbMessageClassNameId = PortalUtil.getClassNameId(
457                                    MBMessage.class);
458    
459                            sb.append(mbMessageClassNameId);
460                            sb.append(", ");
461    
462                            long mbThreadClassNameId = PortalUtil.getClassNameId(
463                                    MBThread.class);
464    
465                            sb.append(mbThreadClassNameId);
466                            sb.append(")");
467    
468                            ps = con.prepareStatement(sb.toString());
469    
470                            rs = ps.executeQuery();
471    
472                            while (rs.next()) {
473                                    long groupId = rs.getLong("groupId");
474    
475                                    sb = new StringBundler(6);
476    
477                                    sb.append("update SocialActivitySetting set value = 'true' ");
478                                    sb.append("where groupId = ");
479                                    sb.append(groupId);
480                                    sb.append(" and activityType = 0 and value = 'enabled' and ");
481                                    sb.append("classNameId = ");
482                                    sb.append(mbThreadClassNameId);
483    
484                                    runSQL(sb.toString());
485                            }
486    
487                            runSQL(
488                                    "delete from SocialActivitySetting where classNameId = " +
489                                            mbThreadClassNameId);
490                    }
491                    finally {
492                            DataAccess.cleanUp(con, ps, rs);
493                    }
494            }
495    
496            protected void migrateEquityLog(ResultSet rs) throws Exception {
497                    long assetEntryId = rs.getLong("assetEntryId");
498    
499                    long[] assetEntryArray = getAssetEntryArray(assetEntryId);
500    
501                    if (assetEntryArray == null) {
502                            return;
503                    }
504    
505                    String actionId = rs.getString("actionId");
506    
507                    if (actionId.equals(ActionKeys.SUBSCRIBE)) {
508                            long classNameId = assetEntryArray[3];
509    
510                            String className = PortalUtil.getClassName(classNameId);
511    
512                            if (className.equals(MBThread.class.getName())) {
513                                    long classPK = assetEntryArray[4];
514    
515                                    long mbThreadRootMessageId = getMBThreadRootMessageId(classPK);
516    
517                                    if (mbThreadRootMessageId == -1) {
518                                            return;
519                                    }
520    
521                                    assetEntryArray = getAssetEntryArray(
522                                            MBMessage.class.getName(), mbThreadRootMessageId);
523    
524                                    if (assetEntryArray == null) {
525                                            return;
526                                    }
527                            }
528                    }
529    
530                    long classNameId = PortalUtil.getClassNameId(User.class);
531                    long classPK = rs.getLong("userId");
532                    String name = SocialActivityCounterConstants.NAME_PARTICIPATION;
533                    int ownerType = SocialActivityCounterConstants.TYPE_ACTOR;
534    
535                    int actionDate = rs.getInt("actionDate");
536    
537                    Date actionDateDate = SocialCounterPeriodUtil.getDate(actionDate - 365);
538    
539                    int startPeriod = SocialCounterPeriodUtil.getStartPeriod(
540                            actionDateDate.getTime());
541                    int endPeriod = SocialCounterPeriodUtil.getEndPeriod(
542                            actionDateDate.getTime());
543    
544                    if (endPeriod == SocialCounterPeriodUtil.getEndPeriod()) {
545                            endPeriod = SocialActivityCounterConstants.END_PERIOD_UNDEFINED;
546                    }
547    
548                    int type = rs.getInt("type_");
549                    int value = rs.getInt("value");
550    
551                    long groupId = assetEntryArray[0];
552                    long companyId = assetEntryArray[1];
553    
554                    if (type == 1) {
555                            long userId = assetEntryArray[2];
556    
557                            name = SocialActivityCounterConstants.NAME_CONTRIBUTION;
558                            ownerType = SocialActivityCounterConstants.TYPE_CREATOR;
559    
560                            updateActivityCounter(
561                                    increment(), groupId, companyId, classNameId, userId, name,
562                                    ownerType, startPeriod, endPeriod, value);
563    
564                            classNameId = assetEntryArray[3];
565                            classPK = assetEntryArray[4];
566                            name = SocialActivityCounterConstants.NAME_POPULARITY;
567                            ownerType = SocialActivityCounterConstants.TYPE_ASSET;
568                    }
569    
570                    long equityLogId = rs.getLong("equityLogId");
571    
572                    updateActivityCounter(
573                            equityLogId, groupId, companyId, classNameId, classPK, name,
574                            ownerType, startPeriod, endPeriod, value);
575            }
576    
577            protected void migrateEquityLogs() throws Exception {
578                    Connection con = null;
579                    PreparedStatement ps = null;
580                    ResultSet rs = null;
581    
582                    try {
583                            con = DataAccess.getUpgradeOptimizedConnection();
584    
585                            StringBundler sb = new StringBundler(4);
586    
587                            sb.append("select AssetEntry.classNameId, AssetEntry.classPK, ");
588                            sb.append("SocialEquityLog.* from SocialEquityLog, AssetEntry ");
589                            sb.append("where SocialEquityLog.assetEntryId = ");
590                            sb.append("AssetEntry.entryId order by actionDate");
591    
592                            ps = con.prepareStatement(sb.toString());
593    
594                            rs = ps.executeQuery();
595    
596                            while (rs.next()) {
597                                    migrateEquityLog(rs);
598                            }
599    
600                            DataAccess.cleanUp(null, ps, rs);
601    
602                            sb = new StringBundler(4);
603    
604                            sb.append("select groupId, classNameId, classPK, name, ");
605                            sb.append("max(startPeriod) as startPeriod ");
606                            sb.append("from SocialActivityCounter group by groupId, ");
607                            sb.append("classNameId, classPK, name");
608    
609                            ps = con.prepareStatement(sb.toString());
610    
611                            rs = ps.executeQuery();
612    
613                            while (rs.next()) {
614                                    long groupId = rs.getLong("groupId");
615                                    long classNameId = rs.getLong("classNameId");
616                                    long classPK = rs.getLong("classPK");
617                                    String name = rs.getString("name");
618                                    int startPeriod = rs.getInt("startPeriod");
619    
620                                    sb = new StringBundler(12);
621    
622                                    sb.append("update SocialActivityCounter set endPeriod = ");
623                                    sb.append(SocialActivityCounterConstants.END_PERIOD_UNDEFINED);
624                                    sb.append(" where groupId = ");
625                                    sb.append(groupId);
626                                    sb.append(" and classNameId = ");
627                                    sb.append(classNameId);
628                                    sb.append(" and classPK = ");
629                                    sb.append(classPK);
630                                    sb.append(" and name = '");
631                                    sb.append(name);
632                                    sb.append("' and startPeriod = ");
633                                    sb.append(startPeriod);
634    
635                                    runSQL(sb.toString());
636                            }
637                    }
638                    finally {
639                            DataAccess.cleanUp(con, ps, rs);
640                    }
641            }
642    
643            protected void migrateEquitySettings() throws Exception {
644                    Connection con = null;
645                    PreparedStatement ps = null;
646                    ResultSet rs = null;
647    
648                    try {
649                            con = DataAccess.getUpgradeOptimizedConnection();
650    
651                            ps = con.prepareStatement(
652                                    "select groupId, companyId, classNameId, actionId, " +
653                                            "dailyLimit, type_, value from SocialEquitySetting");
654    
655                            rs = ps.executeQuery();
656    
657                            while (rs.next()) {
658                                    long groupId = rs.getLong("groupId");
659                                    long companyId = rs.getLong("companyId");
660                                    long classNameId = rs.getLong("classNameId");
661                                    String actionId = rs.getString("actionId");
662                                    int dailyLimit = rs.getInt("dailyLimit");
663                                    int type = rs.getInt("type_");
664                                    int value = rs.getInt("value");
665    
666                                    Tuple tuple = _equityToActivityMap.get(
667                                            encodeEquityToActivityKey(classNameId, actionId));
668    
669                                    if (tuple == null) {
670                                            StringBundler sb = new StringBundler();
671    
672                                            sb.append("Unknown Social Equity setting with action ");
673                                            sb.append(actionId);
674                                            sb.append("for ");
675    
676                                            String className = PortalUtil.getClassName(classNameId);
677    
678                                            sb.append(className);
679    
680                                            sb.append(". Please configure this action using the ");
681                                            sb.append("Social Activity portlet in the Control Panel.");
682    
683                                            if (_log.isWarnEnabled()) {
684                                                    _log.warn(sb.toString());
685                                            }
686    
687                                            continue;
688                                    }
689    
690                                    long activityClassNameId = GetterUtil.getLong(
691                                            tuple.getObject(0));
692                                    int activityType = GetterUtil.getInteger(tuple.getObject(1));
693    
694                                    if (type == 1) {
695                                            addActivitySetting(
696                                                    groupId, companyId, activityClassNameId, activityType,
697                                                    SocialActivityCounterConstants.NAME_CONTRIBUTION,
698                                                    SocialActivityCounterConstants.TYPE_CREATOR, dailyLimit,
699                                                    value);
700    
701                                            addActivitySetting(
702                                                    groupId, companyId, activityClassNameId, activityType,
703                                                    SocialActivityCounterConstants.NAME_POPULARITY,
704                                                    SocialActivityCounterConstants.TYPE_ASSET, dailyLimit,
705                                                    value);
706                                    }
707                                    else if (type == 2) {
708                                            addActivitySetting(
709                                                    groupId, companyId, activityClassNameId, activityType,
710                                                    SocialActivityCounterConstants.NAME_PARTICIPATION,
711                                                    SocialActivityCounterConstants.TYPE_ACTOR, dailyLimit,
712                                                    value);
713                                    }
714                            }
715                    }
716                    finally {
717                            DataAccess.cleanUp(con, ps, rs);
718                    }
719            }
720    
721            protected void putEquityToActivityMap(
722                    Class<?> equityClass, String equityActionId, Class<?> activityClass,
723                    int activityType) {
724    
725                    long equityClassNameId = PortalUtil.getClassNameId(equityClass);
726                    long activityClassNameId = PortalUtil.getClassNameId(activityClass);
727    
728                    _equityToActivityMap.put(
729                            encodeEquityToActivityKey(equityClassNameId, equityActionId),
730                            new Tuple(activityClassNameId, activityType));
731            }
732    
733            protected void putEquityToActivityMap(
734                    Class<?> equityClass, String equityActionId, int activityType) {
735    
736                    putEquityToActivityMap(
737                            equityClass, equityActionId, equityClass, activityType);
738            }
739    
740            protected void updateActivityCounter(
741                            long activityCounterId, long groupId, long companyId,
742                            long classNameId, long classPK, String name, int ownerType,
743                            int startPeriod, int endPeriod, int increment)
744                    throws Exception {
745    
746                    Object[] activityCounter = getActivityCounter(
747                            groupId, classNameId, classPK, name, ownerType, startPeriod,
748                            endPeriod);
749    
750                    if (activityCounter == null) {
751                            int totalValue = getTotalValue(
752                                    groupId, classNameId, classPK, name, ownerType, startPeriod);
753    
754                            addActivityCounter(
755                                    activityCounterId, groupId, companyId, classNameId, classPK,
756                                    name, ownerType, increment, totalValue + increment, 0,
757                                    startPeriod, endPeriod);
758    
759                            return;
760                    }
761    
762                    StringBundler sb = new StringBundler(7);
763    
764                    sb.append("update SocialActivityCounter set currentValue = ");
765                    sb.append("currentValue + ");
766                    sb.append(increment);
767                    sb.append(", totalValue = totalValue + ");
768                    sb.append(increment);
769                    sb.append(" where activityCounterId = ");
770    
771                    activityCounterId = GetterUtil.getLong(activityCounter[0]);
772    
773                    sb.append(activityCounterId);
774    
775                    runSQL(sb.toString());
776            }
777    
778            private static Log _log = LogFactoryUtil.getLog(UpgradeSocial.class);
779    
780            private Map<String, Tuple> _equityToActivityMap =
781                    new HashMap<String, Tuple>();
782    
783    }