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 e instanceof QuestionTitleException) {
131
132 SessionErrors.add(actionRequest, e.getClass().getName());
133
134 SessionMessages.add(
135 actionRequest,
136 portletConfig.getPortletName() +
137 SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
138 }
139 else if (e instanceof QuestionExpiredException) {
140 }
141 else {
142 throw e;
143 }
144 }
145 }
146
147 @Override
148 public ActionForward render(
149 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
150 RenderRequest renderRequest, 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().getName());
161
162 return mapping.findForward("portlet.polls.error");
163 }
164 else {
165 throw e;
166 }
167 }
168
169 return mapping.findForward(
170 getForward(renderRequest, "portlet.polls.edit_question"));
171 }
172
173 protected void addAndStoreSelection(
174 PortletConfig portletConfig, PortletRequest portletRequest,
175 PollsQuestion question)
176 throws Exception {
177
178 String referringPortletResource = ParamUtil.getString(
179 portletRequest, "referringPortletResource");
180
181 if (Validator.isNull(referringPortletResource)) {
182 return;
183 }
184
185 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
186 WebKeys.THEME_DISPLAY);
187
188 Layout layout = LayoutLocalServiceUtil.getLayout(
189 themeDisplay.getRefererPlid());
190
191 PortletPreferences preferences =
192 PortletPreferencesFactoryUtil.getPortletSetup(
193 layout, referringPortletResource, StringPool.BLANK);
194
195 preferences.setValue(
196 "questionId", String.valueOf(question.getQuestionId()));
197
198 preferences.store();
199
200 SessionMessages.add(
201 portletRequest,
202 portletConfig.getPortletName() +
203 SessionMessages.KEY_SUFFIX_REFRESH_PORTLET,
204 referringPortletResource);
205 }
206
207 protected void deleteQuestion(ActionRequest actionRequest)
208 throws Exception {
209
210 long questionId = ParamUtil.getLong(actionRequest, "questionId");
211
212 PollsQuestionServiceUtil.deleteQuestion(questionId);
213 }
214
215 protected void updateQuestion(
216 PortletConfig portletConfig, ActionRequest actionRequest)
217 throws Exception {
218
219 long questionId = ParamUtil.getLong(actionRequest, "questionId");
220
221 Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
222 actionRequest, "title");
223 Map<Locale, String> descriptionMap =
224 LocalizationUtil.getLocalizationMap(actionRequest, "description");
225
226 int expirationDateMonth = ParamUtil.getInteger(
227 actionRequest, "expirationDateMonth");
228 int expirationDateDay = ParamUtil.getInteger(
229 actionRequest, "expirationDateDay");
230 int expirationDateYear = ParamUtil.getInteger(
231 actionRequest, "expirationDateYear");
232 int expirationDateHour = ParamUtil.getInteger(
233 actionRequest, "expirationDateHour");
234 int expirationDateMinute = ParamUtil.getInteger(
235 actionRequest, "expirationDateMinute");
236 int expirationDateAmPm = ParamUtil.getInteger(
237 actionRequest, "expirationDateAmPm");
238 boolean neverExpire = ParamUtil.getBoolean(
239 actionRequest, "neverExpire");
240
241 if (expirationDateAmPm == Calendar.PM) {
242 expirationDateHour += 12;
243 }
244
245 List<PollsChoice> choices = new ArrayList<PollsChoice>();
246
247 Set<String> readParameters = new HashSet<String>();
248
249 Enumeration<String> enu = actionRequest.getParameterNames();
250
251 while (enu.hasMoreElements()) {
252 String param = enu.nextElement();
253
254 if (param.startsWith(CHOICE_DESCRIPTION_PREFIX)) {
255 try {
256 String id = param.substring(
257 CHOICE_DESCRIPTION_PREFIX.length(),
258 param.indexOf(CharPool.UNDERLINE));
259
260 if (readParameters.contains(id)) {
261 continue;
262 }
263
264 String choiceName = ParamUtil.getString(
265 actionRequest, CHOICE_NAME_PREFIX + id);
266
267 Map<Locale, String> localeChoiceDescriptionMap =
268 LocalizationUtil.getLocalizationMap(
269 actionRequest, CHOICE_DESCRIPTION_PREFIX + id);
270
271 PollsChoice choice = PollsChoiceUtil.create(0);
272
273 choice.setName(choiceName);
274 choice.setDescriptionMap(localeChoiceDescriptionMap);
275
276 choices.add(choice);
277
278 readParameters.add(id);
279 }
280 catch (Exception e) {
281 }
282 }
283 }
284
285 ServiceContext serviceContext = ServiceContextFactory.getInstance(
286 BookmarksEntry.class.getName(), actionRequest);
287
288 if (questionId <= 0) {
289
290
291
292 PollsQuestion question = PollsQuestionServiceUtil.addQuestion(
293 titleMap, descriptionMap, expirationDateMonth,
294 expirationDateDay, expirationDateYear, expirationDateHour,
295 expirationDateMinute, neverExpire, choices, serviceContext);
296
297
298
299 addAndStoreSelection(portletConfig, actionRequest, question);
300 }
301 else {
302
303
304
305 PollsQuestionServiceUtil.updateQuestion(
306 questionId, titleMap, descriptionMap, expirationDateMonth,
307 expirationDateDay, expirationDateYear, expirationDateHour,
308 expirationDateMinute, neverExpire, choices, serviceContext);
309 }
310 }
311
312 }