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