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.portlet.social.model;
016    
017    import com.liferay.portal.kernel.bean.BeanPropertiesUtil;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.util.GetterUtil;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.model.User;
026    import com.liferay.portal.util.PortalUtil;
027    import com.liferay.portlet.asset.model.AssetEntry;
028    import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
029    import com.liferay.portlet.social.service.SocialActivityAchievementLocalServiceUtil;
030    import com.liferay.portlet.social.service.SocialActivityCounterLocalServiceUtil;
031    
032    /**
033     * @author Zsolt Berentey
034     */
035    public class BaseSocialAchievement implements SocialAchievement {
036    
037            public boolean equals(SocialAchievement socialAchievement) {
038                    if (Validator.equals(_name, socialAchievement.getName())) {
039                            return true;
040                    }
041    
042                    return false;
043            }
044    
045            public int getCounterIncrement() {
046                    return _counterIncrement;
047            }
048    
049            public String getCounterName() {
050                    return _counterName;
051            }
052    
053            public String getCounterOwner() {
054                    return _counterOwner;
055            }
056    
057            public int getCounterPeriodLength() {
058                    return _counterPeriodLength;
059            }
060    
061            public int getCounterThreshold() {
062                    return _counterThreshold;
063            }
064    
065            @Override
066            public String getDescriptionKey() {
067                    return _ACHIEVEMENT_DESCRIPTION_PREFIX.concat(_name);
068            }
069    
070            @Override
071            public String getIcon() {
072                    if (_icon == null) {
073                            return _name.concat(_ICON_SUFFIX);
074                    }
075    
076                    return _icon;
077            }
078    
079            @Override
080            public String getName() {
081                    return _name;
082            }
083    
084            @Override
085            public String getNameKey() {
086                    return _ACHIEVEMENT_NAME_PREFIX.concat(_name);
087            }
088    
089            @Override
090            public void initialize(SocialActivityDefinition activityDefinition) {
091                    SocialActivityCounterDefinition activityCounterDefinition =
092                            activityDefinition.getActivityCounterDefinition(_counterName);
093    
094                    if (activityCounterDefinition != null) {
095                            return;
096                    }
097    
098                    activityCounterDefinition = new SocialActivityCounterDefinition();
099    
100                    activityCounterDefinition.setEnabled(true);
101                    activityCounterDefinition.setIncrement(_counterIncrement);
102                    activityCounterDefinition.setName(_counterName);
103                    activityCounterDefinition.setOwnerType(_counterOwner);
104    
105                    if (_counterPeriodLength > 0) {
106                            activityCounterDefinition.setPeriodLength(_counterPeriodLength);
107                            activityCounterDefinition.setTransient(true);
108                    }
109    
110                    activityDefinition.addCounter(activityCounterDefinition);
111            }
112    
113            @Override
114            public void processActivity(SocialActivity activity) {
115                    try {
116                            doProcessActivity(activity);
117                    }
118                    catch (Exception e) {
119                            if (_log.isWarnEnabled()) {
120                                    _log.warn("Unable to process activity", e);
121                            }
122                    }
123            }
124    
125            public void setCounterIncrement(int counterIncrement) {
126                    _counterIncrement = counterIncrement;
127            }
128    
129            public void setCounterName(String counterName) {
130                    _counterName = counterName;
131            }
132    
133            public void setCounterOwner(String counterOwner) {
134                    _counterOwner = counterOwner;
135    
136                    if (StringUtil.equalsIgnoreCase(counterOwner, "actor")) {
137                            _ownerType = SocialActivityCounterConstants.TYPE_ACTOR;
138                    }
139                    else if (StringUtil.equalsIgnoreCase(counterOwner, "asset")) {
140                            _ownerType = SocialActivityCounterConstants.TYPE_ASSET;
141                    }
142                    else if (StringUtil.equalsIgnoreCase(counterOwner, "creator")) {
143                            _ownerType = SocialActivityCounterConstants.TYPE_CREATOR;
144                    }
145            }
146    
147            public void setCounterPeriodLength(int counterPeriodLength) {
148                    _counterPeriodLength = counterPeriodLength;
149            }
150    
151            public void setCounterThreshold(int counterThreshold) {
152                    _counterThreshold = counterThreshold;
153            }
154    
155            @Override
156            public void setIcon(String icon) {
157                    _icon = icon;
158            }
159    
160            @Override
161            public void setName(String name) {
162                    name = StringUtil.replace(name, StringPool.SPACE, StringPool.UNDERLINE);
163                    name = StringUtil.toLowerCase(name);
164    
165                    _name = StringUtil.extract(name, _NAME_SUPPORTED_CHARS);
166            }
167    
168            @Override
169            public void setProperty(String name, String value) {
170                    if (name.equals("counterIncrement") ||
171                            name.equals("counterPeriodLength") ||
172                            name.equals("counterThreshold")) {
173    
174                            BeanPropertiesUtil.setProperty(
175                                    this, name, GetterUtil.getInteger(value, 0));
176                    }
177                    else {
178                            BeanPropertiesUtil.setProperty(this, name, value);
179                    }
180            }
181    
182            protected void doProcessActivity(SocialActivity activity)
183                    throws PortalException {
184    
185                    if (_counterThreshold == 0) {
186                            return;
187                    }
188    
189                    SocialActivityAchievement achievement =
190                            SocialActivityAchievementLocalServiceUtil.fetchUserAchievement(
191                                    activity.getUserId(), activity.getGroupId(), _name);
192    
193                    if (achievement != null) {
194                            return;
195                    }
196    
197                    long classNameId = activity.getClassNameId();
198                    long classPK = activity.getClassPK();
199    
200                    if (_ownerType != SocialActivityCounterConstants.TYPE_ASSET) {
201                            classNameId = PortalUtil.getClassNameId(User.class);
202                            classPK = activity.getUserId();
203                    }
204    
205                    if (_ownerType == SocialActivityCounterConstants.TYPE_ASSET) {
206                            AssetEntry assetEntry = AssetEntryLocalServiceUtil.fetchEntry(
207                                    activity.getClassName(), activity.getClassPK());
208    
209                            if (assetEntry != null) {
210                                    classPK = assetEntry.getUserId();
211                            }
212                    }
213    
214                    SocialActivityCounter activityCounter =
215                            SocialActivityCounterLocalServiceUtil.fetchLatestActivityCounter(
216                                    activity.getGroupId(), classNameId, classPK, _counterName,
217                                    _ownerType);
218    
219                    if ((activityCounter != null) &&
220                            (activityCounter.getCurrentValue() >= _counterThreshold)) {
221    
222                            SocialActivityAchievementLocalServiceUtil.addActivityAchievement(
223                                    activity.getUserId(), activity.getGroupId(), this);
224                    }
225            }
226    
227            private static final String _ACHIEVEMENT_DESCRIPTION_PREFIX =
228                    "social.achievement.description.";
229    
230            private static final String _ACHIEVEMENT_NAME_PREFIX =
231                    "social.achievement.name.";
232    
233            private static final String _ICON_SUFFIX = "-icon.jpg";
234    
235            private static final char[] _NAME_SUPPORTED_CHARS =
236                    "abcdefghijklmnopqrstuvwxyz123456789_-.".toCharArray();
237    
238            private static final Log _log = LogFactoryUtil.getLog(
239                    BaseSocialAchievement.class);
240    
241            private int _counterIncrement = 1;
242            private String _counterName;
243            private String _counterOwner;
244            private int _counterPeriodLength =
245                    SocialActivityCounterConstants.PERIOD_LENGTH_SYSTEM;
246            private int _counterThreshold;
247            private String _icon;
248            private String _name;
249            private int _ownerType;
250    
251    }