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