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.User;
29  import com.liferay.portal.model.impl.ResourceImpl;
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.Iterator;
41  import java.util.List;
42  
43  /**
44   * <a href="PollsQuestionLocalServiceImpl.java.html"><b><i>View Source</i></b>
45   * </a>
46   *
47   * @author Brian Wing Shun Chan
48   *
49   */
50  public class PollsQuestionLocalServiceImpl
51      extends PollsQuestionLocalServiceBaseImpl {
52  
53      public PollsQuestion addQuestion(
54              long userId, long plid, String title, String description,
55              int expirationDateMonth, int expirationDateDay,
56              int expirationDateYear, int expirationDateHour,
57              int expirationDateMinute, boolean neverExpire,
58              boolean addCommunityPermissions, boolean addGuestPermissions)
59          throws PortalException, SystemException {
60  
61          return addQuestion(
62              null, userId, plid, title, description, expirationDateMonth,
63              expirationDateDay, expirationDateYear, expirationDateHour,
64              expirationDateMinute, neverExpire, null,
65              Boolean.valueOf(addCommunityPermissions),
66              Boolean.valueOf(addGuestPermissions), null, null);
67      }
68  
69      public PollsQuestion addQuestion(
70              String uuid, long userId, long plid, String title,
71              String description, int expirationDateMonth, int expirationDateDay,
72              int expirationDateYear, int expirationDateHour,
73              int expirationDateMinute, boolean neverExpire,
74              boolean addCommunityPermissions, boolean addGuestPermissions)
75          throws PortalException, SystemException {
76  
77          return addQuestion(
78              uuid, userId, plid, title, description, expirationDateMonth,
79              expirationDateDay, expirationDateYear, expirationDateHour,
80              expirationDateMinute, neverExpire, null,
81              Boolean.valueOf(addCommunityPermissions),
82              Boolean.valueOf(addGuestPermissions), null, null);
83      }
84  
85      public PollsQuestion addQuestion(
86              long userId, long plid, String title, String description,
87              int expirationDateMonth, int expirationDateDay,
88              int expirationDateYear, int expirationDateHour,
89              int expirationDateMinute, boolean neverExpire, List choices,
90              boolean addCommunityPermissions, 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, List choices,
106             String[] communityPermissions, String[] guestPermissions)
107         throws PortalException, SystemException {
108 
109         return addQuestion(
110             null, userId, plid, title, description, expirationDateMonth,
111             expirationDateDay, expirationDateYear, expirationDateHour,
112             expirationDateMinute, neverExpire, choices, null, null,
113             communityPermissions, guestPermissions);
114     }
115 
116     public PollsQuestion addQuestion(
117             String uuid, long userId, long plid, String title,
118             String description, int expirationDateMonth, int expirationDateDay,
119             int expirationDateYear, int expirationDateHour,
120             int expirationDateMinute, boolean neverExpire, List choices,
121             Boolean addCommunityPermissions, Boolean addGuestPermissions,
122             String[] communityPermissions, String[] guestPermissions)
123         throws PortalException, SystemException {
124 
125         // Question
126 
127         User user = userPersistence.findByPrimaryKey(userId);
128         long groupId = PortalUtil.getPortletGroupId(plid);
129         Date now = new Date();
130 
131         Date expirationDate = null;
132 
133         if (!neverExpire) {
134             expirationDate = PortalUtil.getDate(
135                 expirationDateMonth, expirationDateDay, expirationDateYear,
136                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
137                 new QuestionExpirationDateException());
138         }
139 
140         validate(title, description, choices);
141 
142         long questionId = counterLocalService.increment();
143 
144         PollsQuestion question = pollsQuestionPersistence.create(questionId);
145 
146         question.setUuid(uuid);
147         question.setGroupId(groupId);
148         question.setCompanyId(user.getCompanyId());
149         question.setUserId(user.getUserId());
150         question.setUserName(user.getFullName());
151         question.setCreateDate(now);
152         question.setModifiedDate(now);
153         question.setTitle(title);
154         question.setDescription(description);
155         question.setExpirationDate(expirationDate);
156 
157         pollsQuestionPersistence.update(question);
158 
159         // Resources
160 
161         if ((addCommunityPermissions != null) &&
162             (addGuestPermissions != null)) {
163 
164             addQuestionResources(
165                 question, addCommunityPermissions.booleanValue(),
166                 addGuestPermissions.booleanValue());
167         }
168         else {
169             addQuestionResources(
170                 question, communityPermissions, guestPermissions);
171         }
172 
173         // Choices
174 
175         if (choices != null) {
176             Iterator itr = choices.iterator();
177 
178             while (itr.hasNext()) {
179                 PollsChoice choice = (PollsChoice)itr.next();
180 
181                 pollsChoiceLocalService.addChoice(
182                     questionId, choice.getName(), choice.getDescription());
183             }
184         }
185 
186         return question;
187     }
188 
189     public void addQuestionResources(
190             long questionId, boolean addCommunityPermissions,
191             boolean addGuestPermissions)
192         throws PortalException, SystemException {
193 
194         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
195             questionId);
196 
197         addQuestionResources(
198             question, addCommunityPermissions, addGuestPermissions);
199     }
200 
201     public void addQuestionResources(
202             PollsQuestion question, boolean addCommunityPermissions,
203             boolean addGuestPermissions)
204         throws PortalException, SystemException {
205 
206         resourceLocalService.addResources(
207             question.getCompanyId(), question.getGroupId(),
208             question.getUserId(), PollsQuestion.class.getName(),
209             question.getQuestionId(), false, addCommunityPermissions,
210             addGuestPermissions);
211     }
212 
213     public void addQuestionResources(
214             long questionId, String[] communityPermissions,
215             String[] guestPermissions)
216         throws PortalException, SystemException {
217 
218         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
219             questionId);
220 
221         addQuestionResources(question, communityPermissions, guestPermissions);
222     }
223 
224     public void addQuestionResources(
225             PollsQuestion question, String[] communityPermissions,
226             String[] guestPermissions)
227         throws PortalException, SystemException {
228 
229         resourceLocalService.addModelResources(
230             question.getCompanyId(), question.getGroupId(),
231             question.getUserId(), PollsQuestion.class.getName(),
232             question.getQuestionId(), communityPermissions, guestPermissions);
233     }
234 
235     public void deleteQuestion(long questionId)
236         throws PortalException, SystemException {
237 
238         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
239             questionId);
240 
241         deleteQuestion(question);
242     }
243 
244     public void deleteQuestion(PollsQuestion question)
245         throws PortalException, SystemException {
246 
247         // Votes
248 
249         pollsVotePersistence.removeByQuestionId(question.getQuestionId());
250 
251         // Choices
252 
253         pollsChoicePersistence.removeByQuestionId(question.getQuestionId());
254 
255         // Resources
256 
257         resourceLocalService.deleteResource(
258             question.getCompanyId(), PollsQuestion.class.getName(),
259             ResourceImpl.SCOPE_INDIVIDUAL, question.getQuestionId());
260 
261         // Question
262 
263         pollsQuestionPersistence.remove(question.getQuestionId());
264     }
265 
266     public void deleteQuestions(long groupId)
267         throws PortalException, SystemException {
268 
269         Iterator itr = pollsQuestionPersistence.findByGroupId(
270             groupId).iterator();
271 
272         while (itr.hasNext()) {
273             PollsQuestion question = (PollsQuestion)itr.next();
274 
275             deleteQuestion(question);
276         }
277     }
278 
279     public PollsQuestion getQuestion(long questionId)
280         throws PortalException, SystemException {
281 
282         return pollsQuestionPersistence.findByPrimaryKey(questionId);
283     }
284 
285     public List getQuestions(long groupId) throws SystemException {
286         return pollsQuestionPersistence.findByGroupId(groupId);
287     }
288 
289     public List getQuestions(long groupId, int begin, int end)
290         throws SystemException {
291 
292         return pollsQuestionPersistence.findByGroupId(groupId, begin, end);
293     }
294 
295     public int getQuestionsCount(long groupId) throws SystemException {
296         return pollsQuestionPersistence.countByGroupId(groupId);
297     }
298 
299     public PollsQuestion updateQuestion(
300             long userId, long questionId, String title, String description,
301             int expirationDateMonth, int expirationDateDay,
302             int expirationDateYear, int expirationDateHour,
303             int expirationDateMinute, boolean neverExpire)
304         throws PortalException, SystemException {
305 
306         return updateQuestion(
307             userId, questionId, title, description, expirationDateMonth,
308             expirationDateDay, expirationDateYear, expirationDateHour,
309             expirationDateMinute, neverExpire, null);
310     }
311 
312     public PollsQuestion updateQuestion(
313             long userId, long questionId, String title, String description,
314             int expirationDateMonth, int expirationDateDay,
315             int expirationDateYear, int expirationDateHour,
316             int expirationDateMinute, boolean neverExpire, List choices)
317         throws PortalException, SystemException {
318 
319         // Question
320 
321         User user = userPersistence.findByPrimaryKey(userId);
322 
323         Date expirationDate = null;
324 
325         if (!neverExpire) {
326             expirationDate = PortalUtil.getDate(
327                 expirationDateMonth, expirationDateDay, expirationDateYear,
328                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
329                 new QuestionExpirationDateException());
330         }
331 
332         validate(title, description, choices);
333 
334         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
335             questionId);
336 
337         question.setModifiedDate(new Date());
338         question.setTitle(title);
339         question.setDescription(description);
340         question.setExpirationDate(expirationDate);
341 
342         pollsQuestionPersistence.update(question);
343 
344         // Choices
345 
346         if (choices != null) {
347             int oldChoicesCount = pollsChoicePersistence.countByQuestionId(
348                 questionId);
349 
350             if (oldChoicesCount > choices.size()) {
351                 throw new QuestionChoiceException();
352             }
353 
354             Iterator itr = choices.iterator();
355 
356             while (itr.hasNext()) {
357                 PollsChoice choice = (PollsChoice)itr.next();
358 
359                 String choiceName = choice.getName();
360                 String choiceDescription = choice.getDescription();
361 
362                 choice = pollsChoicePersistence.fetchByQ_N(
363                     questionId, choiceName);
364 
365                 if (choice == null) {
366                     pollsChoiceLocalService.addChoice(
367                         questionId, choiceName, choiceDescription);
368                 }
369                 else {
370                     pollsChoiceLocalService.updateChoice(
371                         choice.getChoiceId(), questionId, choiceName,
372                         choiceDescription);
373                 }
374             }
375         }
376 
377         return question;
378     }
379 
380     protected void validate(String title, String description, List choices)
381         throws PortalException {
382 
383         if (Validator.isNull(title)) {
384             throw new QuestionTitleException();
385         }
386         else if (Validator.isNull(description)) {
387             throw new QuestionDescriptionException();
388         }
389 
390         if ((choices != null) && (choices.size() < 2)) {
391             throw new QuestionChoiceException();
392         }
393     }
394 
395 }