1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.polls.service.impl;
16  
17  import com.liferay.portal.kernel.exception.PortalException;
18  import com.liferay.portal.kernel.exception.SystemException;
19  import com.liferay.portal.kernel.util.LocaleUtil;
20  import com.liferay.portal.kernel.util.Validator;
21  import com.liferay.portal.model.ResourceConstants;
22  import com.liferay.portal.model.User;
23  import com.liferay.portal.service.ServiceContext;
24  import com.liferay.portal.util.PortalUtil;
25  import com.liferay.portlet.polls.QuestionChoiceException;
26  import com.liferay.portlet.polls.QuestionDescriptionException;
27  import com.liferay.portlet.polls.QuestionExpirationDateException;
28  import com.liferay.portlet.polls.QuestionTitleException;
29  import com.liferay.portlet.polls.model.PollsChoice;
30  import com.liferay.portlet.polls.model.PollsQuestion;
31  import com.liferay.portlet.polls.service.base.PollsQuestionLocalServiceBaseImpl;
32  
33  import java.util.Date;
34  import java.util.List;
35  import java.util.Locale;
36  import java.util.Map;
37  
38  /**
39   * <a href="PollsQuestionLocalServiceImpl.java.html"><b><i>View Source</i></b>
40   * </a>
41   *
42   * @author Brian Wing Shun Chan
43   * @author Julio Camarero
44   */
45  public class PollsQuestionLocalServiceImpl
46      extends PollsQuestionLocalServiceBaseImpl {
47  
48      public PollsQuestion addQuestion(
49              String uuid, long userId, Map<Locale, String> titleMap,
50              Map<Locale, String> descriptionMap, int expirationDateMonth,
51              int expirationDateDay, int expirationDateYear,
52              int expirationDateHour, int expirationDateMinute,
53              boolean neverExpire, List<PollsChoice> choices,
54              ServiceContext serviceContext)
55          throws PortalException, SystemException {
56  
57          // Question
58  
59          User user = userPersistence.findByPrimaryKey(userId);
60          long groupId = serviceContext.getScopeGroupId();
61  
62          Date expirationDate = null;
63  
64          if (!neverExpire) {
65              expirationDate = PortalUtil.getDate(
66                  expirationDateMonth, expirationDateDay, expirationDateYear,
67                  expirationDateHour, expirationDateMinute, user.getTimeZone(),
68                  new QuestionExpirationDateException());
69          }
70  
71          Date now = new Date();
72  
73          validate(titleMap, descriptionMap, choices);
74  
75          long questionId = counterLocalService.increment();
76  
77          PollsQuestion question = pollsQuestionPersistence.create(questionId);
78  
79          question.setUuid(uuid);
80          question.setGroupId(groupId);
81          question.setCompanyId(user.getCompanyId());
82          question.setUserId(user.getUserId());
83          question.setUserName(user.getFullName());
84          question.setCreateDate(now);
85          question.setModifiedDate(now);
86          question.setTitleMap(titleMap);
87          question.setDescriptionMap(descriptionMap);
88          question.setExpirationDate(expirationDate);
89  
90          pollsQuestionPersistence.update(question, false);
91  
92          // Resources
93  
94          if (serviceContext.getAddCommunityPermissions() ||
95              serviceContext.getAddGuestPermissions()) {
96  
97              addQuestionResources(
98                  question, serviceContext.getAddCommunityPermissions(),
99                  serviceContext.getAddGuestPermissions());
100         }
101         else {
102             addQuestionResources(
103                 question, serviceContext.getCommunityPermissions(),
104                 serviceContext.getGuestPermissions());
105         }
106 
107         // Choices
108 
109         if (choices != null) {
110             for (PollsChoice choice : choices) {
111                 pollsChoiceLocalService.addChoice(
112                     null, questionId, choice.getName(),
113                     choice.getDescription());
114             }
115         }
116 
117         return question;
118     }
119 
120     public void addQuestionResources(
121             long questionId, boolean addCommunityPermissions,
122             boolean addGuestPermissions)
123         throws PortalException, SystemException {
124 
125         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
126             questionId);
127 
128         addQuestionResources(
129             question, addCommunityPermissions, addGuestPermissions);
130     }
131 
132     public void addQuestionResources(
133             long questionId, String[] communityPermissions,
134             String[] guestPermissions)
135         throws PortalException, SystemException {
136 
137         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
138             questionId);
139 
140         addQuestionResources(question, communityPermissions, guestPermissions);
141     }
142 
143     public void addQuestionResources(
144             PollsQuestion question, boolean addCommunityPermissions,
145             boolean addGuestPermissions)
146         throws PortalException, SystemException {
147 
148         resourceLocalService.addResources(
149             question.getCompanyId(), question.getGroupId(),
150             question.getUserId(), PollsQuestion.class.getName(),
151             question.getQuestionId(), false, addCommunityPermissions,
152             addGuestPermissions);
153     }
154 
155     public void addQuestionResources(
156             PollsQuestion question, String[] communityPermissions,
157             String[] guestPermissions)
158         throws PortalException, SystemException {
159 
160         resourceLocalService.addModelResources(
161             question.getCompanyId(), question.getGroupId(),
162             question.getUserId(), PollsQuestion.class.getName(),
163             question.getQuestionId(), communityPermissions, guestPermissions);
164     }
165 
166     public void deleteQuestion(long questionId)
167         throws PortalException, SystemException {
168 
169         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
170             questionId);
171 
172         deleteQuestion(question);
173     }
174 
175     public void deleteQuestion(PollsQuestion question)
176         throws PortalException, SystemException {
177 
178         // Question
179 
180         pollsQuestionPersistence.remove(question);
181 
182         // Resources
183 
184         resourceLocalService.deleteResource(
185             question.getCompanyId(), PollsQuestion.class.getName(),
186             ResourceConstants.SCOPE_INDIVIDUAL, question.getQuestionId());
187 
188         // Choices
189 
190         pollsChoicePersistence.removeByQuestionId(question.getQuestionId());
191 
192         // Votes
193 
194         pollsVotePersistence.removeByQuestionId(question.getQuestionId());
195     }
196 
197     public void deleteQuestions(long groupId)
198         throws PortalException, SystemException {
199 
200         for (PollsQuestion question :
201                 pollsQuestionPersistence.findByGroupId(groupId)) {
202 
203             deleteQuestion(question);
204         }
205     }
206 
207     public PollsQuestion getQuestion(long questionId)
208         throws PortalException, SystemException {
209 
210         return pollsQuestionPersistence.findByPrimaryKey(questionId);
211     }
212 
213     public List<PollsQuestion> getQuestions(long groupId)
214         throws SystemException {
215 
216         return pollsQuestionPersistence.findByGroupId(groupId);
217     }
218 
219     public List<PollsQuestion> getQuestions(long groupId, int start, int end)
220         throws SystemException {
221 
222         return pollsQuestionPersistence.findByGroupId(groupId, start, end);
223     }
224 
225     public int getQuestionsCount(long groupId) throws SystemException {
226         return pollsQuestionPersistence.countByGroupId(groupId);
227     }
228 
229     public PollsQuestion updateQuestion(
230             long userId, long questionId, Map<Locale, String> titleMap,
231             Map<Locale, String> descriptionMap, int expirationDateMonth,
232             int expirationDateDay, int expirationDateYear,
233             int expirationDateHour, int expirationDateMinute,
234             boolean neverExpire)
235         throws PortalException, SystemException {
236 
237         return updateQuestion(
238             userId, questionId, titleMap, descriptionMap, expirationDateMonth,
239             expirationDateDay, expirationDateYear, expirationDateHour,
240             expirationDateMinute, neverExpire, null, null);
241     }
242 
243     public PollsQuestion updateQuestion(
244             long userId, long questionId, Map<Locale, String> titleMap,
245             Map<Locale, String> descriptionMap, int expirationDateMonth,
246             int expirationDateDay, int expirationDateYear,
247             int expirationDateHour, int expirationDateMinute,
248             boolean neverExpire, List<PollsChoice> choices,
249             ServiceContext serviceContext)
250         throws PortalException, SystemException {
251 
252         // Question
253 
254         User user = userPersistence.findByPrimaryKey(userId);
255 
256         Date expirationDate = null;
257 
258         if (!neverExpire) {
259             expirationDate = PortalUtil.getDate(
260                 expirationDateMonth, expirationDateDay, expirationDateYear,
261                 expirationDateHour, expirationDateMinute, user.getTimeZone(),
262                 new QuestionExpirationDateException());
263         }
264 
265         validate(titleMap, descriptionMap, choices);
266 
267         PollsQuestion question = pollsQuestionPersistence.findByPrimaryKey(
268             questionId);
269 
270         question.setModifiedDate(new Date());
271         question.setTitleMap(titleMap);
272         question.setDescriptionMap(descriptionMap);
273         question.setExpirationDate(expirationDate);
274 
275         pollsQuestionPersistence.update(question, false);
276 
277         // Choices
278 
279         if (choices != null) {
280             int oldChoicesCount = pollsChoicePersistence.countByQuestionId(
281                 questionId);
282 
283             if (oldChoicesCount > choices.size()) {
284                 throw new QuestionChoiceException();
285             }
286 
287             for (PollsChoice choice : choices) {
288                 String choiceName = choice.getName();
289                 String choiceDescription = choice.getDescription();
290 
291                 choice = pollsChoicePersistence.fetchByQ_N(
292                     questionId, choiceName);
293 
294                 if (choice == null) {
295                     pollsChoiceLocalService.addChoice(
296                         null, questionId, choiceName, choiceDescription);
297                 }
298                 else {
299                     pollsChoiceLocalService.updateChoice(
300                         choice.getChoiceId(), questionId, choiceName,
301                         choiceDescription);
302                 }
303             }
304         }
305 
306         return question;
307     }
308 
309     protected void validate(
310             Map<Locale, String> titleMap, Map<Locale, String> descriptionMap,
311             List<PollsChoice> choices)
312         throws PortalException {
313 
314         Locale locale = LocaleUtil.getDefault();
315 
316         String title = titleMap.get(locale);
317 
318         if (Validator.isNull(title)) {
319             throw new QuestionTitleException();
320         }
321 
322         String description = descriptionMap.get(locale);
323 
324         if (Validator.isNull(description)) {
325             throw new QuestionDescriptionException();
326         }
327 
328         if ((choices != null) && (choices.size() < 2)) {
329             throw new QuestionChoiceException();
330         }
331 
332         for (PollsChoice choice : choices) {
333             String choiceDescription = choice.getDescription(locale);
334 
335             if (Validator.isNull(choiceDescription)) {
336                 throw new QuestionChoiceException();
337             }
338         }
339     }
340 
341 }