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         if (choices != null) {
179             for (PollsChoice choice : choices) {
180                 pollsChoiceLocalService.addChoice(
181                     questionId, choice.getName(), choice.getDescription());
182             }
183         }
184 
185         return question;
186     }
187 
188     public void addQuestionResources(
189             long questionId, boolean addCommunityPermissions,
190             boolean addGuestPermissions)
191         throws PortalException, SystemException {
192 
193         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
194             questionId);
195 
196         addQuestionResources(
197             question, addCommunityPermissions, addGuestPermissions);
198     }
199 
200     public void addQuestionResources(
201             PollsQuestion question, boolean addCommunityPermissions,
202             boolean addGuestPermissions)
203         throws PortalException, SystemException {
204 
205         resourceLocalService.addResources(
206             question.getCompanyId(), question.getGroupId(),
207             question.getUserId(), PollsQuestion.class.getName(),
208             question.getQuestionId(), false, addCommunityPermissions,
209             addGuestPermissions);
210     }
211 
212     public void addQuestionResources(
213             long questionId, String[] communityPermissions,
214             String[] guestPermissions)
215         throws PortalException, SystemException {
216 
217         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
218             questionId);
219 
220         addQuestionResources(question, communityPermissions, guestPermissions);
221     }
222 
223     public void addQuestionResources(
224             PollsQuestion question, String[] communityPermissions,
225             String[] guestPermissions)
226         throws PortalException, SystemException {
227 
228         resourceLocalService.addModelResources(
229             question.getCompanyId(), question.getGroupId(),
230             question.getUserId(), PollsQuestion.class.getName(),
231             question.getQuestionId(), communityPermissions, guestPermissions);
232     }
233 
234     public void deleteQuestion(long questionId)
235         throws PortalException, SystemException {
236 
237         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
238             questionId);
239 
240         deleteQuestion(question);
241     }
242 
243     public void deleteQuestion(PollsQuestion question)
244         throws PortalException, SystemException {
245 
246         // Votes
247 
248         pollsVotePersistence.removeByQuestionId(question.getQuestionId());
249 
250         // Choices
251 
252         pollsChoicePersistence.removeByQuestionId(question.getQuestionId());
253 
254         // Resources
255 
256         resourceLocalService.deleteResource(
257             question.getCompanyId(), PollsQuestion.class.getName(),
258             ResourceConstants.SCOPE_INDIVIDUAL, question.getQuestionId());
259 
260         // Question
261 
262         pollsQuestionPersistence.remove(question.getQuestionId());
263     }
264 
265     public void deleteQuestions(long groupId)
266         throws PortalException, SystemException {
267 
268         for (PollsQuestion question :
269                 pollsQuestionPersistence.findByGroupId(groupId)) {
270 
271             deleteQuestion(question);
272         }
273     }
274 
275     public PollsQuestion getQuestion(long questionId)
276         throws PortalException, SystemException {
277 
278         return pollsQuestionPersistence.findByPrimaryKey(questionId);
279     }
280 
281     public List<PollsQuestion> getQuestions(long groupId)
282         throws SystemException {
283 
284         return pollsQuestionPersistence.findByGroupId(groupId);
285     }
286 
287     public List<PollsQuestion> getQuestions(long groupId, int start, int end)
288         throws SystemException {
289 
290         return pollsQuestionPersistence.findByGroupId(groupId, start, end);
291     }
292 
293     public int getQuestionsCount(long groupId) throws SystemException {
294         return pollsQuestionPersistence.countByGroupId(groupId);
295     }
296 
297     public PollsQuestion updateQuestion(
298             long userId, long questionId, String title, String description,
299             int expirationDateMonth, int expirationDateDay,
300             int expirationDateYear, int expirationDateHour,
301             int expirationDateMinute, boolean neverExpire)
302         throws PortalException, SystemException {
303 
304         return updateQuestion(
305             userId, questionId, title, description, expirationDateMonth,
306             expirationDateDay, expirationDateYear, expirationDateHour,
307             expirationDateMinute, neverExpire, null);
308     }
309 
310     public PollsQuestion updateQuestion(
311             long userId, long questionId, String title, String description,
312             int expirationDateMonth, int expirationDateDay,
313             int expirationDateYear, int expirationDateHour,
314             int expirationDateMinute, boolean neverExpire,
315             List<PollsChoice> choices)
316         throws PortalException, SystemException {
317 
318         // Question
319 
320         User user = userPersistence.findByPrimaryKey(userId);
321 
322         Date expirationDate = null;
323 
324         if (!neverExpire) {
325             expirationDate = PortalUtil.getDate(
326                 expirationDateMonth, expirationDateDay, expirationDateYear,
327                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
328                 new QuestionExpirationDateException());
329         }
330 
331         validate(title, description, choices);
332 
333         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
334             questionId);
335 
336         question.setModifiedDate(new Date());
337         question.setTitle(title);
338         question.setDescription(description);
339         question.setExpirationDate(expirationDate);
340 
341         pollsQuestionPersistence.update(question, false);
342 
343         // Choices
344 
345         int oldChoicesCount = pollsChoicePersistence.countByQuestionId(
346             questionId);
347 
348         if (oldChoicesCount > choices.size()) {
349             throw new QuestionChoiceException();
350         }
351 
352         for (PollsChoice choice : choices) {
353             String choiceName = choice.getName();
354             String choiceDescription = choice.getDescription();
355 
356             choice = pollsChoicePersistence.fetchByQ_N(questionId, choiceName);
357 
358             if (choice == null) {
359                 pollsChoiceLocalService.addChoice(
360                     questionId, choiceName, choiceDescription);
361             }
362             else {
363                 pollsChoiceLocalService.updateChoice(
364                     choice.getChoiceId(), questionId, choiceName,
365                     choiceDescription);
366             }
367         }
368 
369         return question;
370     }
371 
372     protected void validate(
373             String title, String description, List<PollsChoice> choices)
374         throws PortalException {
375 
376         if (Validator.isNull(title)) {
377             throw new QuestionTitleException();
378         }
379         else if (Validator.isNull(description)) {
380             throw new QuestionDescriptionException();
381         }
382 
383         if (choices != null && choices.size() < 2) {
384             throw new QuestionChoiceException();
385         }
386     }
387 
388 }