1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.polls.service.impl;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.kernel.util.Validator;
28  import com.liferay.portal.model.ResourceConstants;
29  import com.liferay.portal.model.User;
30  import com.liferay.portal.util.PortalUtil;
31  import com.liferay.portlet.polls.QuestionChoiceException;
32  import com.liferay.portlet.polls.QuestionDescriptionException;
33  import com.liferay.portlet.polls.QuestionExpirationDateException;
34  import com.liferay.portlet.polls.QuestionTitleException;
35  import com.liferay.portlet.polls.model.PollsChoice;
36  import com.liferay.portlet.polls.model.PollsQuestion;
37  import com.liferay.portlet.polls.service.base.PollsQuestionLocalServiceBaseImpl;
38  
39  import java.util.Date;
40  import java.util.List;
41  
42  /**
43   * <a href="PollsQuestionLocalServiceImpl.java.html"><b><i>View Source</i></b>
44   * </a>
45   *
46   * @author Brian Wing Shun Chan
47   *
48   */
49  public class PollsQuestionLocalServiceImpl
50      extends PollsQuestionLocalServiceBaseImpl {
51  
52      public PollsQuestion addQuestion(
53              long userId, long plid, String title, String description,
54              int expirationDateMonth, int expirationDateDay,
55              int expirationDateYear, int expirationDateHour,
56              int expirationDateMinute, boolean neverExpire,
57              boolean addCommunityPermissions, boolean addGuestPermissions)
58          throws PortalException, SystemException {
59  
60          return addQuestion(
61              null, userId, plid, title, description, expirationDateMonth,
62              expirationDateDay, expirationDateYear, expirationDateHour,
63              expirationDateMinute, neverExpire, null,
64              Boolean.valueOf(addCommunityPermissions),
65              Boolean.valueOf(addGuestPermissions), null, null);
66      }
67  
68      public PollsQuestion addQuestion(
69              String uuid, long userId, long plid, String title,
70              String description, int expirationDateMonth, int expirationDateDay,
71              int expirationDateYear, int expirationDateHour,
72              int expirationDateMinute, boolean neverExpire,
73              boolean addCommunityPermissions, boolean addGuestPermissions)
74          throws PortalException, SystemException {
75  
76          return addQuestion(
77              uuid, userId, plid, title, description, expirationDateMonth,
78              expirationDateDay, expirationDateYear, expirationDateHour,
79              expirationDateMinute, neverExpire, null,
80              Boolean.valueOf(addCommunityPermissions),
81              Boolean.valueOf(addGuestPermissions), null, null);
82      }
83  
84      public PollsQuestion addQuestion(
85              long userId, long plid, String title, String description,
86              int expirationDateMonth, int expirationDateDay,
87              int expirationDateYear, int expirationDateHour,
88              int expirationDateMinute, boolean neverExpire,
89              List<PollsChoice> choices, boolean addCommunityPermissions,
90              boolean addGuestPermissions)
91          throws PortalException, SystemException {
92  
93          return addQuestion(
94              null, userId, plid, title, description, expirationDateMonth,
95              expirationDateDay, expirationDateYear, expirationDateHour,
96              expirationDateMinute, neverExpire, choices,
97              Boolean.valueOf(addCommunityPermissions),
98              Boolean.valueOf(addGuestPermissions), null, null);
99      }
100 
101     public PollsQuestion addQuestion(
102             long userId, long plid, String title, String description,
103             int expirationDateMonth, int expirationDateDay,
104             int expirationDateYear, int expirationDateHour,
105             int expirationDateMinute, boolean neverExpire,
106             List<PollsChoice> choices, String[] communityPermissions,
107             String[] guestPermissions)
108         throws PortalException, SystemException {
109 
110         return addQuestion(
111             null, userId, plid, title, description, expirationDateMonth,
112             expirationDateDay, expirationDateYear, expirationDateHour,
113             expirationDateMinute, neverExpire, choices, null, null,
114             communityPermissions, guestPermissions);
115     }
116 
117     public PollsQuestion addQuestion(
118             String uuid, long userId, long plid, String title,
119             String description, int expirationDateMonth, int expirationDateDay,
120             int expirationDateYear, int expirationDateHour,
121             int expirationDateMinute, boolean neverExpire,
122             List<PollsChoice> choices, Boolean addCommunityPermissions,
123             Boolean addGuestPermissions, String[] communityPermissions,
124             String[] guestPermissions)
125         throws PortalException, SystemException {
126 
127         // Question
128 
129         User user = userPersistence.findByPrimaryKey(userId);
130         long groupId = PortalUtil.getPortletGroupId(plid);
131 
132         Date expirationDate = null;
133 
134         if (!neverExpire) {
135             expirationDate = PortalUtil.getDate(
136                 expirationDateMonth, expirationDateDay, expirationDateYear,
137                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
138                 new QuestionExpirationDateException());
139         }
140 
141         Date now = new Date();
142 
143         validate(title, description, choices);
144 
145         long questionId = counterLocalService.increment();
146 
147         PollsQuestion question = pollsQuestionPersistence.create(questionId);
148 
149         question.setUuid(uuid);
150         question.setGroupId(groupId);
151         question.setCompanyId(user.getCompanyId());
152         question.setUserId(user.getUserId());
153         question.setUserName(user.getFullName());
154         question.setCreateDate(now);
155         question.setModifiedDate(now);
156         question.setTitle(title);
157         question.setDescription(description);
158         question.setExpirationDate(expirationDate);
159 
160         pollsQuestionPersistence.update(question, false);
161 
162         // Resources
163 
164         if ((addCommunityPermissions != null) &&
165             (addGuestPermissions != null)) {
166 
167             addQuestionResources(
168                 question, addCommunityPermissions.booleanValue(),
169                 addGuestPermissions.booleanValue());
170         }
171         else {
172             addQuestionResources(
173                 question, communityPermissions, guestPermissions);
174         }
175 
176         // Choices
177 
178         for (PollsChoice choice : choices) {
179             pollsChoiceLocalService.addChoice(
180                 questionId, choice.getName(), choice.getDescription());
181         }
182 
183         return question;
184     }
185 
186     public void addQuestionResources(
187             long questionId, boolean addCommunityPermissions,
188             boolean addGuestPermissions)
189         throws PortalException, SystemException {
190 
191         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
192             questionId);
193 
194         addQuestionResources(
195             question, addCommunityPermissions, addGuestPermissions);
196     }
197 
198     public void addQuestionResources(
199             PollsQuestion question, boolean addCommunityPermissions,
200             boolean addGuestPermissions)
201         throws PortalException, SystemException {
202 
203         resourceLocalService.addResources(
204             question.getCompanyId(), question.getGroupId(),
205             question.getUserId(), PollsQuestion.class.getName(),
206             question.getQuestionId(), false, addCommunityPermissions,
207             addGuestPermissions);
208     }
209 
210     public void addQuestionResources(
211             long questionId, String[] communityPermissions,
212             String[] guestPermissions)
213         throws PortalException, SystemException {
214 
215         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
216             questionId);
217 
218         addQuestionResources(question, communityPermissions, guestPermissions);
219     }
220 
221     public void addQuestionResources(
222             PollsQuestion question, String[] communityPermissions,
223             String[] guestPermissions)
224         throws PortalException, SystemException {
225 
226         resourceLocalService.addModelResources(
227             question.getCompanyId(), question.getGroupId(),
228             question.getUserId(), PollsQuestion.class.getName(),
229             question.getQuestionId(), communityPermissions, guestPermissions);
230     }
231 
232     public void deleteQuestion(long questionId)
233         throws PortalException, SystemException {
234 
235         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
236             questionId);
237 
238         deleteQuestion(question);
239     }
240 
241     public void deleteQuestion(PollsQuestion question)
242         throws PortalException, SystemException {
243 
244         // Votes
245 
246         pollsVotePersistence.removeByQuestionId(question.getQuestionId());
247 
248         // Choices
249 
250         pollsChoicePersistence.removeByQuestionId(question.getQuestionId());
251 
252         // Resources
253 
254         resourceLocalService.deleteResource(
255             question.getCompanyId(), PollsQuestion.class.getName(),
256             ResourceConstants.SCOPE_INDIVIDUAL, question.getQuestionId());
257 
258         // Question
259 
260         pollsQuestionPersistence.remove(question.getQuestionId());
261     }
262 
263     public void deleteQuestions(long groupId)
264         throws PortalException, SystemException {
265 
266         for (PollsQuestion question :
267                 pollsQuestionPersistence.findByGroupId(groupId)) {
268 
269             deleteQuestion(question);
270         }
271     }
272 
273     public PollsQuestion getQuestion(long questionId)
274         throws PortalException, SystemException {
275 
276         return pollsQuestionPersistence.findByPrimaryKey(questionId);
277     }
278 
279     public List<PollsQuestion> getQuestions(long groupId)
280         throws SystemException {
281 
282         return pollsQuestionPersistence.findByGroupId(groupId);
283     }
284 
285     public List<PollsQuestion> getQuestions(long groupId, int begin, int end)
286         throws SystemException {
287 
288         return pollsQuestionPersistence.findByGroupId(groupId, begin, end);
289     }
290 
291     public int getQuestionsCount(long groupId) throws SystemException {
292         return pollsQuestionPersistence.countByGroupId(groupId);
293     }
294 
295     public PollsQuestion updateQuestion(
296             long userId, long questionId, String title, String description,
297             int expirationDateMonth, int expirationDateDay,
298             int expirationDateYear, int expirationDateHour,
299             int expirationDateMinute, boolean neverExpire)
300         throws PortalException, SystemException {
301 
302         return updateQuestion(
303             userId, questionId, title, description, expirationDateMonth,
304             expirationDateDay, expirationDateYear, expirationDateHour,
305             expirationDateMinute, neverExpire, null);
306     }
307 
308     public PollsQuestion updateQuestion(
309             long userId, long questionId, String title, String description,
310             int expirationDateMonth, int expirationDateDay,
311             int expirationDateYear, int expirationDateHour,
312             int expirationDateMinute, boolean neverExpire,
313             List<PollsChoice> choices)
314         throws PortalException, SystemException {
315 
316         // Question
317 
318         User user = userPersistence.findByPrimaryKey(userId);
319 
320         Date expirationDate = null;
321 
322         if (!neverExpire) {
323             expirationDate = PortalUtil.getDate(
324                 expirationDateMonth, expirationDateDay, expirationDateYear,
325                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
326                 new QuestionExpirationDateException());
327         }
328 
329         validate(title, description, choices);
330 
331         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
332             questionId);
333 
334         question.setModifiedDate(new Date());
335         question.setTitle(title);
336         question.setDescription(description);
337         question.setExpirationDate(expirationDate);
338 
339         pollsQuestionPersistence.update(question, false);
340 
341         // Choices
342 
343         int oldChoicesCount = pollsChoicePersistence.countByQuestionId(
344             questionId);
345 
346         if (oldChoicesCount > choices.size()) {
347             throw new QuestionChoiceException();
348         }
349 
350         for (PollsChoice choice : choices) {
351             String choiceName = choice.getName();
352             String choiceDescription = choice.getDescription();
353 
354             choice = pollsChoicePersistence.fetchByQ_N(questionId, choiceName);
355 
356             if (choice == null) {
357                 pollsChoiceLocalService.addChoice(
358                     questionId, choiceName, choiceDescription);
359             }
360             else {
361                 pollsChoiceLocalService.updateChoice(
362                     choice.getChoiceId(), questionId, choiceName,
363                     choiceDescription);
364             }
365         }
366 
367         return question;
368     }
369 
370     protected void validate(
371             String title, String description, List<PollsChoice> choices)
372         throws PortalException {
373 
374         if (Validator.isNull(title)) {
375             throw new QuestionTitleException();
376         }
377         else if (Validator.isNull(description)) {
378             throw new QuestionDescriptionException();
379         }
380 
381         if (choices.size() < 2) {
382             throw new QuestionChoiceException();
383         }
384     }
385 
386 }