1   /**
2    * Copyright (c) 2000-2009 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.messageboards.service.impl;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.kernel.json.JSONFactoryUtil;
28  import com.liferay.portal.kernel.messaging.DestinationNames;
29  import com.liferay.portal.kernel.scheduler.SchedulerEngineUtil;
30  import com.liferay.portal.kernel.scheduler.TriggerExpression;
31  import com.liferay.portal.kernel.scheduler.messaging.SchedulerRequest;
32  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
33  import com.liferay.portal.kernel.util.StringPool;
34  import com.liferay.portal.kernel.util.Validator;
35  import com.liferay.portal.model.User;
36  import com.liferay.portlet.messageboards.MailingListEmailAddressException;
37  import com.liferay.portlet.messageboards.MailingListInServerNameException;
38  import com.liferay.portlet.messageboards.MailingListInUserNameException;
39  import com.liferay.portlet.messageboards.MailingListOutEmailAddressException;
40  import com.liferay.portlet.messageboards.MailingListOutServerNameException;
41  import com.liferay.portlet.messageboards.MailingListOutUserNameException;
42  import com.liferay.portlet.messageboards.messaging.MailingListRequest;
43  import com.liferay.portlet.messageboards.model.MBCategory;
44  import com.liferay.portlet.messageboards.model.MBMailingList;
45  import com.liferay.portlet.messageboards.service.base.MBMailingListLocalServiceBaseImpl;
46  
47  import java.util.Calendar;
48  import java.util.Date;
49  import java.util.List;
50  
51  /**
52   * <a href="MBMailingListLocalServiceImpl.java.html"><b><i>View Source</i></b>
53   * </a>
54   *
55   * @author Thiago Moreira
56   *
57   */
58  public class MBMailingListLocalServiceImpl
59      extends MBMailingListLocalServiceBaseImpl {
60  
61      public MBMailingList addMailingList(
62              String uuid, long userId, long categoryId, String emailAddress,
63              String inProtocol, String inServerName, int inServerPort,
64              boolean inUseSSL, String inUserName, String inPassword,
65              int inReadInterval, String outEmailAddress, boolean outCustom,
66              String outServerName, int outServerPort, boolean outUseSSL,
67              String outUserName, String outPassword, boolean active)
68          throws PortalException, SystemException {
69  
70          // Mailing list
71  
72          User user = userPersistence.findByPrimaryKey(userId);
73          MBCategory category = mbCategoryPersistence.findByPrimaryKey(
74              categoryId);
75          Date now = new Date();
76  
77          validate(
78              emailAddress, inServerName, inUserName, outEmailAddress, outCustom,
79              outServerName, outUserName, active);
80  
81          long mailingListId = counterLocalService.increment();
82  
83          MBMailingList mailingList = mbMailingListPersistence.create(
84              mailingListId);
85  
86          mailingList.setUuid(uuid);
87          mailingList.setGroupId(category.getGroupId());
88          mailingList.setCompanyId(user.getCompanyId());
89          mailingList.setUserId(user.getUserId());
90          mailingList.setUserName(user.getFullName());
91          mailingList.setCreateDate(now);
92          mailingList.setModifiedDate(now);
93          mailingList.setCategoryId(categoryId);
94          mailingList.setEmailAddress(emailAddress);
95          mailingList.setInProtocol(inUseSSL ? inProtocol + "s" : inProtocol);
96          mailingList.setInServerName(inServerName);
97          mailingList.setInServerPort(inServerPort);
98          mailingList.setInUseSSL(inUseSSL);
99          mailingList.setInUserName(inUserName);
100         mailingList.setInPassword(inPassword);
101         mailingList.setInReadInterval(inReadInterval);
102         mailingList.setOutEmailAddress(outEmailAddress);
103         mailingList.setOutCustom(outCustom);
104         mailingList.setOutServerName(outServerName);
105         mailingList.setOutServerPort(outServerPort);
106         mailingList.setOutUseSSL(outUseSSL);
107         mailingList.setOutUserName(outUserName);
108         mailingList.setOutPassword(outPassword);
109         mailingList.setActive(active);
110 
111         mbMailingListPersistence.update(mailingList, false);
112 
113         // Scheduler
114 
115         if (active) {
116             scheduleMailingList(mailingList);
117         }
118 
119         return mailingList;
120     }
121 
122     public void deleteCategoryMailingList(long categoryId)
123         throws PortalException, SystemException {
124 
125         MBMailingList mailingList = mbMailingListPersistence.findByCategoryId(
126             categoryId);
127 
128         deleteMailingList(mailingList);
129     }
130 
131     public void deleteMailingList(long mailingListId)
132         throws PortalException, SystemException {
133 
134         MBMailingList mailingList = mbMailingListPersistence.findByPrimaryKey(
135             mailingListId);
136 
137         deleteMailingList(mailingList);
138     }
139 
140     public void deleteMailingList(MBMailingList mailingList)
141         throws PortalException, SystemException {
142 
143         unscheduleMailingList(mailingList);
144 
145         mbMailingListPersistence.remove(mailingList);
146     }
147 
148     public MBMailingList getCategoryMailingList(long categoryId)
149         throws PortalException, SystemException {
150 
151         return mbMailingListPersistence.findByCategoryId(categoryId);
152     }
153 
154     public MBMailingList updateMailingList(
155             long mailingListId, String emailAddress, String inProtocol,
156             String inServerName, int inServerPort, boolean inUseSSL,
157             String inUserName, String inPassword, int inReadInterval,
158             String outEmailAddress, boolean outCustom, String outServerName,
159             int outServerPort, boolean outUseSSL, String outUserName,
160             String outPassword, boolean active)
161         throws PortalException, SystemException {
162 
163         // Mailing list
164 
165         validate(
166             emailAddress, inServerName, inUserName, outEmailAddress, outCustom,
167             outServerName, outUserName, active);
168 
169         MBMailingList mailingList = mbMailingListPersistence.findByPrimaryKey(
170             mailingListId);
171 
172         mailingList.setModifiedDate(new Date());
173         mailingList.setEmailAddress(emailAddress);
174         mailingList.setInProtocol(inUseSSL ? inProtocol + "s" : inProtocol);
175         mailingList.setInServerName(inServerName);
176         mailingList.setInServerPort(inServerPort);
177         mailingList.setInUseSSL(inUseSSL);
178         mailingList.setInUserName(inUserName);
179         mailingList.setInPassword(inPassword);
180         mailingList.setInReadInterval(inReadInterval);
181         mailingList.setOutEmailAddress(outEmailAddress);
182         mailingList.setOutCustom(outCustom);
183         mailingList.setOutServerName(outServerName);
184         mailingList.setOutServerPort(outServerPort);
185         mailingList.setOutUseSSL(outUseSSL);
186         mailingList.setOutUserName(outUserName);
187         mailingList.setOutPassword(outPassword);
188         mailingList.setActive(active);
189 
190         mbMailingListPersistence.update(mailingList, false);
191 
192         // Scheduler
193 
194         if (active) {
195             scheduleMailingList(mailingList);
196         }
197         else {
198             unscheduleMailingList(mailingList);
199         }
200 
201         return mailingList;
202     }
203 
204     protected String getSchedulerGroupName(MBMailingList mailingList) {
205         StringBuilder sb = new StringBuilder();
206 
207         sb.append(DestinationNames.MESSAGE_BOARDS_MAILING_LIST);
208         sb.append(StringPool.SLASH);
209         sb.append(mailingList.getMailingListId());
210 
211         return sb.toString();
212     }
213 
214     protected void scheduleMailingList(MBMailingList mailingList)
215         throws PortalException {
216 
217         unscheduleMailingList(mailingList);
218 
219         String groupName = getSchedulerGroupName(mailingList);
220 
221         Calendar startDate = CalendarFactoryUtil.getCalendar();
222 
223         TriggerExpression triggerExpression = new TriggerExpression(
224             startDate, TriggerExpression.MINUTELY_FREQUENCY,
225             mailingList.getInReadInterval());
226 
227         String cronText = triggerExpression.toCronText();
228 
229         MailingListRequest mailingListRequest = new MailingListRequest();
230 
231         mailingListRequest.setCompanyId(mailingList.getCompanyId());
232         mailingListRequest.setUserId(mailingList.getUserId());
233         mailingListRequest.setCategoryId(mailingList.getCategoryId());
234         mailingListRequest.setInProtocol(mailingList.getInProtocol());
235         mailingListRequest.setInServerName(mailingList.getInServerName());
236         mailingListRequest.setInServerPort(mailingList.getInServerPort());
237         mailingListRequest.setInUseSSL(mailingList.getInUseSSL());
238         mailingListRequest.setInUserName(mailingList.getInUserName());
239         mailingListRequest.setInPassword(mailingList.getInPassword());
240 
241         SchedulerEngineUtil.schedule(
242             groupName, cronText, startDate.getTime(), null, null,
243             DestinationNames.MESSAGE_BOARDS_MAILING_LIST,
244             JSONFactoryUtil.serialize(mailingListRequest));
245     }
246 
247     protected void unscheduleMailingList(MBMailingList mailingList)
248         throws PortalException {
249 
250         String groupName = getSchedulerGroupName(mailingList);
251 
252         List<SchedulerRequest> schedulerRequests =
253             SchedulerEngineUtil.getScheduledJobs(groupName);
254 
255         for (SchedulerRequest schedulerRequest : schedulerRequests) {
256             SchedulerEngineUtil.unschedule(
257                 schedulerRequest.getJobName(), schedulerRequest.getGroupName());
258         }
259     }
260 
261     protected void validate(
262             String emailAddress, String inServerName, String inUserName,
263             String outEmailAddress, boolean outCustom, String outServerName,
264             String outUserName, boolean active)
265         throws PortalException {
266 
267         if (!active) {
268             return;
269         }
270 
271         if (!Validator.isEmailAddress(emailAddress)) {
272             throw new MailingListEmailAddressException();
273         }
274         else if (Validator.isNull(inServerName)) {
275             throw new MailingListInServerNameException();
276         }
277         else if (Validator.isNull(inUserName)) {
278             throw new MailingListInUserNameException();
279         }
280         else if (Validator.isNull(outEmailAddress)) {
281             throw new MailingListOutEmailAddressException();
282         }
283         else if (outCustom) {
284             if (Validator.isNull(outServerName)) {
285                 throw new MailingListOutServerNameException();
286             }
287             else if (Validator.isNull(outUserName)) {
288                 throw new MailingListOutUserNameException();
289             }
290         }
291     }
292 
293 }