/** * */ package net.frontlinesms.data.domain; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.OneToMany; /** * @author Alex Anderson <alex@frontlinesms.com> */ @Entity public class FrontlineMultimediaMessage extends FrontlineMessage { private String subject; @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) private List<FrontlineMultimediaMessagePart> multimediaParts; //> CONSTRUCTORS /** Empty constructor for Hibernate */ FrontlineMultimediaMessage() {} /** * @param type * @param subject this must not be <code>null</code> * @param textContent * @param multimediaParts */ public FrontlineMultimediaMessage(Type type, String subject, String textContent, List<FrontlineMultimediaMessagePart> multimediaParts) { super(type, textContent); if (subject == null) subject = ""; this.subject = subject; this.setMultimediaParts(multimediaParts); } public FrontlineMultimediaMessage(Type type, String subject, String textContent) { super(type, textContent); if (subject == null) subject = ""; this.subject = subject; } //> ACCESSORS public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public List<FrontlineMultimediaMessagePart> getMultimediaParts() { return Collections.unmodifiableList(this.multimediaParts); } public void setMultimediaParts(List<FrontlineMultimediaMessagePart> multimediaParts) { this.multimediaParts = multimediaParts; } public boolean hasBinaryPart() { for (FrontlineMultimediaMessagePart part : this.getMultimediaParts()) { if (part.isBinary()) { return true; } } return false; } @Override public String toString() { return toString(true); } public String toString(boolean truncate) { StringBuilder textContent = new StringBuilder(); if (this.subject != null && !this.subject.trim().isEmpty()) { textContent.append("Subject: " + this.subject); } if (this.multimediaParts != null) { for(FrontlineMultimediaMessagePart part : this.multimediaParts) { if(textContent.length() > 0) textContent.append("; "); textContent.append(part.toString(truncate)); } } return textContent.toString(); } //> STATIC METHODS public static boolean appearsToBeToString(String toString) { return toString.contains("File:"); } public static FrontlineMultimediaMessage createMessageFromContentString(String messageContent, boolean truncate) { FrontlineMultimediaMessage multimediaMessage = new FrontlineMultimediaMessage(Type.RECEIVED, "", ""); List<FrontlineMultimediaMessagePart> multimediaParts = new ArrayList<FrontlineMultimediaMessagePart>(); Pattern textPattern = Pattern.compile("\"(.*)\""); Pattern binaryFilePattern = Pattern.compile("File: (.*)"); Pattern subjectPattern = Pattern.compile("Subject: (.*)"); Matcher matcher; for (String part : messageContent.split(";")) { if ((matcher = subjectPattern.matcher(part.trim())).find()) { multimediaMessage.setSubject(matcher.group(1)); } else if ((matcher = binaryFilePattern.matcher(part.trim())).find()) { multimediaParts.add(FrontlineMultimediaMessagePart.createBinaryPart(matcher.group(1))); } else if ((matcher = textPattern.matcher(part.trim())).find()) { multimediaParts.add(FrontlineMultimediaMessagePart.createTextPart(matcher.group(1))); } } multimediaMessage.setMultimediaParts(multimediaParts); multimediaMessage.setTextMessageContent(multimediaMessage.toString(truncate)); return multimediaMessage; } }