001
014
015 package com.liferay.portlet.polls.action;
016
017 import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
018 import com.liferay.portal.kernel.portlet.LiferayWindowState;
019 import com.liferay.portal.kernel.servlet.SessionErrors;
020 import com.liferay.portal.kernel.servlet.SessionMessages;
021 import com.liferay.portal.kernel.util.CharPool;
022 import com.liferay.portal.kernel.util.Constants;
023 import com.liferay.portal.kernel.util.LocalizationUtil;
024 import com.liferay.portal.kernel.util.ParamUtil;
025 import com.liferay.portal.kernel.util.StringPool;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.model.Layout;
028 import com.liferay.portal.security.auth.PrincipalException;
029 import com.liferay.portal.service.LayoutLocalServiceUtil;
030 import com.liferay.portal.service.ServiceContext;
031 import com.liferay.portal.service.ServiceContextFactory;
032 import com.liferay.portal.struts.PortletAction;
033 import com.liferay.portal.theme.ThemeDisplay;
034 import com.liferay.portal.util.PortalUtil;
035 import com.liferay.portal.util.WebKeys;
036 import com.liferay.portlet.PortletPreferencesFactoryUtil;
037 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
038 import com.liferay.portlet.polls.DuplicateVoteException;
039 import com.liferay.portlet.polls.NoSuchChoiceException;
040 import com.liferay.portlet.polls.NoSuchQuestionException;
041 import com.liferay.portlet.polls.QuestionChoiceException;
042 import com.liferay.portlet.polls.QuestionDescriptionException;
043 import com.liferay.portlet.polls.QuestionExpirationDateException;
044 import com.liferay.portlet.polls.QuestionExpiredException;
045 import com.liferay.portlet.polls.QuestionTitleException;
046 import com.liferay.portlet.polls.model.PollsChoice;
047 import com.liferay.portlet.polls.model.PollsQuestion;
048 import com.liferay.portlet.polls.service.PollsQuestionServiceUtil;
049 import com.liferay.portlet.polls.service.persistence.PollsChoiceUtil;
050
051 import java.util.ArrayList;
052 import java.util.Calendar;
053 import java.util.Enumeration;
054 import java.util.HashSet;
055 import java.util.List;
056 import java.util.Locale;
057 import java.util.Map;
058 import java.util.Set;
059
060 import javax.portlet.ActionRequest;
061 import javax.portlet.ActionResponse;
062 import javax.portlet.PortletConfig;
063 import javax.portlet.PortletPreferences;
064 import javax.portlet.PortletRequest;
065 import javax.portlet.RenderRequest;
066 import javax.portlet.RenderResponse;
067 import javax.portlet.WindowState;
068
069 import org.apache.struts.action.ActionForm;
070 import org.apache.struts.action.ActionForward;
071 import org.apache.struts.action.ActionMapping;
072
073
076 public class EditQuestionAction extends PortletAction {
077
078 public static final String CHOICE_DESCRIPTION_PREFIX = "choiceDescription";
079
080 public static final String CHOICE_NAME_PREFIX = "choiceName";
081
082 @Override
083 public void processAction(
084 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
085 ActionRequest actionRequest, ActionResponse actionResponse)
086 throws Exception {
087
088 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
089
090 try {
091 if (Validator.isNull(cmd)) {
092 return;
093 }
094 else if (cmd.equals(Constants.ADD) ||
095 cmd.equals(Constants.UPDATE) ||
096 cmd.equals(Constants.VOTE)) {
097
098 updateQuestion(portletConfig, actionRequest, actionResponse);
099 }
100 else if (cmd.equals(Constants.DELETE)) {
101 deleteQuestion(actionRequest);
102 }
103
104 WindowState windowState = actionRequest.getWindowState();
105
106 if (windowState.equals(LiferayWindowState.POP_UP)) {
107 String redirect = PortalUtil.escapeRedirect(
108 ParamUtil.getString(actionRequest, "redirect"));
109
110 if (Validator.isNotNull(redirect)) {
111 actionResponse.sendRedirect(redirect);
112 }
113 }
114 else {
115 sendRedirect(actionRequest, actionResponse);
116 }
117 }
118 catch (Exception e) {
119 if (e instanceof NoSuchQuestionException ||
120 e instanceof PrincipalException) {
121
122 SessionErrors.add(actionRequest, e.getClass());
123
124 setForward(actionRequest, "portlet.polls.error");
125 }
126 else if (e instanceof DuplicateVoteException ||
127 e instanceof NoSuchChoiceException ||
128 e instanceof QuestionChoiceException ||
129 e instanceof QuestionDescriptionException ||
130 e instanceof QuestionExpirationDateException ||
131 e instanceof QuestionTitleException) {
132
133 SessionErrors.add(actionRequest, e.getClass());
134
135 LiferayPortletConfig liferayPortletConfig =
136 (LiferayPortletConfig)portletConfig;
137
138 SessionMessages.add(
139 actionRequest,
140 liferayPortletConfig.getPortletId() +
141 SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
142 }
143 else if (e instanceof QuestionExpiredException) {
144 }
145 else {
146 throw e;
147 }
148 }
149 }
150
151 @Override
152 public ActionForward render(
153 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
154 RenderRequest renderRequest, RenderResponse renderResponse)
155 throws Exception {
156
157 try {
158 ActionUtil.getQuestion(renderRequest);
159 }
160 catch (Exception e) {
161 if (e instanceof NoSuchQuestionException ||
162 e instanceof PrincipalException) {
163
164 SessionErrors.add(renderRequest, e.getClass());
165
166 return mapping.findForward("portlet.polls.error");
167 }
168 else {
169 throw e;
170 }
171 }
172
173 return mapping.findForward(
174 getForward(renderRequest, "portlet.polls.edit_question"));
175 }
176
177 protected void addAndStoreSelection(
178 PortletConfig portletConfig, PortletRequest portletRequest,
179 PollsQuestion question)
180 throws Exception {
181
182 String referringPortletResource = ParamUtil.getString(
183 portletRequest, "referringPortletResource");
184
185 if (Validator.isNull(referringPortletResource)) {
186 return;
187 }
188
189 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
190 WebKeys.THEME_DISPLAY);
191
192 Layout layout = LayoutLocalServiceUtil.getLayout(
193 themeDisplay.getRefererPlid());
194
195 PortletPreferences preferences =
196 PortletPreferencesFactoryUtil.getPortletSetup(
197 layout, referringPortletResource, StringPool.BLANK);
198
199 preferences.setValue(
200 "questionId", String.valueOf(question.getQuestionId()));
201
202 preferences.store();
203
204 LiferayPortletConfig liferayPortletConfig =
205 (LiferayPortletConfig)portletConfig;
206
207 SessionMessages.add(
208 portletRequest,
209 liferayPortletConfig.getPortletId() +
210 SessionMessages.KEY_SUFFIX_REFRESH_PORTLET,
211 referringPortletResource);
212 }
213
214 protected void deleteQuestion(ActionRequest actionRequest)
215 throws Exception {
216
217 long questionId = ParamUtil.getLong(actionRequest, "questionId");
218
219 PollsQuestionServiceUtil.deleteQuestion(questionId);
220 }
221
222 protected void updateQuestion(
223 PortletConfig portletConfig, ActionRequest actionRequest,
224 ActionResponse actionResponse)
225 throws Exception {
226
227 long questionId = ParamUtil.getLong(actionRequest, "questionId");
228
229 Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
230 actionRequest, "title");
231 Map<Locale, String> descriptionMap =
232 LocalizationUtil.getLocalizationMap(actionRequest, "description");
233
234 int expirationDateMonth = ParamUtil.getInteger(
235 actionRequest, "expirationDateMonth");
236 int expirationDateDay = ParamUtil.getInteger(
237 actionRequest, "expirationDateDay");
238 int expirationDateYear = ParamUtil.getInteger(
239 actionRequest, "expirationDateYear");
240 int expirationDateHour = ParamUtil.getInteger(
241 actionRequest, "expirationDateHour");
242 int expirationDateMinute = ParamUtil.getInteger(
243 actionRequest, "expirationDateMinute");
244 int expirationDateAmPm = ParamUtil.getInteger(
245 actionRequest, "expirationDateAmPm");
246 boolean neverExpire = ParamUtil.getBoolean(
247 actionRequest, "neverExpire");
248
249 if (expirationDateAmPm == Calendar.PM) {
250 expirationDateHour += 12;
251 }
252
253 List<PollsChoice> choices = new ArrayList<PollsChoice>();
254
255 Set<String> readParameters = new HashSet<String>();
256
257 Enumeration<String> enu = actionRequest.getParameterNames();
258
259 while (enu.hasMoreElements()) {
260 String param = enu.nextElement();
261
262 if (param.startsWith(CHOICE_DESCRIPTION_PREFIX)) {
263 try {
264 String id = param.substring(
265 CHOICE_DESCRIPTION_PREFIX.length(),
266 param.indexOf(CharPool.UNDERLINE));
267
268 if (readParameters.contains(id)) {
269 continue;
270 }
271
272 String choiceName = ParamUtil.getString(
273 actionRequest, CHOICE_NAME_PREFIX + id);
274
275 Map<Locale, String> localeChoiceDescriptionMap =
276 LocalizationUtil.getLocalizationMap(
277 actionRequest, CHOICE_DESCRIPTION_PREFIX + id);
278
279 PollsChoice choice = PollsChoiceUtil.create(0);
280
281 choice.setName(choiceName);
282 choice.setDescriptionMap(localeChoiceDescriptionMap);
283
284 choices.add(choice);
285
286 readParameters.add(id);
287 }
288 catch (Exception e) {
289 }
290 }
291 }
292
293 ServiceContext serviceContext = ServiceContextFactory.getInstance(
294 BookmarksEntry.class.getName(), actionRequest);
295
296 if (questionId <= 0) {
297
298
299
300 PollsQuestion question = PollsQuestionServiceUtil.addQuestion(
301 titleMap, descriptionMap, expirationDateMonth,
302 expirationDateDay, expirationDateYear, expirationDateHour,
303 expirationDateMinute, neverExpire, choices, serviceContext);
304
305
306
307 addAndStoreSelection(portletConfig, actionRequest, question);
308 }
309 else {
310
311
312
313 PollsQuestionServiceUtil.updateQuestion(
314 questionId, titleMap, descriptionMap, expirationDateMonth,
315 expirationDateDay, expirationDateYear, expirationDateHour,
316 expirationDateMinute, neverExpire, choices, serviceContext);
317 }
318 }
319
320 }