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.messageboards.messaging;
16  
17  import com.liferay.portal.NoSuchUserException;
18  import com.liferay.portal.kernel.json.JSONFactoryUtil;
19  import com.liferay.portal.kernel.log.Log;
20  import com.liferay.portal.kernel.log.LogFactoryUtil;
21  import com.liferay.portal.kernel.mail.Account;
22  import com.liferay.portal.kernel.messaging.MessageListener;
23  import com.liferay.portal.kernel.util.StringPool;
24  import com.liferay.portal.model.User;
25  import com.liferay.portal.security.permission.PermissionCheckerUtil;
26  import com.liferay.portal.service.ServiceContext;
27  import com.liferay.portal.service.UserLocalServiceUtil;
28  import com.liferay.portal.util.PortalUtil;
29  import com.liferay.portal.util.PortletKeys;
30  import com.liferay.portlet.messageboards.NoSuchMessageException;
31  import com.liferay.portlet.messageboards.model.MBMessage;
32  import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
33  import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;
34  import com.liferay.portlet.messageboards.util.MBMailMessage;
35  import com.liferay.portlet.messageboards.util.MBUtil;
36  import com.liferay.portlet.messageboards.util.MailingListThreadLocal;
37  import com.liferay.util.mail.MailEngine;
38  
39  import javax.mail.Address;
40  import javax.mail.Flags;
41  import javax.mail.Folder;
42  import javax.mail.Message;
43  import javax.mail.MessagingException;
44  import javax.mail.Session;
45  import javax.mail.Store;
46  import javax.mail.URLName;
47  import javax.mail.internet.InternetAddress;
48  
49  /**
50   * <a href="MailingListMessageListener.java.html"><b><i>View Source</i></b></a>
51   *
52   * @author Thiago Moreira
53   */
54  public class MailingListMessageListener implements MessageListener {
55  
56      public void receive(com.liferay.portal.kernel.messaging.Message message) {
57          MailingListRequest mailingListRequest =
58              (MailingListRequest)JSONFactoryUtil.deserialize(
59                  (String)message.getPayload());
60  
61          Store store = null;
62  
63          Folder folder = null;
64  
65          Message[] messages = null;
66  
67          try {
68              store = getStore(mailingListRequest);
69  
70              store.connect();
71  
72              folder = getFolder(store);
73  
74              messages = folder.getMessages();
75  
76              processMessages(mailingListRequest, messages);
77          }
78          catch (Exception e) {
79              _log.error(e, e);
80          }
81          finally {
82              if ((folder != null) && folder.isOpen()) {
83                  try {
84                      folder.setFlags(
85                          messages, new Flags(Flags.Flag.DELETED), true);
86                  }
87                  catch (Exception e) {
88                  }
89  
90                  try {
91                      folder.close(true);
92                  }
93                  catch (Exception e) {
94                  }
95              }
96  
97              if ((store != null) && store.isConnected()) {
98                  try {
99                      store.close();
100                 }
101                 catch (MessagingException e) {
102                 }
103             }
104         }
105     }
106 
107     protected Folder getFolder(Store store) throws Exception {
108         Folder defaultFolder = store.getDefaultFolder();
109 
110         Folder[] folders = defaultFolder.list();
111 
112         if ((folders != null) && (folders.length == 0)) {
113             throw new MessagingException("Inbox not found");
114         }
115 
116         Folder folder = folders[0];
117 
118         folder.open(Folder.READ_WRITE);
119 
120         return folder;
121     }
122 
123     protected Store getStore(MailingListRequest mailingListRequest)
124         throws Exception {
125 
126         String protocol = mailingListRequest.getInProtocol();
127         String host = mailingListRequest.getInServerName();
128         int port = mailingListRequest.getInServerPort();
129         String user = mailingListRequest.getInUserName();
130         String password = mailingListRequest.getInPassword();
131 
132         Account account = Account.getInstance(protocol, port);
133 
134         account.setHost(host);
135         account.setPort(port);
136         account.setUser(user);
137         account.setPassword(password);
138 
139         Session session = MailEngine.getSession(account);
140 
141         URLName urlName = new URLName(
142             protocol, host, port, StringPool.BLANK, user, password);
143 
144         Store store = session.getStore(urlName);
145 
146         return store;
147     }
148 
149     protected void processMessage(
150             MailingListRequest mailingListRequest, Message mailMessage)
151         throws Exception {
152 
153         if (MBUtil.hasMailIdHeader(mailMessage)) {
154             return;
155         }
156 
157         String from = null;
158 
159         Address[] addresses = mailMessage.getFrom();
160 
161         if ((addresses != null) && (addresses.length > 0)) {
162             Address address = addresses[0];
163 
164             if (address instanceof InternetAddress) {
165                 from = ((InternetAddress)address).getAddress();
166             }
167             else {
168                 from = address.toString();
169             }
170         }
171 
172         long companyId = mailingListRequest.getCompanyId();
173         long groupId = mailingListRequest.getGroupId();
174         long categoryId = mailingListRequest.getCategoryId();
175 
176         if (_log.isDebugEnabled()) {
177             _log.debug("Category id " + categoryId);
178         }
179 
180         boolean anonymous = false;
181 
182         User user = UserLocalServiceUtil.getUserById(
183             companyId, mailingListRequest.getUserId());
184 
185         try {
186             user = UserLocalServiceUtil.getUserByEmailAddress(companyId, from);
187         }
188         catch (NoSuchUserException nsue) {
189             anonymous = true;
190         }
191 
192         long parentMessageId = MBUtil.getParentMessageId(mailMessage);
193 
194         if (_log.isDebugEnabled()) {
195             _log.debug("Parent message id " + parentMessageId);
196         }
197 
198         MBMessage parentMessage = null;
199 
200         try {
201             if (parentMessageId > 0) {
202                 parentMessage = MBMessageLocalServiceUtil.getMessage(
203                     parentMessageId);
204             }
205         }
206         catch (NoSuchMessageException nsme) {
207         }
208 
209         if (_log.isDebugEnabled()) {
210             _log.debug("Parent message " + parentMessage);
211         }
212 
213         MBMailMessage collector = new MBMailMessage();
214 
215         MBUtil.collectPartContent(mailMessage, collector);
216 
217         PermissionCheckerUtil.setThreadValues(user);
218 
219         MailingListThreadLocal.setSourceMailingList(true);
220 
221         String subject = MBUtil.getSubjectWithoutMessageId(mailMessage);
222 
223         ServiceContext serviceContext = new ServiceContext();
224 
225         serviceContext.setAddCommunityPermissions(true);
226         serviceContext.setAddGuestPermissions(true);
227         serviceContext.setLayoutFullURL(
228             PortalUtil.getLayoutFullURL(groupId, PortletKeys.MESSAGE_BOARDS));
229         serviceContext.setScopeGroupId(groupId);
230 
231         if (parentMessage == null) {
232             MBMessageServiceUtil.addMessage(
233                 categoryId, subject, collector.getBody(), collector.getFiles(),
234                 anonymous, 0.0, serviceContext);
235         }
236         else {
237             MBMessageServiceUtil.addMessage(
238                 categoryId, parentMessage.getThreadId(),
239                 parentMessage.getMessageId(), subject, collector.getBody(),
240                 collector.getFiles(), anonymous, 0.0, serviceContext);
241         }
242     }
243 
244     protected void processMessages(
245             MailingListRequest mailingListRequest, Message[] messages)
246         throws Exception {
247 
248         for (Message message : messages) {
249             try {
250                 processMessage(mailingListRequest, message);
251             }
252             finally {
253                 PermissionCheckerUtil.setThreadValues(null);
254             }
255         }
256     }
257 
258     private static Log _log = LogFactoryUtil.getLog(
259         MailingListMessageListener.class);
260 
261 }