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