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