package jhydra.core.config.email;
import jhydra.core.config.exceptions.InvalidEmailAddressException;
import jhydra.core.exceptions.FatalException;
import jhydra.core.properties.IProperties;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import java.util.ArrayList;
import java.util.List;
/**
* User: jantic
* Date: 1/10/13
*/
//TODO: Use a non smtp based email sending program, to minimize complication.
//TODO: This should probably be something that's set up in a wizard. Until then, just don't send emails
public class EmailSettings implements IEmailSettings {
private final List<InternetAddress> failureRecipients;
private final List<InternetAddress> successRecipients;
private final InternetAddress sender;
public EmailSettings(IProperties properties) throws FatalException{
this.failureRecipients = parseFailureRecipients(properties);
this.successRecipients = parseSuccessRecipients(properties);
this.sender = parseSender(properties);
}
@Override
public List<InternetAddress> getFailureRecipients(){
return this.failureRecipients;
}
@Override
public List<InternetAddress> getSuccessRecipients(){
return this.successRecipients;
}
@Override
public InternetAddress getSender(){
return this.sender;
}
private List<InternetAddress> parseFailureRecipients(IProperties properties) throws FatalException{
final String key = getFailureRecipientsKey();
if(properties.hasProperty(key)){
final String emailsString = properties.getProperty(key);
return convertToEmailAddressObjects(emailsString);
}
return new ArrayList<>();
}
private List<InternetAddress> convertToEmailAddressObjects(String emailsString){
final String[] emailAddressStrings = emailsString.split(",");
final List<InternetAddress> emailAddressList = new ArrayList<>();
for(String emailAddressString : emailAddressStrings){
emailAddressString = emailAddressString.trim();
try{
if(!emailAddressString.isEmpty()){
final InternetAddress internetAddress = new InternetAddress(emailAddressString);
emailAddressList.add(internetAddress);
}
}
catch(AddressException e){
//Just skip over it, log a warning.
//TODO: Log a warning here.
}
}
return emailAddressList;
}
private String getFailureRecipientsKey(){
return "Email.FailureRecipients";
}
private List<InternetAddress> parseSuccessRecipients(IProperties properties) throws FatalException{
final String key = getSuccessRecipientsKey();
if(properties.hasProperty(key)){
final String emailsString = properties.getProperty(getSuccessRecipientsKey());
return convertToEmailAddressObjects(emailsString);
}
return new ArrayList<>();
}
private String getSuccessRecipientsKey(){
return "Email.SuccessRecipients";
}
private InternetAddress parseSender(IProperties properties) throws FatalException{
final String key = getSenderKey();
String senderEmailString = "";
try{
if(properties.hasProperty(key)){
senderEmailString = properties.getProperty(getSenderKey());
return new InternetAddress(senderEmailString);
}
}
catch(AddressException e){
//We can't send an email without a sender.
throw new InvalidEmailAddressException(senderEmailString, e.getMessage());
}
return new InternetAddress();
}
private String getSenderKey(){
return "Email.Sender";
}
}