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