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