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