/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.mail;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.model.Member;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.model.User;
import org.eclipse.skalli.model.ext.commons.PeopleExtension;
import org.eclipse.skalli.services.mail.MailService;
import org.eclipse.skalli.services.user.UserServices;
import org.osgi.service.component.ComponentConstants;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MailComponent implements MailService {
private static final Logger LOG = LoggerFactory.getLogger(MailComponent.class);
protected void activate(ComponentContext context) {
LOG.info(MessageFormat.format("[MailService] {0} : activated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
protected void deactivate(ComponentContext context) {
LOG.info(MessageFormat.format("[MailService] {0} : deactivated",
(String) context.getProperties().get(ComponentConstants.COMPONENT_NAME)));
}
@Override
public void sendMailToProject(Project project, String subject, String body, Address from) {
List<Address> toAddresses = getToAddresses(project);
List<Address> ccAddresses = getCCAddresses(project);
if (toAddresses.size() > 0) {
sendMailInternal(toAddresses.toArray(new Address[toAddresses.size()]),
ccAddresses.toArray(new Address[ccAddresses.size()]), null, from, subject, body);
} else if (ccAddresses.size() > 0) {
sendMailInternal(ccAddresses.toArray(new Address[ccAddresses.size()]),
null, null, from, subject, body);
}
}
@Override
public List<Address> getToAddresses(Project project) {
PeopleExtension ext = project.getExtension(PeopleExtension.class);
if (ext == null) {
return Collections.emptyList();
}
return getAdresses(ext.getLeads());
}
@Override
public List<Address> getCCAddresses(Project project) {
PeopleExtension ext = project.getExtension(PeopleExtension.class);
if (ext == null) {
return Collections.emptyList();
}
return getAdresses(ext.getMembers());
}
/******************
* internal methods
******************/
private List<Address> getAdresses(Set<Member> members) {
List<Address> addressList = new ArrayList<Address>();
for (Member member : members) {
User user = UserServices.getUser(member.getUserID());
if (StringUtils.isNotBlank(user.getEmail())) {
try {
Address address = new InternetAddress(user.getEmail());
addressList.add(address);
} catch (AddressException e) {
throw new RuntimeException(e);
}
}
}
return addressList;
}
private void sendMailInternal(Address[] rcptTo, Address[] rcptCC, Address[] rcptBCC, Address from, String subject,
String body) {
try {
String mailHost = "mail.sap.corp"; //$NON-NLS-1$
Properties props = System.getProperties();
props.put("mail.smtp.host", mailHost); //$NON-NLS-1$
Session session = Session.getInstance(props, null);
Message message = new MimeMessage(session);
message.setFrom(from);
if (rcptTo != null && rcptTo.length > 0) {
message.setRecipients(Message.RecipientType.TO, rcptTo);
}
if (rcptCC != null && rcptCC.length > 0) {
message.setRecipients(Message.RecipientType.CC, rcptCC);
}
if (rcptBCC != null && rcptBCC.length > 0) {
message.setRecipients(Message.RecipientType.BCC, rcptBCC);
}
message.setSubject(subject);
message.setContent(body, "text/plain"); //$NON-NLS-1$
Transport.send(message);
} catch (AddressException e) {
throw new RuntimeException(e);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}