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