package com.ibm.sbt.services.client.email; import java.util.ArrayList; import java.util.List; import com.ibm.commons.util.io.json.JsonObject; /** * An abstract implementation of MIMEEmail. Implementors should extend this * class when supporting MIME emails. * */ public abstract class AbstractMimeEmail implements MimeEmail { private List<String> to; private List<String> cc; private List<String> bcc; private List<MimePart> mimeParts; private String subject; /** * Constructs a MIME email. */ public AbstractMimeEmail() { setTo(new ArrayList<String>()); setCC(new ArrayList<String>()); setBCC(new ArrayList<String>()); setSubject(""); setMimeParts(new ArrayList<MimePart>()); } /** * Constructs a MIME email. * @param to A list of email addresses for the to field. * @param cc A list of email addresses for the cc field. * @param bcc A list of email addresses for the bcc field. * @param subject The subject of the email. * @param mimeParts A list of MIME parts to add to the email. */ public AbstractMimeEmail(List<String> to, List<String> cc, List<String> bcc, String subject, List<MimePart> mimeParts) { setSubject(subject); setTo(to); setCC(cc); setBCC(bcc); setMimeParts(mimeParts); } /** * Constructs a MIME email from a JSON object. The JSON object should follow the below * model. * * <code> * * { * "to" : ["fadams@renovations.com", "tamado@renovations.com"], * "cc" : ["pclemmons@renovations.com"], * "bcc" : [], * "subject" : "This is a test email" * "mimeParts" : [ * { * "mimeType" : "text/plain", * "content" : "This is plain text" * "headers" : * { * "header1":"value1", * "header2":"value2" * } * }, * { * "mimeType" : "text/html", * "content" : "<b>This is html</b>" * }, * { * "mimeType" : "application/embed+json", * "content" : { * "gadget" : "http://renovations.com/gadget.xml", * "context" : { * "foo" : "bar" * } * } * } * ] * } * * </code> * @param json The JSON to create the MIME email from. * @throws MimeEmailException Thrown when there was an error creating the new MIME email. */ public AbstractMimeEmail(JsonObject json) throws MimeEmailException { Object subjectObj = json.getJsonProperty(SUBJECT); if(subjectObj instanceof String) { setSubject((String)subjectObj); } else { setSubject(""); } Object toObj = json.getJsonProperty(TO); if(toObj instanceof List) { setTo((List<String>)toObj); } else { setTo(new ArrayList<String>()); } Object ccObj = json.getJsonProperty("cc"); if(ccObj instanceof List) { setCC((List<String>)ccObj); } else { setCC(new ArrayList<String>()); } Object bccObj = json.getJsonProperty(BCC); if(bccObj instanceof List) { setBCC((List<String>)bccObj); } else { setBCC(new ArrayList<String>()); } Object mimePartsObj = json.getJsonProperty(MIME_PARTS); if(mimePartsObj instanceof List) { setMimeParts(createMimeParts((List<JsonObject>)mimePartsObj)); } else { setMimeParts(new ArrayList<MimePart>()); } } /** * Creates a list of MimePart objects from a List JsonObjects. * @param mimeParts The List of JsonObjects to construct the MimePart objects from. * @return A list of MimePart objects. * @throws MimeEmailException Thrown when there is an error creating the MimePart objects. */ protected List<MimePart> createMimeParts(List<JsonObject> mimeParts) throws MimeEmailException { List<MimePart> parts = new ArrayList<MimePart>(mimeParts.size()); for(JsonObject json : mimeParts) { parts.add(new MimePart(json)); } return parts; } @Override public String getSubject() { return subject; } @Override public void setSubject(String subject) { this.subject = (subject == null) ? "" : subject; } @Override public List<String> getTo() { return to; } @Override public String getCommaSeparatedTo() { return createCommaSeparatedList(getTo()); } @Override public void setTo(List<String> to) { this.to = (to == null) ? new ArrayList<String>() : to; } @Override public void addToAddress(String email) { if(email == null) return; this.to.add(email); } @Override public void removeToAddress(String email) { this.to.remove(email); } @Override public List<String> getCC() { return cc; } @Override public String getCommaSeparatedCC() { return createCommaSeparatedList(getCC()); } @Override public void setCC(List<String> cc) { this.cc = (cc == null) ? new ArrayList<String>() : cc; } @Override public void addCCAddress(String email) { if(email == null) return; this.cc.add(email); } @Override public void removeCCAddress(String email) { this.cc.remove(email); } @Override public List<String> getBCC() { return bcc; } @Override public String getCommaSeparatedBCC() { return createCommaSeparatedList(getBCC()); } @Override public void setBCC(List<String> bcc) { this.bcc = (bcc == null) ? new ArrayList<String>() : bcc; } @Override public void addBCCAddress(String email) { if(email == null) return; this.bcc.add(email); } @Override public void removeBCCAddress(String email) { this.bcc.remove(email); } @Override public List<MimePart> getMimeParts() { return mimeParts; } @Override public void setMimeParts(List<MimePart> mimeParts) { this.mimeParts = (mimeParts == null) ? new ArrayList<MimePart>() : mimeParts; } @Override public void addMimePart(MimePart mimePart) { if(mimePart == null) return; this.mimeParts.add(mimePart); } @Override public void removeMimePart(MimePart mimePart) { this.mimeParts.remove(mimePart); } @Override public boolean equals(Object o) { boolean result = true; if(o instanceof DefaultMimeEmail) { MimeEmail test = (MimeEmail)o; result &= test.getBCC().equals(this.getBCC()); result &= test.getCC().equals(this.getCC()); result &= test.getCommaSeparatedBCC().equals(this.getCommaSeparatedBCC()); result &= test.getCommaSeparatedCC().equals(this.getCommaSeparatedCC()); result &= test.getCommaSeparatedTo().equals(this.getCommaSeparatedTo()); result &= test.getMimeParts().equals(this.getMimeParts()); result &= (test.getSubject() == null) ? test.getSubject() == this.getSubject() : test.getSubject().equals(this.getSubject()); result &= test.getTo().equals(this.getTo()); } else { result = false; } return result; } /** * Creates a comma separated list. * @param items The list of items to create the list from. * @return A comma separated list. */ private String createCommaSeparatedList(List<String> items) { StringBuilder list = new StringBuilder(); for(int i = 0; i < items.size(); i++) { list.append(items.get(i)); if(i != items.size() -1) { list.append(","); } } return list.toString(); } @Override public abstract void send() throws MimeEmailException; }