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.portlet.socialactivity.action;
016    
017    import com.liferay.portal.kernel.json.JSONArray;
018    import com.liferay.portal.kernel.json.JSONFactoryUtil;
019    import com.liferay.portal.kernel.json.JSONObject;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.util.Constants;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.security.auth.PrincipalException;
025    import com.liferay.portal.security.permission.comparator.ModelResourceComparator;
026    import com.liferay.portal.struts.PortletAction;
027    import com.liferay.portal.theme.ThemeDisplay;
028    import com.liferay.portal.util.WebKeys;
029    import com.liferay.portlet.social.model.SocialActivityCounterConstants;
030    import com.liferay.portlet.social.model.SocialActivityCounterDefinition;
031    import com.liferay.portlet.social.model.SocialActivityDefinition;
032    import com.liferay.portlet.social.model.SocialActivitySetting;
033    import com.liferay.portlet.social.service.SocialActivitySettingServiceUtil;
034    import com.liferay.portlet.social.util.SocialConfigurationUtil;
035    
036    import java.util.ArrayList;
037    import java.util.Arrays;
038    import java.util.Comparator;
039    import java.util.LinkedHashMap;
040    import java.util.List;
041    import java.util.Map;
042    
043    import javax.portlet.ActionRequest;
044    import javax.portlet.ActionResponse;
045    import javax.portlet.PortletConfig;
046    import javax.portlet.RenderRequest;
047    import javax.portlet.RenderResponse;
048    
049    import org.apache.struts.action.ActionForm;
050    import org.apache.struts.action.ActionForward;
051    import org.apache.struts.action.ActionMapping;
052    
053    /**
054     * @author Zsolt Szabó
055     * @author Zsolt Berentey
056     */
057    public class ViewAction extends PortletAction {
058    
059            @Override
060            public void processAction(
061                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
062                            ActionRequest actionRequest, ActionResponse actionResponse)
063                    throws Exception {
064    
065                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
066    
067                    try {
068                            if (cmd.equals(Constants.UPDATE)) {
069                                    updateActivitySettings(actionRequest);
070                            }
071    
072                            sendRedirect(actionRequest, actionResponse);
073                    }
074                    catch (Exception e) {
075                            if (e instanceof PrincipalException) {
076                                    SessionErrors.add(actionRequest, e.getClass());
077                            }
078                            else {
079                                    throw e;
080                            }
081                    }
082            }
083    
084            @Override
085            public ActionForward render(
086                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
087                            RenderRequest renderRequest, RenderResponse renderResponse)
088                    throws Exception {
089    
090                    ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
091                            WebKeys.THEME_DISPLAY);
092    
093                    try {
094                            renderRequest.setAttribute(
095                                    WebKeys.SOCIAL_ACTIVITY_SETTINGS_MAP,
096                                    getActivitySettingsMap(themeDisplay));
097                    }
098                    catch (Exception e) {
099                            if (e instanceof PrincipalException) {
100                                    SessionErrors.add(renderRequest, e.getClass());
101    
102                                    return mapping.findForward("portlet.social_activity.error");
103                            }
104                            else {
105                                    throw e;
106                            }
107                    }
108    
109                    return mapping.findForward("portlet.social_activity.view");
110            }
111    
112            protected Map<String, Boolean> getActivitySettingsMap(
113                            ThemeDisplay themeDisplay)
114                    throws Exception {
115    
116                    Map<String, Boolean> activitySettingsMap =
117                            new LinkedHashMap<String, Boolean>();
118    
119                    List<SocialActivitySetting> activitySettings =
120                            SocialActivitySettingServiceUtil.getActivitySettings(
121                                    themeDisplay.getSiteGroupIdOrLiveGroupId());
122    
123                    String[] modelNames = SocialConfigurationUtil.getActivityModelNames();
124    
125                    Comparator<String> comparator = new ModelResourceComparator(
126                            themeDisplay.getLocale());
127    
128                    Arrays.sort(modelNames, comparator);
129    
130                    for (String modelName : modelNames) {
131                            List<SocialActivityDefinition> activityDefinitions =
132                                    SocialActivitySettingServiceUtil.getActivityDefinitions(
133                                            themeDisplay.getScopeGroupId(), modelName);
134    
135                            for (SocialActivityDefinition activityDefinition :
136                                            activityDefinitions) {
137    
138                                    if (activityDefinition.isCountersEnabled()) {
139                                            activitySettingsMap.put(modelName, false);
140    
141                                            break;
142                                    }
143                            }
144                    }
145    
146                    for (SocialActivitySetting activitySetting : activitySettings) {
147                            String name = activitySetting.getName();
148    
149                            if (name.equals("enabled") &&
150                                    activitySettingsMap.containsKey(
151                                            activitySetting.getClassName())) {
152    
153                                    activitySettingsMap.put(
154                                            activitySetting.getClassName(),
155                                            GetterUtil.getBoolean(activitySetting.getValue()));
156                            }
157                    }
158    
159                    return activitySettingsMap;
160            }
161    
162            protected SocialActivityCounterDefinition updateActivityCounterDefinition(
163                    JSONObject actionJSONObject,
164                    SocialActivityDefinition activityDefinition,
165                    String activityCounterName) {
166    
167                    SocialActivityCounterDefinition activityCounterDefinition =
168                            activityDefinition.getActivityCounterDefinition(
169                                    activityCounterName);
170    
171                    if (activityCounterDefinition == null) {
172                            activityCounterDefinition = new SocialActivityCounterDefinition();
173    
174                            activityCounterDefinition.setName(activityCounterName);
175                    }
176    
177                    if (activityCounterName.equals(
178                                    SocialActivityCounterConstants.NAME_CONTRIBUTION)) {
179    
180                            activityCounterDefinition.setOwnerType(
181                                    SocialActivityCounterConstants.TYPE_CREATOR);
182                    }
183                    else if (activityCounterName.equals(
184                                            SocialActivityCounterConstants.NAME_PARTICIPATION)) {
185    
186                            activityCounterDefinition.setOwnerType(
187                                    SocialActivityCounterConstants.TYPE_ACTOR);
188                    }
189                    else if (activityCounterName.equals(
190                                            SocialActivityCounterConstants.NAME_POPULARITY)) {
191    
192                            activityCounterDefinition.setOwnerType(
193                                    SocialActivityCounterConstants.TYPE_ASSET);
194    
195                            activityCounterName =
196                                    SocialActivityCounterConstants.NAME_CONTRIBUTION;
197                    }
198                    else {
199                            throw new IllegalArgumentException();
200                    }
201    
202                    activityCounterDefinition.setEnabled(
203                            actionJSONObject.getBoolean("active"));
204                    activityCounterDefinition.setIncrement(
205                            actionJSONObject.getInt(activityCounterName + "Increment"));
206                    activityCounterDefinition.setLimitPeriod(
207                            actionJSONObject.getInt(activityCounterName + "LimitPeriod"));
208                    activityCounterDefinition.setLimitValue(
209                            actionJSONObject.getInt(activityCounterName + "LimitValue"));
210    
211                    return activityCounterDefinition;
212            }
213    
214            protected void updateActivitySettings(ActionRequest actionRequest)
215                    throws Exception {
216    
217                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
218                            WebKeys.THEME_DISPLAY);
219    
220                    String settingsJSON = ParamUtil.getString(
221                            actionRequest, "settingsJSON");
222    
223                    JSONObject settingsJSONObject = JSONFactoryUtil.createJSONObject(
224                            settingsJSON);
225    
226                    JSONArray actionsJSONArray = settingsJSONObject.getJSONArray("actions");
227    
228                    String modelName = settingsJSONObject.getString("modelName");
229    
230                    for (int i = 0; i < actionsJSONArray.length(); i++) {
231                            JSONObject actionJSONObject = actionsJSONArray.getJSONObject(i);
232    
233                            int activityType = actionJSONObject.getInt("activityType");
234    
235                            SocialActivityDefinition activityDefinition =
236                                    SocialActivitySettingServiceUtil.getActivityDefinition(
237                                            themeDisplay.getSiteGroupIdOrLiveGroupId(), modelName,
238                                            activityType);
239    
240                            if (activityDefinition == null) {
241                                    continue;
242                            }
243    
244                            List<SocialActivityCounterDefinition> activityCounterDefinitions =
245                                    new ArrayList<SocialActivityCounterDefinition>();
246    
247                            activityCounterDefinitions.add(
248                                    updateActivityCounterDefinition(
249                                            actionJSONObject, activityDefinition,
250                                            SocialActivityCounterConstants.NAME_CONTRIBUTION));
251    
252                            activityCounterDefinitions.add(
253                                    updateActivityCounterDefinition(
254                                            actionJSONObject, activityDefinition,
255                                            SocialActivityCounterConstants.NAME_PARTICIPATION));
256    
257                            activityCounterDefinitions.add(
258                                    updateActivityCounterDefinition(
259                                            actionJSONObject, activityDefinition,
260                                            SocialActivityCounterConstants.NAME_POPULARITY));
261    
262                            SocialActivitySettingServiceUtil.updateActivitySettings(
263                                    themeDisplay.getSiteGroupIdOrLiveGroupId(), modelName,
264                                    activityType, activityCounterDefinitions);
265                    }
266            }
267    
268    }