001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.messageboards.messaging;
016    
017    import com.liferay.portal.NoSuchUserException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.mail.Account;
021    import com.liferay.portal.kernel.messaging.MessageListener;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.model.User;
024    import com.liferay.portal.security.permission.PermissionCheckerUtil;
025    import com.liferay.portal.service.ServiceContext;
026    import com.liferay.portal.service.UserLocalServiceUtil;
027    import com.liferay.portal.util.PortalUtil;
028    import com.liferay.portal.util.PortletKeys;
029    import com.liferay.portlet.messageboards.NoSuchMessageException;
030    import com.liferay.portlet.messageboards.model.MBMessage;
031    import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
032    import com.liferay.portlet.messageboards.service.MBMessageServiceUtil;
033    import com.liferay.portlet.messageboards.util.MBMailMessage;
034    import com.liferay.portlet.messageboards.util.MBUtil;
035    import com.liferay.portlet.messageboards.util.MailingListThreadLocal;
036    import com.liferay.util.mail.MailEngine;
037    
038    import javax.mail.Address;
039    import javax.mail.Flags;
040    import javax.mail.Folder;
041    import javax.mail.Message;
042    import javax.mail.MessagingException;
043    import javax.mail.Session;
044    import javax.mail.Store;
045    import javax.mail.URLName;
046    import javax.mail.internet.InternetAddress;
047    
048    /**
049     * @author Thiago Moreira
050     */
051    public class MailingListMessageListener implements MessageListener {
052    
053            public void receive(com.liferay.portal.kernel.messaging.Message message) {
054                    MailingListRequest mailingListRequest =
055                            (MailingListRequest)message.getPayload();
056    
057                    Folder folder = null;
058    
059                    Message[] messages = null;
060    
061                    try {
062                            folder = getFolder(mailingListRequest);
063    
064                            messages = folder.getMessages();
065    
066                            processMessages(mailingListRequest, messages);
067                    }
068                    catch (Exception e) {
069                            _log.error(e, e);
070                    }
071                    finally {
072                            if ((folder != null) && folder.isOpen()) {
073                                    try {
074                                            folder.setFlags(
075                                                    messages, new Flags(Flags.Flag.DELETED), true);
076                                    }
077                                    catch (Exception e) {
078                                    }
079    
080                                    try {
081                                            folder.close(true);
082                                    }
083                                    catch (Exception e) {
084                                    }
085                            }
086                    }
087            }
088    
089            protected Folder getFolder(MailingListRequest mailingListRequest)
090                    throws Exception {
091    
092                    String protocol = mailingListRequest.getInProtocol();
093                    String host = mailingListRequest.getInServerName();
094                    int port = mailingListRequest.getInServerPort();
095                    String user = mailingListRequest.getInUserName();
096                    String password = mailingListRequest.getInPassword();
097    
098                    Account account = Account.getInstance(protocol, port);
099    
100                    account.setHost(host);
101                    account.setPort(port);
102                    account.setUser(user);
103                    account.setPassword(password);
104    
105                    Session session = MailEngine.getSession(account);
106    
107                    URLName urlName = new URLName(
108                            protocol, host, port, StringPool.BLANK, user, password);
109    
110                    Store store = session.getStore(urlName);
111    
112                    store.connect();
113    
114                    Folder defaultFolder = store.getDefaultFolder();
115    
116                    Folder[] folders = defaultFolder.list();
117    
118                    if ((folders != null) && (folders.length == 0)) {
119                            throw new MessagingException("Inbox not found");
120                    }
121    
122                    Folder folder = folders[0];
123    
124                    folder.open(Folder.READ_WRITE);
125    
126                    return folder;
127            }
128    
129            protected void processMessage(
130                            MailingListRequest mailingListRequest, Message mailMessage)
131                    throws Exception {
132    
133                    if (MBUtil.hasMailIdHeader(mailMessage)) {
134                            return;
135                    }
136    
137                    String from = null;
138    
139                    Address[] addresses = mailMessage.getFrom();
140    
141                    if ((addresses != null) && (addresses.length > 0)) {
142                            Address address = addresses[0];
143    
144                            if (address instanceof InternetAddress) {
145                                    from = ((InternetAddress)address).getAddress();
146                            }
147                            else {
148                                    from = address.toString();
149                            }
150                    }
151    
152                    long companyId = mailingListRequest.getCompanyId();
153                    long groupId = mailingListRequest.getGroupId();
154                    long categoryId = mailingListRequest.getCategoryId();
155    
156                    if (_log.isDebugEnabled()) {
157                            _log.debug("Category id " + categoryId);
158                    }
159    
160                    boolean anonymous = false;
161    
162                    User user = UserLocalServiceUtil.getUserById(
163                            companyId, mailingListRequest.getUserId());
164    
165                    try {
166                            user = UserLocalServiceUtil.getUserByEmailAddress(companyId, from);
167                    }
168                    catch (NoSuchUserException nsue) {
169                            anonymous = true;
170                    }
171    
172                    long parentMessageId = MBUtil.getParentMessageId(mailMessage);
173    
174                    if (_log.isDebugEnabled()) {
175                            _log.debug("Parent message id " + parentMessageId);
176                    }
177    
178                    MBMessage parentMessage = null;
179    
180                    try {
181                            if (parentMessageId > 0) {
182                                    parentMessage = MBMessageLocalServiceUtil.getMessage(
183                                            parentMessageId);
184                            }
185                    }
186                    catch (NoSuchMessageException nsme) {
187                    }
188    
189                    if (_log.isDebugEnabled()) {
190                            _log.debug("Parent message " + parentMessage);
191                    }
192    
193                    MBMailMessage collector = new MBMailMessage();
194    
195                    MBUtil.collectPartContent(mailMessage, collector);
196    
197                    PermissionCheckerUtil.setThreadValues(user);
198    
199                    MailingListThreadLocal.setSourceMailingList(true);
200    
201                    String subject = MBUtil.getSubjectWithoutMessageId(mailMessage);
202    
203                    ServiceContext serviceContext = new ServiceContext();
204    
205                    serviceContext.setAddCommunityPermissions(true);
206                    serviceContext.setAddGuestPermissions(true);
207                    serviceContext.setLayoutFullURL(
208                            PortalUtil.getLayoutFullURL(groupId, PortletKeys.MESSAGE_BOARDS));
209                    serviceContext.setScopeGroupId(groupId);
210    
211                    if (parentMessage == null) {
212                            MBMessageServiceUtil.addMessage(
213                                    groupId, categoryId, subject, collector.getBody(),
214                                    collector.getFiles(), anonymous, 0.0, true, serviceContext);
215                    }
216                    else {
217                            MBMessageServiceUtil.addMessage(
218                                    groupId, categoryId, parentMessage.getThreadId(),
219                                    parentMessage.getMessageId(), subject, collector.getBody(),
220                                    collector.getFiles(), anonymous, 0.0, true, serviceContext);
221                    }
222            }
223    
224            protected void processMessages(
225                            MailingListRequest mailingListRequest, Message[] messages)
226                    throws Exception {
227    
228                    for (Message message : messages) {
229                            try {
230                                    processMessage(mailingListRequest, message);
231                            }
232                            finally {
233                                    PermissionCheckerUtil.setThreadValues(null);
234                            }
235                    }
236            }
237    
238            private static Log _log = LogFactoryUtil.getLog(
239                    MailingListMessageListener.class);
240    
241    }