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.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.json.JSONFactoryUtil;
020    import com.liferay.portal.kernel.json.JSONObject;
021    import com.liferay.portal.kernel.util.OrderByComparator;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.model.Subscription;
024    import com.liferay.portal.model.SubscriptionConstants;
025    import com.liferay.portal.model.User;
026    import com.liferay.portal.service.base.SubscriptionLocalServiceBaseImpl;
027    import com.liferay.portal.util.PortalUtil;
028    import com.liferay.portlet.asset.model.AssetEntry;
029    import com.liferay.portlet.messageboards.model.MBMessage;
030    import com.liferay.portlet.messageboards.model.MBThread;
031    import com.liferay.portlet.social.model.SocialActivityConstants;
032    
033    import java.util.Date;
034    import java.util.List;
035    
036    /**
037     * @author Charles May
038     * @author Zsolt Berentey
039     */
040    public class SubscriptionLocalServiceImpl
041            extends SubscriptionLocalServiceBaseImpl {
042    
043            @Override
044            public Subscription addSubscription(
045                            long userId, long groupId, String className, long classPK)
046                    throws PortalException, SystemException {
047    
048                    return addSubscription(
049                            userId, groupId, className, classPK,
050                            SubscriptionConstants.FREQUENCY_INSTANT);
051            }
052    
053            @Override
054            public Subscription addSubscription(
055                            long userId, long groupId, String className, long classPK,
056                            String frequency)
057                    throws PortalException, SystemException {
058    
059                    // Subscription
060    
061                    User user = userPersistence.findByPrimaryKey(userId);
062                    long classNameId = PortalUtil.getClassNameId(className);
063                    Date now = new Date();
064    
065                    long subscriptionId = counterLocalService.increment();
066    
067                    Subscription subscription = subscriptionPersistence.fetchByC_U_C_C(
068                            user.getCompanyId(), userId, classNameId, classPK);
069    
070                    if (subscription == null) {
071                            subscription = subscriptionPersistence.create(subscriptionId);
072    
073                            subscription.setCompanyId(user.getCompanyId());
074                            subscription.setUserId(user.getUserId());
075                            subscription.setUserName(user.getFullName());
076                            subscription.setCreateDate(now);
077                            subscription.setModifiedDate(now);
078                            subscription.setClassNameId(classNameId);
079                            subscription.setClassPK(classPK);
080                            subscription.setFrequency(frequency);
081    
082                            subscriptionPersistence.update(subscription, false);
083                    }
084    
085                    if (groupId > 0) {
086    
087                            // Asset
088    
089                            try {
090                                    assetEntryLocalService.getEntry(className, classPK);
091                            }
092                            catch (Exception e) {
093                                    assetEntryLocalService.updateEntry(
094                                            userId, groupId, subscription.getCreateDate(),
095                                            subscription.getModifiedDate(), className, classPK, null, 0,
096                                            null, null, false, null, null, null, null, null,
097                                            String.valueOf(groupId), null, null, null, null, 0, 0, null,
098                                            false);
099                            }
100    
101                            // Social
102    
103                            if (className.equals(MBThread.class.getName())) {
104                                    MBThread mbThread = mbThreadLocalService.getMBThread(classPK);
105    
106                                    JSONObject extraDataJSONObject =
107                                            JSONFactoryUtil.createJSONObject();
108    
109                                    extraDataJSONObject.put("threadId", classPK);
110    
111                                    socialActivityLocalService.addActivity(
112                                            userId, groupId, MBMessage.class.getName(),
113                                            mbThread.getRootMessageId(),
114                                            SocialActivityConstants.TYPE_SUBSCRIBE,
115                                            extraDataJSONObject.toString(), 0);
116                            }
117                            else {
118                                    socialActivityLocalService.addActivity(
119                                            userId, groupId, className, classPK,
120                                            SocialActivityConstants.TYPE_SUBSCRIBE, StringPool.BLANK,
121                                            0);
122                            }
123                    }
124    
125                    return subscription;
126            }
127    
128            @Override
129            public Subscription deleteSubscription(long subscriptionId)
130                    throws PortalException, SystemException {
131    
132                    Subscription subscription = subscriptionPersistence.fetchByPrimaryKey(
133                            subscriptionId);
134    
135                    return deleteSubscription(subscription);
136            }
137    
138            @Override
139            public void deleteSubscription(long userId, String className, long classPK)
140                    throws PortalException, SystemException {
141    
142                    User user = userPersistence.findByPrimaryKey(userId);
143                    long classNameId = PortalUtil.getClassNameId(className);
144    
145                    Subscription subscription = subscriptionPersistence.findByC_U_C_C(
146                            user.getCompanyId(), userId, classNameId, classPK);
147    
148                    deleteSubscription(subscription);
149            }
150    
151            @Override
152            public Subscription deleteSubscription(Subscription subscription)
153                    throws PortalException, SystemException {
154    
155                    // Subscription
156    
157                    subscriptionPersistence.remove(subscription);
158    
159                    // Social
160    
161                    AssetEntry assetEntry = assetEntryPersistence.fetchByC_C(
162                            subscription.getClassNameId(), subscription.getClassPK());
163    
164                    if (assetEntry != null) {
165                            String className = PortalUtil.getClassName(
166                                    subscription.getClassNameId());
167    
168                            socialActivityLocalService.addActivity(
169                                    subscription.getUserId(), assetEntry.getGroupId(), className,
170                                    subscription.getClassPK(),
171                                    SocialActivityConstants.TYPE_UNSUBSCRIBE, StringPool.BLANK, 0);
172                    }
173    
174                    return subscription;
175            }
176    
177            @Override
178            public void deleteSubscriptions(long userId)
179                    throws PortalException, SystemException {
180    
181                    List<Subscription> subscriptions = subscriptionPersistence.findByUserId(
182                            userId);
183    
184                    for (Subscription subscription : subscriptions) {
185                            deleteSubscription(subscription);
186                    }
187            }
188    
189            @Override
190            public void deleteSubscriptions(
191                            long companyId, String className, long classPK)
192                    throws PortalException, SystemException {
193    
194                    long classNameId = PortalUtil.getClassNameId(className);
195    
196                    List<Subscription> subscriptions = subscriptionPersistence.findByC_C_C(
197                            companyId, classNameId, classPK);
198    
199                    for (Subscription subscription : subscriptions) {
200                            deleteSubscription(subscription);
201                    }
202            }
203    
204            @Override
205            public Subscription getSubscription(
206                            long companyId, long userId, String className, long classPK)
207                    throws PortalException, SystemException {
208    
209                    long classNameId = PortalUtil.getClassNameId(className);
210    
211                    return subscriptionPersistence.findByC_U_C_C(
212                            companyId, userId, classNameId, classPK);
213            }
214    
215            @Override
216            public List<Subscription> getSubscriptions(
217                            long companyId, String className, long classPK)
218                    throws SystemException {
219    
220                    long classNameId = PortalUtil.getClassNameId(className);
221    
222                    return subscriptionPersistence.findByC_C_C(
223                            companyId, classNameId, classPK);
224            }
225    
226            @Override
227            public List<Subscription> getUserSubscriptions(
228                            long userId, int start, int end,
229                            OrderByComparator orderByComparator)
230                    throws SystemException {
231    
232                    return subscriptionPersistence.findByUserId(
233                            userId, start, end, orderByComparator);
234            }
235    
236            @Override
237            public List<Subscription> getUserSubscriptions(
238                            long userId, String className)
239                    throws SystemException {
240    
241                    long classNameId = PortalUtil.getClassNameId(className);
242    
243                    return subscriptionPersistence.findByU_C(userId, classNameId);
244            }
245    
246            @Override
247            public int getUserSubscriptionsCount(long userId) throws SystemException {
248                    return subscriptionPersistence.countByUserId(userId);
249            }
250    
251            @Override
252            public boolean isSubscribed(
253                            long companyId, long userId, String className, long classPK)
254                    throws SystemException {
255    
256                    long classNameId = PortalUtil.getClassNameId(className);
257    
258                    Subscription subscription = subscriptionPersistence.fetchByC_U_C_C(
259                            companyId, userId, classNameId, classPK);
260    
261                    if (subscription != null) {
262                            return true;
263                    }
264                    else {
265                            return false;
266                    }
267            }
268    
269    }