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 actionMapping, ActionForm actionForm,
084 PortletConfig portletConfig, ActionRequest actionRequest,
085 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 SessionMessages.add(
136 actionRequest,
137 PortalUtil.getPortletId(actionRequest) +
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 actionMapping, ActionForm actionForm,
151 PortletConfig portletConfig, RenderRequest renderRequest,
152 RenderResponse renderResponse)
153 throws Exception {
154
155 try {
156 ActionUtil.getQuestion(renderRequest);
157 }
158 catch (Exception e) {
159 if (e instanceof NoSuchQuestionException ||
160 e instanceof PrincipalException) {
161
162 SessionErrors.add(renderRequest, e.getClass());
163
164 return actionMapping.findForward("portlet.polls.error");
165 }
166 else {
167 throw e;
168 }
169 }
170
171 return actionMapping.findForward(
172 getForward(renderRequest, "portlet.polls.edit_question"));
173 }
174
175 protected void addAndStoreSelection(
176 PortletRequest portletRequest, 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 portletPreferences =
193 PortletPreferencesFactoryUtil.getPortletSetup(
194 layout, referringPortletResource, StringPool.BLANK);
195
196 portletPreferences.setValue(
197 "questionId", String.valueOf(question.getQuestionId()));
198
199 portletPreferences.store();
200
201 SessionMessages.add(
202 portletRequest,
203 PortalUtil.getPortletId(portletRequest) +
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 ActionResponse actionResponse)
219 throws Exception {
220
221 long questionId = ParamUtil.getLong(actionRequest, "questionId");
222
223 Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
224 actionRequest, "title");
225 Map<Locale, String> descriptionMap =
226 LocalizationUtil.getLocalizationMap(actionRequest, "description");
227
228 int expirationDateMonth = ParamUtil.getInteger(
229 actionRequest, "expirationDateMonth");
230 int expirationDateDay = ParamUtil.getInteger(
231 actionRequest, "expirationDateDay");
232 int expirationDateYear = ParamUtil.getInteger(
233 actionRequest, "expirationDateYear");
234 int expirationDateHour = ParamUtil.getInteger(
235 actionRequest, "expirationDateHour");
236 int expirationDateMinute = ParamUtil.getInteger(
237 actionRequest, "expirationDateMinute");
238 int expirationDateAmPm = ParamUtil.getInteger(
239 actionRequest, "expirationDateAmPm");
240 boolean neverExpire = ParamUtil.getBoolean(
241 actionRequest, "neverExpire");
242
243 if (expirationDateAmPm == Calendar.PM) {
244 expirationDateHour += 12;
245 }
246
247 List<PollsChoice> choices = new ArrayList<PollsChoice>();
248
249 Set<String> readParameters = new HashSet<String>();
250
251 Enumeration<String> enu = actionRequest.getParameterNames();
252
253 while (enu.hasMoreElements()) {
254 String param = enu.nextElement();
255
256 if (param.startsWith(CHOICE_DESCRIPTION_PREFIX)) {
257 try {
258 String id = param.substring(
259 CHOICE_DESCRIPTION_PREFIX.length(),
260 param.indexOf(CharPool.UNDERLINE));
261
262 if (readParameters.contains(id)) {
263 continue;
264 }
265
266 String choiceName = ParamUtil.getString(
267 actionRequest, CHOICE_NAME_PREFIX + id);
268
269 Map<Locale, String> localeChoiceDescriptionMap =
270 LocalizationUtil.getLocalizationMap(
271 actionRequest, CHOICE_DESCRIPTION_PREFIX + id);
272
273 PollsChoice choice = PollsChoiceUtil.create(0);
274
275 choice.setName(choiceName);
276 choice.setDescriptionMap(localeChoiceDescriptionMap);
277
278 choices.add(choice);
279
280 readParameters.add(id);
281 }
282 catch (Exception e) {
283 }
284 }
285 }
286
287 ServiceContext serviceContext = ServiceContextFactory.getInstance(
288 BookmarksEntry.class.getName(), actionRequest);
289
290 if (questionId <= 0) {
291
292
293
294 PollsQuestion question = PollsQuestionServiceUtil.addQuestion(
295 titleMap, descriptionMap, expirationDateMonth,
296 expirationDateDay, expirationDateYear, expirationDateHour,
297 expirationDateMinute, neverExpire, choices, serviceContext);
298
299
300
301 addAndStoreSelection(actionRequest, question);
302 }
303 else {
304
305
306
307 PollsQuestionServiceUtil.updateQuestion(
308 questionId, titleMap, descriptionMap, expirationDateMonth,
309 expirationDateDay, expirationDateYear, expirationDateHour,
310 expirationDateMinute, neverExpire, choices, serviceContext);
311 }
312 }
313
314 }