001    /**
002     * Copyright (c) 2000-2011 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.service.impl;
016    
017    import com.liferay.portal.kernel.cache.MultiVMPoolUtil;
018    import com.liferay.portal.kernel.cache.PortalCache;
019    import com.liferay.portal.kernel.exception.PortalException;
020    import com.liferay.portal.kernel.exception.SystemException;
021    import com.liferay.portal.kernel.util.ListUtil;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.model.Group;
025    import com.liferay.portal.security.permission.ResourceActionsUtil;
026    import com.liferay.portal.util.PortalUtil;
027    import com.liferay.portlet.social.model.SocialEquityActionMapping;
028    import com.liferay.portlet.social.model.SocialEquitySetting;
029    import com.liferay.portlet.social.model.SocialEquitySettingConstants;
030    import com.liferay.portlet.social.model.impl.SocialEquitySettingImpl;
031    import com.liferay.portlet.social.service.base.SocialEquitySettingLocalServiceBaseImpl;
032    
033    import java.util.Collections;
034    import java.util.List;
035    
036    /**
037     * @author Zsolt Berentey
038     * @author Brian Wing Shun Chan
039     */
040    public class SocialEquitySettingLocalServiceImpl
041            extends SocialEquitySettingLocalServiceBaseImpl {
042    
043            public static final String CACHE_NAME =
044                    SocialEquitySettingLocalServiceImpl.class.getName();
045    
046            public List<SocialEquitySetting> getEquitySettings(
047                            long groupId, String className, String actionId)
048                    throws SystemException {
049    
050                    long classNameId = PortalUtil.getClassNameId(className);
051    
052                    return getEquitySettings(groupId, classNameId, actionId);
053            }
054    
055            public List<SocialEquitySetting> getEquitySettings(
056                            long groupId, long classNameId, String actionId)
057                    throws SystemException {
058    
059                    String key = encodeKey(classNameId, actionId);
060    
061                    List<SocialEquitySetting> socialEquitySettings =
062                            (List<SocialEquitySetting>)_portalCache.get(key);
063    
064                    if (socialEquitySettings != null) {
065                            return socialEquitySettings;
066                    }
067    
068                    String className = PortalUtil.getClassName(classNameId);
069    
070                    SocialEquityActionMapping equityActionMapping =
071                            ResourceActionsUtil.getSocialEquityActionMapping(
072                                    className, actionId);
073    
074                    if (equityActionMapping == null) {
075                            socialEquitySettings = Collections.EMPTY_LIST;
076    
077                            _portalCache.put(key, socialEquitySettings);
078    
079                            return socialEquitySettings;
080                    }
081    
082                    List<SocialEquitySetting> equitySettings =
083                            socialEquitySettingPersistence.findByG_C_A(
084                                    groupId, classNameId, actionId);
085    
086                    equitySettings = ListUtil.copy(equitySettings);
087    
088                    if (equitySettings.isEmpty()) {
089                            if (equityActionMapping.getInformationValue() > 0) {
090                                    SocialEquitySetting informationEquitySetting =
091                                            getInformationEquitySetting(actionId, equityActionMapping);
092    
093                                    equitySettings.add(informationEquitySetting);
094                            }
095    
096                            if (equityActionMapping.getParticipationValue() > 0) {
097                                    SocialEquitySetting participationEquitySetting =
098                                            getParticipationEquitySetting(
099                                                    actionId, equityActionMapping);
100    
101                                    equitySettings.add(participationEquitySetting);
102                            }
103                    }
104                    else if (equitySettings.size() == 1) {
105                            SocialEquitySetting equitySetting = equitySettings.get(0);
106    
107                            if ((equityActionMapping.getInformationValue() > 0) &&
108                                    (equitySetting.getType() ==
109                                            SocialEquitySettingConstants.TYPE_PARTICIPATION)) {
110    
111                                    SocialEquitySetting informationEquitySetting =
112                                            getInformationEquitySetting(actionId, equityActionMapping);
113    
114                                    equitySettings.add(informationEquitySetting);
115                            }
116                            else if ((equityActionMapping.getParticipationValue() > 0) &&
117                                             (equitySetting.getType() ==
118                                                    SocialEquitySettingConstants.TYPE_INFORMATION)) {
119    
120                                    SocialEquitySetting participationEquitySetting =
121                                            getParticipationEquitySetting(
122                                                    actionId, equityActionMapping);
123    
124                                    equitySettings.add(participationEquitySetting);
125                            }
126                    }
127    
128                    _portalCache.put(key, socialEquitySettings);
129    
130                    return equitySettings;
131            }
132    
133            public void updateEquitySettings(
134                            long groupId, String className,
135                            List<SocialEquityActionMapping> equityActionMappings)
136                    throws PortalException, SystemException {
137    
138                    for (SocialEquityActionMapping equityActionMapping :
139                                    equityActionMappings) {
140    
141                            updateEquitySettings(groupId, className, equityActionMapping);
142                    }
143            }
144    
145            protected String encodeKey(long classNameId, String actionId) {
146                    StringBundler sb = new StringBundler(5);
147    
148                    sb.append(CACHE_NAME);
149                    sb.append(StringPool.POUND);
150                    sb.append(classNameId);
151                    sb.append(StringPool.POUND);
152                    sb.append(actionId);
153    
154                    return sb.toString();
155            }
156    
157            protected SocialEquitySetting getInformationEquitySetting(
158                    String actionId, SocialEquityActionMapping equityActionMapping) {
159    
160                    SocialEquitySetting equitySetting = new SocialEquitySettingImpl();
161    
162                    equitySetting.setActionId(actionId);
163                    equitySetting.setDailyLimit(
164                            equityActionMapping.getInformationDailyLimit());
165                    equitySetting.setLifespan(equityActionMapping.getInformationLifespan());
166                    equitySetting.setType(SocialEquitySettingConstants.TYPE_INFORMATION);
167                    equitySetting.setUniqueEntry(equityActionMapping.isUnique());
168                    equitySetting.setValue(equityActionMapping.getInformationValue());
169    
170                    return equitySetting;
171            }
172    
173            protected SocialEquitySetting getParticipationEquitySetting(
174                    String actionId, SocialEquityActionMapping equityActionMapping) {
175    
176                    SocialEquitySetting equitySetting = new SocialEquitySettingImpl();
177    
178                    equitySetting.setActionId(actionId);
179                    equitySetting.setDailyLimit(
180                            equityActionMapping.getParticipationDailyLimit());
181                    equitySetting.setLifespan(
182                            equityActionMapping.getParticipationLifespan());
183                    equitySetting.setType(SocialEquitySettingConstants.TYPE_PARTICIPATION);
184                    equitySetting.setUniqueEntry(
185                            equityActionMapping.isUnique());
186                    equitySetting.setValue(equityActionMapping.getParticipationValue());
187    
188                    return equitySetting;
189            }
190    
191            protected void updateEquitySettings(
192                            long groupId, String className,
193                            SocialEquityActionMapping equityActionMapping)
194                    throws PortalException, SystemException {
195    
196                    long classNameId = PortalUtil.getClassNameId(className);
197    
198                    List<SocialEquitySetting> equitySettings = getEquitySettings(
199                            groupId, className, equityActionMapping.getActionId());
200    
201                    for (SocialEquitySetting equitySetting : equitySettings) {
202                            if (!equityActionMapping.equals(equitySetting)) {
203                                    equitySetting.update(equityActionMapping);
204    
205                                    if (equitySetting.getPrimaryKey() == 0) {
206                                            Group group = groupLocalService.getGroup(groupId);
207    
208                                            equitySetting.setEquitySettingId(
209                                                    counterLocalService.increment());
210                                            equitySetting.setGroupId(groupId);
211                                            equitySetting.setCompanyId(group.getCompanyId());
212                                            equitySetting.setClassNameId(classNameId);
213                                    }
214    
215                                    socialEquitySettingPersistence.update(equitySetting, false);
216                            }
217                    }
218    
219                    String key = encodeKey(classNameId, equityActionMapping.getActionId());
220    
221                    _portalCache.remove(key);
222            }
223    
224            private static PortalCache _portalCache = MultiVMPoolUtil.getCache(
225                    CACHE_NAME);
226    
227    }