http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java ---------------------------------------------------------------------- diff --git a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java index 138331a..50a554b 100644 --- a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java +++ b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java @@ -19,978 +19,498 @@ package org.apache.james.mime4j.message; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import org.apache.james.mime4j.MimeException; -import org.apache.james.mime4j.MimeIOException; import org.apache.james.mime4j.codec.DecodeMonitor; import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.FieldParser; -import org.apache.james.mime4j.dom.Header; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.Multipart; -import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.address.Address; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Mailbox; import org.apache.james.mime4j.dom.address.MailboxList; -import org.apache.james.mime4j.dom.field.AddressListField; -import org.apache.james.mime4j.dom.field.DateTimeField; -import org.apache.james.mime4j.dom.field.FieldName; -import org.apache.james.mime4j.dom.field.MailboxField; -import org.apache.james.mime4j.dom.field.MailboxListField; import org.apache.james.mime4j.dom.field.ParseException; -import org.apache.james.mime4j.dom.field.UnstructuredField; -import org.apache.james.mime4j.field.DefaultFieldParser; -import org.apache.james.mime4j.field.Fields; -import org.apache.james.mime4j.field.LenientFieldParser; -import org.apache.james.mime4j.field.address.DefaultAddressParser; -import org.apache.james.mime4j.io.InputStreams; -import org.apache.james.mime4j.parser.MimeStreamParser; +import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.stream.BodyDescriptorBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.MimeConfig; import org.apache.james.mime4j.stream.NameValuePair; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + /** - * {@link org.apache.james.mime4j.dom.Message} builder. + * Deprecated: please use {@link org.apache.james.mime4j.dom.Message.Builder Message.Builder} instead + * This builder will create message that do not respect the + * <code>Message.getDate()</code> contract regarding the return + * value when the message do not have a Date header + * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> */ -public class MessageBuilder extends AbstractEntityBuilder { - - private MimeConfig config; - private DecodeMonitor monitor; - private BodyDescriptorBuilder bodyDescBuilder; - private FieldParser<?> fieldParser; - private BodyFactory bodyFactory; - private boolean flatMode; - private boolean rawContent; - private final boolean ensureDateNotNull; - - /** - * Deprecated: please use {@link #of() of} instead - * Building a builder using this method will result in a buggy builder which - * will create message that do not respect the <code>Message.getDate()</code> contract regarding - * the return value when the message do not have a Date header - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Deprecated - public MessageBuilder() { - this(true); - } +@Deprecated +@SuppressWarnings("deprecation") +public class MessageBuilder { + private final Message.Builder builder; - private MessageBuilder(boolean ensureDateNotNull) { - this.ensureDateNotNull = ensureDateNotNull; + public MessageBuilder() { + this(Message.Builder.of()); } - public static MessageBuilder of() { - return new MessageBuilder(false); + private MessageBuilder(Message.Builder builder) { + this.builder = builder; } - /** - * Deprecated: please use {@link #of() of} instead - * Building a builder using this method will result in a buggy builder which - * will create message that do not respect the <code>Message.getDate()</code> contract regarding - * the return value when the message do not have a Date header - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Deprecated public static MessageBuilder create() { - return new MessageBuilder(true); + return new MessageBuilder(); } - public static MessageBuilder of(Message other) { - return new MessageBuilder(false).copy(other); - } - - /** - * Deprecated: please use {@link #of(Message) of} instead - * Building a builder using this method will result in a buggy builder which - * will create message that do not respect the <code>Message.getDate()</code> contract regarding - * the return value when the message do not have a Date header - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Deprecated public static MessageBuilder createCopy(Message other) { - return new MessageBuilder().copy(other); + return new MessageBuilder(Message.Builder.of(other)); } - public static MessageBuilder of(final InputStream is) throws IOException { - return new MessageBuilder(false).parse(is); + public static MessageBuilder read(InputStream is) throws IOException { + return new MessageBuilder(Message.Builder.of(is)); } - /** - * Deprecated: please use {@link #of(InputStream) of} instead - * Building a builder using this method will result in a buggy builder which - * will create message that do not respect the <code>Message.getDate()</code> contract regarding - * the return value when the message do not have a Date header - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Deprecated - public static MessageBuilder read(final InputStream is) throws IOException { - return new MessageBuilder().parse(is); - } - /** - * Sets MIME configuration. - * - * @param config the configuration. - */ - public MessageBuilder use(MimeConfig config) { - this.config = config; - return this; - } + public MessageBuilder enableFlatMode() { + builder.enableFlatMode(); - /** - * Sets {@link org.apache.james.mime4j.codec.DecodeMonitor} that will be - * used to handle malformed data when executing {@link #parse(java.io.InputStream)}. - * - * @param monitor the decoder monitor. - */ - public MessageBuilder use(DecodeMonitor monitor) { - this.monitor = monitor; return this; } - /** - * Sets {@link org.apache.james.mime4j.stream.BodyDescriptorBuilder} that will be - * used to generate body descriptors when executing {@link #parse(java.io.InputStream)}. - * - * @param bodyDescBuilder the body descriptor builder. - */ - public MessageBuilder use(BodyDescriptorBuilder bodyDescBuilder) { - this.bodyDescBuilder = bodyDescBuilder; + public MessageBuilder disableFlatMode() { + builder.disableFlatMode(); + return this; } - /** - * Sets {@link org.apache.james.mime4j.dom.FieldParser} that will be - * used to generate parse message fields when executing {@link #parse(java.io.InputStream)}. - * - * @param fieldParser the field parser. - */ - public MessageBuilder use(FieldParser<?> fieldParser) { - this.fieldParser = fieldParser; + public MessageBuilder enableContentDecoding() { + builder.enableContentDecoding(); + return this; } - /** - * Sets {@link org.apache.james.mime4j.message.BodyFactory} that will be - * used to generate message body. - * - * @param bodyFactory the body factory. - */ - public MessageBuilder use(BodyFactory bodyFactory) { - this.bodyFactory = bodyFactory; + public MessageBuilder disableContentDecoding() { + builder.disableContentDecoding(); + return this; } - /** - * Enables flat parsing mode for {@link #parse(java.io.InputStream)} operation. - */ - public MessageBuilder enableFlatMode() { - this.flatMode = true; + public MessageBuilder setField(Field field) { + builder.setField(field); + return this; } - /** - * Disables flat parsing mode for {@link #parse(java.io.InputStream)} operation. - */ - public MessageBuilder disableFlatMode() { - this.flatMode = false; + public MessageBuilder addField(Field field) { + builder.addField(field); + return this; } - /** - * Enables automatic content decoding for {@link #parse(java.io.InputStream)} operation. - */ - public MessageBuilder enableContentDecoding() { - this.rawContent = false; - return this; + public Field getField(String name) { + return builder.getField(name); } - /** - * Enables disable content decoding for {@link #parse(java.io.InputStream)} operation. - */ - public MessageBuilder disableContentDecoding() { - this.rawContent = true; - return this; + public <F extends Field> F getField(final String name, final Class<F> clazz) { + return builder.getField(name, clazz); } - @Override - public MessageBuilder setField(Field field) { - super.setField(field); - return this; + public List<Field> getFields() { + return builder.getFields(); } - @Override - public MessageBuilder addField(Field field) { - super.addField(field); - return this; + public <F extends Field> List<F> getFields(final String name, final Class<F> clazz) { + return builder.getFields(name, clazz); } - @Override public MessageBuilder removeFields(String name) { - super.removeFields(name); + builder.removeFields(name); + return this; } - @Override public MessageBuilder clearFields() { - super.clearFields(); + builder.clearFields(); + return this; } - @Override - public MessageBuilder setContentTransferEncoding(String contentTransferEncoding) { - super.setContentTransferEncoding(contentTransferEncoding); - return this; + public boolean containsField(String name) { + return builder.containsField(name); + } + + public String getMimeType() { + return builder.getMimeType(); + } + + public String getCharset() { + return builder.getCharset(); + } + + public String getContentTransferEncoding() { + return builder.getContentTransferEncoding(); } - @Override public MessageBuilder setContentType(String mimeType, NameValuePair... parameters) { - super.setContentType(mimeType, parameters); + builder.setContentType(mimeType, parameters); + + return this; + } + + public MessageBuilder setContentTransferEncoding(String contentTransferEncoding) { + builder.setContentTransferEncoding(contentTransferEncoding); + return this; } - @Override + public String getDispositionType() { + return builder.getDispositionType(); + } + public MessageBuilder setContentDisposition(String dispositionType) { - super.setContentDisposition(dispositionType); + builder.setContentDisposition(dispositionType); + return this; } - @Override public MessageBuilder setContentDisposition(String dispositionType, String filename) { - super.setContentDisposition(dispositionType, filename); + builder.setContentDisposition(dispositionType, filename); + return this; } - @Override public MessageBuilder setContentDisposition(String dispositionType, String filename, long size) { - super.setContentDisposition(dispositionType, filename, size); + builder.setContentDisposition(dispositionType, filename, size); + + return this; + } + + public MessageBuilder setContentDisposition(String dispositionType, String filename, long size, Date creationDate, Date modificationDate, Date readDate) { + builder.setContentDisposition(dispositionType, filename, size, creationDate, modificationDate, readDate); + return this; } - @Override - public MessageBuilder setContentDisposition(String dispositionType, String filename, long size, - Date creationDate, Date modificationDate, Date readDate) { - super.setContentDisposition(dispositionType, filename, size, creationDate, modificationDate, readDate); + public Body getBody() { + return builder.getBody(); + } + + public MessageBuilder setBody(Multipart multipart) { + builder.setBody(multipart); + + return this; + } + + public MessageBuilder setBody(Message message) { + builder.setBody(message); + return this; } - @Override public MessageBuilder setBody(Body body) { - super.setBody(body); + builder.setBody(body); + return this; } - @Override public MessageBuilder setBody(TextBody textBody) { - super.setBody(textBody); + builder.setBody(textBody); + return this; } - @Override public MessageBuilder setBody(BinaryBody binaryBody) { - super.setBody(binaryBody); + builder.setBody(binaryBody); + return this; } - @Override - public MessageBuilder setBody(Multipart multipart) { - super.setBody(multipart); + public MessageBuilder setBody(String text, Charset charset) throws IOException { + builder.setBody(text, charset); + return this; } - @Override - public MessageBuilder setBody(Message message) { - super.setBody(message); + public MessageBuilder setBody(String text, String subtype, Charset charset) throws IOException { + builder.setBody(text, subtype, charset); + return this; } - /** - * Sets text of this message with the charset. - * - * @param text - * the text. - * @param charset - * the charset of the text. - */ - public MessageBuilder setBody(String text, Charset charset) throws IOException { - return setBody(text, null, charset); - } - - /** - * Sets text of this message with the given MIME subtype and charset. - * - * @param text - * the text. - * @param charset - * the charset of the text. - * @param subtype - * the text subtype (e.g. "plain", "html" or - * "xml"). - */ - public MessageBuilder setBody(String text, String subtype, Charset charset) throws IOException { - String mimeType = "text/" + (subtype != null ? subtype : "plain"); - if (charset != null) { - setField(Fields.contentType(mimeType, new NameValuePair("charset", charset.name()))); - } else { - setField(Fields.contentType(mimeType)); - } - Body textBody; - if (bodyFactory != null) { - textBody = bodyFactory.textBody( - InputStreams.create(text, charset), - charset != null ? charset.name() : null); - } else { - textBody = BasicBodyFactory.INSTANCE.textBody(text, charset); - } - return setBody(textBody); - } - - /** - * Sets binary content of this message with the given MIME type. - * - * @param bin - * the body. - * @param mimeType - * the MIME media type of the specified body - * ("type/subtype"). - */ public MessageBuilder setBody(byte[] bin, String mimeType) throws IOException { - setField(Fields.contentType(mimeType != null ? mimeType : "application/octet-stream")); - Body binBody; - if (bodyFactory != null) { - binBody = bodyFactory.binaryBody(InputStreams.create(bin)); - } else { - binBody = BasicBodyFactory.INSTANCE.binaryBody(bin); - } - return setBody(binBody); + builder.setBody(bin, mimeType); + + return this; + } + + + public String getFilename() { + return builder.getFilename(); + } + + public long getSize() { + return builder.getSize(); + } + + public Date getCreationDate() { + return builder.getCreationDate(); + } + + public Date getModificationDate() { + return builder.getModificationDate(); + } + + public Date getReadDate() { + return getReadDate(); } - /** - * Returns the value of the <i>Message-ID</i> header field of this message - * or <code>null</code> if it is not present. - * - * @return the identifier of this message. - */ public String getMessageId() { - Field field = obtainField(FieldName.MESSAGE_ID); - return field != null ? field.getBody() : null; + return builder.getMessageId(); } - /** - * Generates and sets message ID for this message. - * - * @param hostname - * host name to be included in the identifier or - * <code>null</code> if no host name should be included. - */ - public MessageBuilder generateMessageId(String hostname) { - if (hostname == null) { - removeFields(FieldName.MESSAGE_ID); - } else { - setField(Fields.generateMessageId(hostname)); - } + public MessageBuilder setMessageId(String messageId) { + builder.setMessageId(messageId); + return this; } - /** - * Sets message ID for this message. - * - * @param messageId - * the message ID. - */ - public MessageBuilder setMessageId(String messageId) { - if (messageId == null) { - removeFields(FieldName.MESSAGE_ID); - } else { - setField(Fields.messageId(messageId)); - } + public MessageBuilder generateMessageId(String hostname) { + builder.generateMessageId(hostname); + return this; } - /** - * Returns the (decoded) value of the <i>Subject</i> header field of this - * message or <code>null</code> if it is not present. - * - * @return the subject of this message. - */ public String getSubject() { - UnstructuredField field = obtainField(FieldName.SUBJECT); - return field != null ? field.getValue() : null; - } - - /** - * Sets <i>Subject</i> header field for this message. The specified - * string may contain non-ASCII characters, in which case it gets encoded as - * an 'encoded-word' automatically. - * - * @param subject - * subject to set or <code>null</code> to remove the subject - * header field. - */ + return builder.getSubject(); + } + public MessageBuilder setSubject(String subject) { - if (subject == null) { - removeFields(FieldName.SUBJECT); - } else { - setField(Fields.subject(subject)); - } + builder.setSubject(subject); + return this; } - /** - * Returns the value of the <i>Date</i> header field of this message as - * <code>Date</code> object or <code>null</code> if it is not present. - * - * @return the date of this message. - */ public Date getDate() { - DateTimeField field = obtainField(FieldName.DATE); - return field != null ? field.getDate() : null; - } - - /** - * Sets <i>Date</i> header field for this message. This method uses the - * default <code>TimeZone</code> of this host to encode the specified - * <code>Date</code> object into a string. - * - * @param date - * date to set or <code>null</code> to remove the date header - * field. - */ + return builder.getDate(); + } + public MessageBuilder setDate(Date date) { - return setDate(date, null); - } - - /** - * Sets <i>Date</i> header field for this message. The specified - * <code>TimeZone</code> is used to encode the specified <code>Date</code> - * object into a string. - * - * @param date - * date to set or <code>null</code> to remove the date header - * field. - * @param zone - * a time zone. - */ + builder.setDate(date); + + return this; + } + public MessageBuilder setDate(Date date, TimeZone zone) { - if (date == null) { - removeFields(FieldName.DATE); - } else { - setField(Fields.date(FieldName.DATE, date, zone)); - } + builder.setDate(date, zone); + return this; } - /** - * Returns the value of the <i>Sender</i> header field of this message as - * <code>Mailbox</code> object or <code>null</code> if it is not - * present. - * - * @return the sender of this message. - */ public Mailbox getSender() { - return getMailbox(FieldName.SENDER); + return builder.getSender(); } - /** - * Sets <i>Sender</i> header field of this message to the specified - * mailbox address. - * - * @param sender - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setSender(Mailbox sender) { - return setMailbox(FieldName.SENDER, sender); + builder.setSender(sender); + + return this; } - /** - * Sets <i>Sender</i> header field of this message to the specified - * mailbox address. - * - * @param sender - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setSender(String sender) throws ParseException { - return setMailbox(FieldName.SENDER, sender); + builder.setSender(sender); + + return this; } - /** - * Returns the value of the <i>From</i> header field of this message as - * <code>MailboxList</code> object or <code>null</code> if it is not - * present. - * - * @return value of the from field of this message. - */ public MailboxList getFrom() { - return getMailboxList(FieldName.FROM); + return builder.getFrom(); + } + + public MessageBuilder setFrom(String... from) throws ParseException { + builder.setFrom(from); + + return this; + } + + public MessageBuilder setFrom(Collection<Mailbox> from) { + builder.setFrom(from); + + return this; } - /** - * Sets <i>From</i> header field of this message to the specified - * mailbox address. - * - * @param from - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setFrom(Mailbox from) { - return setMailboxList(FieldName.FROM, from); + builder.setFrom(from); + + return this; } - /** - * Sets <i>From</i> header field of this message to the specified - * mailbox address. - * - * @param from - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setFrom(String from) throws ParseException { - return setMailboxList(FieldName.FROM, from); + builder.setFrom(from); + + return this; } - /** - * Sets <i>From</i> header field of this message to the specified - * mailbox addresses. - * - * @param from - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ public MessageBuilder setFrom(Mailbox... from) { - return setMailboxList(FieldName.FROM, from); + builder.setFrom(from); + + return this; } - /** - * Sets <i>From</i> header field of this message to the specified - * mailbox addresses. - * - * @param from - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ - public MessageBuilder setFrom(String... from) throws ParseException { - return setMailboxList(FieldName.FROM, from); + public AddressList getTo() { + return builder.getTo(); } - /** - * Sets <i>From</i> header field of this message to the specified - * mailbox addresses. - * - * @param from - * addresses to set or <code>null</code> or an empty collection - * to remove the header field. - */ - public MessageBuilder setFrom(Collection<Mailbox> from) { - return setMailboxList(FieldName.FROM, from); + public MessageBuilder setTo(String... to) throws ParseException { + builder.setTo(to); + + return this; } - /** - * Returns the value of the <i>To</i> header field of this message as - * <code>AddressList</code> object or <code>null</code> if it is not - * present. - * - * @return value of the to field of this message. - */ - public AddressList getTo() { - return getAddressList(FieldName.TO); + public MessageBuilder setTo(Collection<? extends Address> to) { + builder.setTo(to); + + return this; } - /** - * Sets <i>To</i> header field of this message to the specified - * address. - * - * @param to - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setTo(Address to) { - return setAddressList(FieldName.TO, to); + builder.setTo(to); + + return this; } - /** - * Sets <i>To</i> header field of this message to the specified - * address. - * - * @param to - * address to set or <code>null</code> to remove the header - * field. - */ public MessageBuilder setTo(String to) throws ParseException { - return setAddressList(FieldName.TO, to); - } + builder.setTo(to); - /** - * Sets <i>To</i> header field of this message to the specified - * addresses. - * - * @param to - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ - public MessageBuilder setTo(Address... to) { - return setAddressList(FieldName.TO, to); + return this; } - /** - * Sets <i>To</i> header field of this message to the specified - * addresses. - * - * @param to - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ - public MessageBuilder setTo(String... to) throws ParseException { - return setAddressList(FieldName.TO, to); - } + public MessageBuilder setTo(Address... to) { + builder.setTo(to); - /** - * Sets <i>To</i> header field of this message to the specified - * addresses. - * - * @param to - * addresses to set or <code>null</code> or an empty collection - * to remove the header field. - */ - public MessageBuilder setTo(Collection<? extends Address> to) { - return setAddressList(FieldName.TO, to); + return this; } - /** - * Returns the value of the <i>Cc</i> header field of this message as - * <code>AddressList</code> object or <code>null</code> if it is not - * present. - * - * @return value of the cc field of this message. - */ public AddressList getCc() { - return getAddressList(FieldName.CC); + return builder.getCc(); } - /** - * Sets <i>Cc</i> header field of this message to the specified - * address. - * - * @param cc - * address to set or <code>null</code> to remove the header - * field. - */ - public MessageBuilder setCc(Address cc) { - return setAddressList(FieldName.CC, cc); - } - - /** - * Sets <i>Cc</i> header field of this message to the specified - * addresses. - * - * @param cc - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ public MessageBuilder setCc(Address... cc) { - return setAddressList(FieldName.CC, cc); + builder.setCc(cc); + + return this; } - /** - * Sets <i>Cc</i> header field of this message to the specified - * addresses. - * - * @param cc - * addresses to set or <code>null</code> or an empty collection - * to remove the header field. - */ public MessageBuilder setCc(Collection<? extends Address> cc) { - return setAddressList(FieldName.CC, cc); - } + builder.setCc(cc); - /** - * Returns the value of the <i>Bcc</i> header field of this message as - * <code>AddressList</code> object or <code>null</code> if it is not - * present. - * - * @return value of the bcc field of this message. - */ - public AddressList getBcc() { - return getAddressList(FieldName.BCC); + return this; } - /** - * Sets <i>Bcc</i> header field of this message to the specified - * address. - * - * @param bcc - * address to set or <code>null</code> to remove the header - * field. - */ - public MessageBuilder setBcc(Address bcc) { - return setAddressList(FieldName.BCC, bcc); - } + public MessageBuilder setCc(Address cc) { + builder.setCc(cc); - /** - * Sets <i>Bcc</i> header field of this message to the specified - * addresses. - * - * @param bcc - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ - public MessageBuilder setBcc(Address... bcc) { - return setAddressList(FieldName.BCC, bcc); + return this; } - /** - * Sets <i>Bcc</i> header field of this message to the specified - * addresses. - * - * @param bcc - * addresses to set or <code>null</code> or an empty collection - * to remove the header field. - */ - public MessageBuilder setBcc(Collection<? extends Address> bcc) { - return setAddressList(FieldName.BCC, bcc); + public AddressList getBcc() { + return builder.getBcc(); } - /** - * Returns the value of the <i>Reply-To</i> header field of this message as - * <code>AddressList</code> object or <code>null</code> if it is not - * present. - * - * @return value of the reply to field of this message. - */ - public AddressList getReplyTo() { - return getAddressList(FieldName.REPLY_TO); - } + public MessageBuilder setBcc(Address... bcc) { + builder.setBcc(bcc); - /** - * Sets <i>Reply-To</i> header field of this message to the specified - * address. - * - * @param replyTo - * address to set or <code>null</code> to remove the header - * field. - */ - public MessageBuilder setReplyTo(Address replyTo) { - return setAddressList(FieldName.REPLY_TO, replyTo); + return this; } - /** - * Sets <i>Reply-To</i> header field of this message to the specified - * addresses. - * - * @param replyTo - * addresses to set or <code>null</code> or no arguments to - * remove the header field. - */ - public MessageBuilder setReplyTo(Address... replyTo) { - return setAddressList(FieldName.REPLY_TO, replyTo); - } + public MessageBuilder setBcc(Collection<? extends Address> bcc) { + builder.setBcc(bcc); - /** - * Sets <i>Reply-To</i> header field of this message to the specified - * addresses. - * - * @param replyTo - * addresses to set or <code>null</code> or an empty collection - * to remove the header field. - */ - public MessageBuilder setReplyTo(Collection<? extends Address> replyTo) { - return setAddressList(FieldName.REPLY_TO, replyTo); + return this; } - private Mailbox getMailbox(String fieldName) { - MailboxField field = obtainField(fieldName); - return field != null ? field.getMailbox() : null; - } + public MessageBuilder setBcc(Address bcc) { + builder.setBcc(bcc); - private MessageBuilder setMailbox(String fieldName, Mailbox mailbox) { - if (mailbox == null) { - removeFields(fieldName); - } else { - setField(Fields.mailbox(fieldName, mailbox)); - } return this; } - private MessageBuilder setMailbox(String fieldName, String mailbox) throws ParseException { - if (mailbox == null) { - removeFields(fieldName); - } else { - setField(Fields.mailbox(fieldName, DefaultAddressParser.DEFAULT.parseMailbox(mailbox))); - } + public MessageBuilder copy(Message other) { + builder.copy(other); + return this; } - private MailboxList getMailboxList(String fieldName) { - MailboxListField field = obtainField(fieldName); - return field != null ? field.getMailboxList() : null; - } + public MessageBuilder parse(InputStream is) throws IOException { + builder.parse(is); - private MessageBuilder setMailboxList(String fieldName, Mailbox mailbox) { - return setMailboxList(fieldName, mailbox == null ? null : Collections.singleton(mailbox)); + return this; } - private MessageBuilder setMailboxList(String fieldName, String mailbox) throws ParseException { - return setMailboxList(fieldName, mailbox == null ? null : DefaultAddressParser.DEFAULT.parseMailbox(mailbox)); + public AddressList getReplyTo() { + return builder.getReplyTo(); } - private MessageBuilder setMailboxList(String fieldName, Mailbox... mailboxes) { - return setMailboxList(fieldName, mailboxes == null ? null : Arrays.asList(mailboxes)); - } + public MessageBuilder setReplyTo(Address... replyTo) { + builder.setReplyTo(replyTo); - private List<Mailbox> parseMailboxes(String... mailboxes) throws ParseException { - if (mailboxes == null || mailboxes.length == 0) { - return null; - } else { - List<Mailbox> list = new ArrayList<Mailbox>(); - for (String mailbox: mailboxes) { - list.add(DefaultAddressParser.DEFAULT.parseMailbox(mailbox)); - } - return list; - } + return this; } - private MessageBuilder setMailboxList(String fieldName, String... mailboxes) throws ParseException { - return setMailboxList(fieldName, parseMailboxes(mailboxes)); - } + public MessageBuilder setReplyTo(Collection<? extends Address> replyTo) { + builder.setReplyTo(replyTo); - private MessageBuilder setMailboxList(String fieldName, Collection<Mailbox> mailboxes) { - if (mailboxes == null || mailboxes.isEmpty()) { - removeFields(fieldName); - } else { - setField(Fields.mailboxList(fieldName, mailboxes)); - } return this; } - private AddressList getAddressList(String fieldName) { - AddressListField field = obtainField(fieldName); - return field != null? field.getAddressList() : null; - } + public MessageBuilder setReplyTo(Address replyTo) { + builder.setReplyTo(replyTo); - private MessageBuilder setAddressList(String fieldName, Address address) { - return setAddressList(fieldName, address == null ? null : Collections.singleton(address)); + return this; } - private MessageBuilder setAddressList(String fieldName, String address) throws ParseException { - return setAddressList(fieldName, address == null ? null : DefaultAddressParser.DEFAULT.parseMailbox(address)); - } + public MessageBuilder use(MimeConfig config) { + builder.use(config); - private MessageBuilder setAddressList(String fieldName, Address... addresses) { - return setAddressList(fieldName, addresses == null ? null : Arrays.asList(addresses)); + return this; } - private List<Address> parseAddresses(String... addresses) throws ParseException { - if (addresses == null || addresses.length == 0) { - return null; - } else { - List<Address> list = new ArrayList<Address>(); - for (String address: addresses) { - list.add(DefaultAddressParser.DEFAULT.parseAddress(address)); - } - return list; - } - } + public MessageBuilder use(DecodeMonitor monitor) { + builder.use(monitor); - private MessageBuilder setAddressList(String fieldName, String... addresses) throws ParseException { - return setAddressList(fieldName, parseAddresses(addresses)); + return this; } - private MessageBuilder setAddressList(String fieldName, Collection<? extends Address> addresses) { - if (addresses == null || addresses.isEmpty()) { - removeFields(fieldName); - } else { - setField(Fields.addressList(fieldName, addresses)); - } + public MessageBuilder use(BodyDescriptorBuilder bodyDescBuilder) { + builder.use(bodyDescBuilder); + return this; } - public MessageBuilder copy(Message other) { - if (other == null) { - return this; - } - clearFields(); - final Header otherHeader = other.getHeader(); - if (otherHeader != null) { - final List<Field> otherFields = otherHeader.getFields(); - for (Field field: otherFields) { - addField(field); - } - } - Body body = null; - Body otherBody = other.getBody(); - if (otherBody instanceof Message) { - body = MessageBuilder.createCopy((Message) otherBody).build(); - } else if (otherBody instanceof Multipart) { - body = MultipartBuilder.createCopy((Multipart) otherBody).build(); - } else if (otherBody instanceof SingleBody) { - body = ((SingleBody) otherBody).copy(); - } - setBody(body); + public MessageBuilder use(FieldParser<?> fieldParser) { + builder.use(fieldParser); + return this; } - public MessageBuilder parse(final InputStream is) throws IOException { - MimeConfig currentConfig = config != null ? config : MimeConfig.DEFAULT; - boolean strict = currentConfig.isStrictParsing(); - DecodeMonitor currentMonitor = monitor != null ? monitor : strict ? DecodeMonitor.STRICT : DecodeMonitor.SILENT; - BodyDescriptorBuilder currentBodyDescBuilder = bodyDescBuilder != null ? bodyDescBuilder : - new DefaultBodyDescriptorBuilder(null, fieldParser != null ? fieldParser : - strict ? DefaultFieldParser.getParser() : LenientFieldParser.getParser(), currentMonitor); - BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory : new BasicBodyFactory(!strict); - MimeStreamParser parser = new MimeStreamParser(currentConfig, currentMonitor, currentBodyDescBuilder); + public MessageBuilder use(BodyFactory bodyFactory) { + builder.use(bodyFactory); - Message message = new MessageImpl(); - parser.setContentHandler(new ParserStreamContentHandler(message, currentBodyFactory)); - parser.setContentDecoding(!rawContent); - if (flatMode) { - parser.setFlat(); - } - try { - parser.parse(is); - } catch (MimeException e) { - throw new MimeIOException(e); - } - clearFields(); - final List<Field> fields = message.getHeader().getFields(); - for (Field field: fields) { - addField(field); - } - setBody(message.getBody()); return this; } public Message build() { - MessageImpl message = new MessageImpl(); - HeaderImpl header = new HeaderImpl(); - message.setHeader(header); - if (!containsField(FieldName.MIME_VERSION)) { - header.setField(Fields.version("1.0")); + if (getDate() == null) { + setDate(new Date()); } - for (Field field : getFields()) { - header.addField(field); - } - if (ensureDateNotNull && !containsField(FieldName.DATE)) { - header.setField(Fields.date(new Date())); - } - - message.setBody(getBody()); - return message; + return builder.build(); } }
http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java ---------------------------------------------------------------------- diff --git a/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java b/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java deleted file mode 100644 index 5dc3ccd..0000000 --- a/dom/src/main/java/org/apache/james/mime4j/message/ParserStreamContentHandler.java +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mime4j.message; - -import org.apache.james.mime4j.MimeException; -import org.apache.james.mime4j.dom.Body; -import org.apache.james.mime4j.dom.Entity; -import org.apache.james.mime4j.dom.Header; -import org.apache.james.mime4j.dom.Message; -import org.apache.james.mime4j.dom.Multipart; -import org.apache.james.mime4j.parser.ContentHandler; -import org.apache.james.mime4j.stream.BodyDescriptor; -import org.apache.james.mime4j.stream.Field; -import org.apache.james.mime4j.util.ByteArrayBuffer; -import org.apache.james.mime4j.util.ByteSequence; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Stack; - -/** - * A <code>ContentHandler</code> for building an <code>Entity</code> to be - * used in conjunction with a {@link org.apache.james.mime4j.parser.MimeStreamParser}. - */ -class ParserStreamContentHandler implements ContentHandler { - - private final Entity entity; - private final MessageImplFactory messageImplFactory; - private final BodyFactory bodyFactory; - private final Stack<Object> stack; - - ParserStreamContentHandler( - final Entity entity, - final BodyFactory bodyFactory) { - this.entity = entity; - this.messageImplFactory = new DefaultMessageImplFactory(); - this.bodyFactory = bodyFactory; - this.stack = new Stack<Object>(); - } - - ParserStreamContentHandler( - final Entity entity, - final MessageImplFactory messageImplFactory, - final BodyFactory bodyFactory) { - this.entity = entity; - this.messageImplFactory = messageImplFactory; - this.bodyFactory = bodyFactory; - this.stack = new Stack<Object>(); - } - - private void expect(Class<?> c) { - if (!c.isInstance(stack.peek())) { - throw new IllegalStateException("Internal stack error: " - + "Expected '" + c.getName() + "' found '" - + stack.peek().getClass().getName() + "'"); - } - } - - public void startMessage() throws MimeException { - if (stack.isEmpty()) { - stack.push(this.entity); - } else { - expect(Entity.class); - Message m = messageImplFactory.messageImpl(); - ((Entity) stack.peek()).setBody(m); - stack.push(m); - } - } - - public void endMessage() throws MimeException { - expect(Message.class); - stack.pop(); - } - - public void startHeader() throws MimeException { - stack.push(new HeaderImpl()); - } - - public void field(Field field) throws MimeException { - expect(Header.class); - ((Header) stack.peek()).addField(field); - } - - public void endHeader() throws MimeException { - expect(Header.class); - Header h = (Header) stack.pop(); - expect(Entity.class); - ((Entity) stack.peek()).setHeader(h); - } - - public void startMultipart(final BodyDescriptor bd) throws MimeException { - expect(Entity.class); - - final Entity e = (Entity) stack.peek(); - final String subType = bd.getSubType(); - final Multipart multiPart = new MultipartImpl(subType); - e.setBody(multiPart); - stack.push(multiPart); - } - - public void body(BodyDescriptor bd, final InputStream is) throws MimeException, IOException { - expect(Entity.class); - - final Body body; - if (bd.getMimeType().startsWith("text/")) { - body = bodyFactory.textBody(is, bd.getCharset()); - } else { - body = bodyFactory.binaryBody(is); - } - - Entity entity = ((Entity) stack.peek()); - entity.setBody(body); - } - - public void endMultipart() throws MimeException { - stack.pop(); - } - - public void startBodyPart() throws MimeException { - expect(Multipart.class); - - BodyPart bodyPart = new BodyPart(); - ((Multipart) stack.peek()).addBodyPart(bodyPart); - stack.push(bodyPart); - } - - public void endBodyPart() throws MimeException { - expect(BodyPart.class); - stack.pop(); - } - - public void epilogue(InputStream is) throws MimeException, IOException { - expect(MultipartImpl.class); - ByteSequence bytes = loadStream(is); - ((MultipartImpl) stack.peek()).setEpilogueRaw(bytes); - } - - public void preamble(InputStream is) throws MimeException, IOException { - expect(MultipartImpl.class); - ByteSequence bytes = loadStream(is); - ((MultipartImpl) stack.peek()).setPreambleRaw(bytes); - } - - /** - * Unsupported. - * - * @param is the raw contents of the entity. - * @throws UnsupportedOperationException - */ - public void raw(InputStream is) throws MimeException, IOException { - throw new UnsupportedOperationException("Not supported"); - } - - private static ByteSequence loadStream(InputStream in) throws IOException { - ByteArrayBuffer bab = new ByteArrayBuffer(64); - - int b; - while ((b = in.read()) != -1) { - bab.append(b); - } - - return bab; - } - -} http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java ---------------------------------------------------------------------- diff --git a/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java b/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java new file mode 100644 index 0000000..ce4de42 --- /dev/null +++ b/dom/src/test/java/org/apache/james/mime4j/dom/MessageTest.java @@ -0,0 +1,435 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mime4j.dom; + +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.TimeZone; + +import org.apache.james.mime4j.Charsets; +import org.apache.james.mime4j.dom.address.AddressList; +import org.apache.james.mime4j.dom.address.Group; +import org.apache.james.mime4j.dom.address.Mailbox; +import org.apache.james.mime4j.dom.address.MailboxList; +import org.apache.james.mime4j.dom.field.ContentTypeField; +import org.apache.james.mime4j.dom.field.FieldName; +import org.apache.james.mime4j.field.DefaultFieldParser; +import org.apache.james.mime4j.field.Fields; +import org.apache.james.mime4j.field.address.DefaultAddressParser; +import org.apache.james.mime4j.message.BasicBodyFactory; +import org.apache.james.mime4j.message.BodyFactory; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +public class MessageTest { + + @Test + public void testSetCustomBody() throws Exception { + Message.Builder builder = Message.Builder.of(); + + BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory()); + builder.use(bodyFactory); + + builder.setBody("stuff", "stuff", Charsets.UTF_8); + + Assert.assertTrue(builder.getBody() instanceof TextBody); + ContentTypeField ct1 = builder.getField("Content-Type", ContentTypeField.class); + Assert.assertEquals("text/stuff", ct1.getMimeType()); + Assert.assertEquals("UTF-8", ct1.getCharset()); + + Mockito.verify(bodyFactory, Mockito.times(1)).textBody(Mockito.<InputStream>any(), Mockito.eq("UTF-8")); + + builder.setBody("stuff", "other-stuff", Charsets.US_ASCII); + + Assert.assertTrue(builder.getBody() instanceof TextBody); + ContentTypeField ct2 = builder.getField("Content-Type", ContentTypeField.class); + Assert.assertEquals("text/other-stuff", ct2.getMimeType()); + Assert.assertEquals("US-ASCII", ct2.getCharset()); + + Mockito.verify(bodyFactory, Mockito.times(1)).textBody(Mockito.<InputStream>any(), Mockito.eq("US-ASCII")); + + builder.setBody("stuff", null); + + Assert.assertTrue(builder.getBody() instanceof TextBody); + ContentTypeField ct3 = builder.getField("Content-Type", ContentTypeField.class); + Assert.assertEquals("text/plain", ct3.getMimeType()); + Assert.assertEquals(null, ct3.getCharset()); + + Mockito.verify(bodyFactory, Mockito.times(1)).textBody(Mockito.<InputStream>any(), Mockito.isNull(String.class)); + + builder.setBody(new byte[] {1,2,3}, null); + + Assert.assertTrue(builder.getBody() instanceof BinaryBody); + ContentTypeField ct4 = builder.getField("Content-Type", ContentTypeField.class); + Assert.assertEquals("application/octet-stream", ct4.getMimeType()); + Assert.assertEquals(null, ct4.getCharset()); + + Mockito.verify(bodyFactory, Mockito.times(1)).binaryBody(Mockito.<InputStream>any()); + } + + @Test + public void testSetMessageId() throws Exception { + Message.Builder builder = Message.Builder.of(); + + String id = "<msg17@localhost>"; + builder.setMessageId(id); + Assert.assertEquals(id, builder.getMessageId()); + } + + @Test + public void testCreateMessageId() throws Exception { + Message.Builder builder = Message.Builder.of(); + builder.generateMessageId("hostname"); + + String id = builder.getMessageId(); + Assert.assertNotNull(id); + Assert.assertTrue(id.startsWith("<Mime4j.")); + Assert.assertTrue(id.endsWith("@hostname>")); + } + + @Test + public void testGetSubject() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getSubject()); + + String subject = "testing 1 2"; + builder.setSubject(subject); + Assert.assertEquals(subject, builder.getSubject()); + + builder.setField(DefaultFieldParser.parse("Subject: =?windows-1252?Q?99_=80?=")); + Assert.assertEquals("99 \u20ac", builder.getSubject()); + } + + @Test + public void testSetSubject() throws Exception { + Message.Builder builder = Message.Builder.of(); + + builder.setSubject("Semmelbr\366sel"); + Assert.assertEquals("Semmelbr\366sel", builder.getSubject()); + Assert.assertEquals("=?ISO-8859-1?Q?Semmelbr=F6sel?=", builder.getField( + "Subject").getBody()); + + builder.setSubject(null); + Assert.assertNull(builder.getField("Subject")); + } + + @Test + public void testGetDate() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getDate()); + + builder.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 05:30:00 +0530")); + + Assert.assertEquals(new Date(0), builder.getDate()); + } + + @Test + public void testSetDate() throws Exception { + Message.Builder builder = Message.Builder.of(); + + builder.setDate(new Date(86400000), TimeZone.getTimeZone("GMT")); + Assert.assertEquals(new Date(86400000), builder.getDate()); + Assert.assertEquals("Fri, 2 Jan 1970 00:00:00 +0000", builder.getField( + "Date").getBody()); + + builder.setDate(null); + Assert.assertNull(builder.getField("Date")); + } + + @Test + public void testGetSender() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getSender()); + + builder.setField(DefaultFieldParser.parse("Sender: [email protected]")); + + Assert.assertEquals("[email protected]", builder.getSender().getAddress()); + } + + @Test + public void testSetSender() throws Exception { + Message.Builder builder = Message.Builder.of(); + + builder.setSender("[email protected]"); + Assert.assertEquals("[email protected]", builder.getField("Sender").getBody()); + + builder.setSender((String) null); + Assert.assertNull(builder.getField("Sender")); + } + + @Test + public void testGetFrom() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getFrom()); + + builder.setField(DefaultFieldParser.parse("From: [email protected]")); + + Assert.assertEquals("[email protected]", builder.getFrom().get(0).getAddress()); + } + + @Test + public void testSetFrom() throws Exception { + Message.Builder builder = Message.Builder.of(); + + Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + + builder.setFrom(mailbox1); + Assert.assertEquals("[email protected]", builder.getField("From") + .getBody()); + + builder.setFrom(mailbox1, mailbox2); + Assert.assertEquals("[email protected], [email protected]", + builder.getField("From").getBody()); + + builder.setFrom(Arrays.asList(mailbox1, mailbox2)); + Assert.assertEquals("[email protected], [email protected]", + builder.getField("From").getBody()); + + builder.setFrom((Mailbox) null); + Assert.assertNull(builder.getField("From")); + } + + @Test + public void testGetTo() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getTo()); + + builder.setField(DefaultFieldParser.parse("To: [email protected]")); + + Assert.assertEquals("[email protected]", ((Mailbox) builder.getTo().get(0)) + .getAddress()); + } + + @Test + public void testSetTo() throws Exception { + Message.Builder builder = Message.Builder.of(); + + Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Group group = new Group("Does", mailbox1, mailbox2); + Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <[email protected]>"); + + builder.setTo(group); + Assert.assertEquals("Does: [email protected], [email protected];", + builder.getField("To").getBody()); + + builder.setTo(group, mailbox3); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField("To") + .getBody()); + + builder.setTo(Arrays.asList(group, mailbox3)); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField("To") + .getBody()); + + builder.setTo((Mailbox) null); + Assert.assertNull(builder.getField("To")); + } + + @Test + public void testGetCc() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getCc()); + + builder.setField(DefaultFieldParser.parse("Cc: [email protected]")); + + Assert.assertEquals("[email protected]", ((Mailbox) builder.getCc().get(0)) + .getAddress()); + } + + @Test + public void testSetCc() throws Exception { + Message.Builder builder = Message.Builder.of(); + + Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Group group = new Group("Does", mailbox1, mailbox2); + Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <[email protected]>"); + + builder.setCc(group); + Assert.assertEquals("Does: [email protected], [email protected];", + builder.getField("Cc").getBody()); + + builder.setCc(group, mailbox3); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField("Cc") + .getBody()); + + builder.setCc(Arrays.asList(group, mailbox3)); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField("Cc") + .getBody()); + + builder.setCc((Mailbox) null); + Assert.assertNull(builder.getField("Cc")); + } + + @Test + public void testGetBcc() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getBcc()); + + builder.setField(DefaultFieldParser.parse("Bcc: [email protected]")); + + Assert.assertEquals("[email protected]", ((Mailbox) builder.getBcc().get(0)) + .getAddress()); + } + + @Test + public void testSetBcc() throws Exception { + Message.Builder builder = Message.Builder.of(); + + Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Group group = new Group("Does", mailbox1, mailbox2); + Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <[email protected]>"); + + builder.setBcc(group); + Assert.assertEquals("Does: [email protected], [email protected];", + builder.getField("Bcc").getBody()); + + builder.setBcc(group, mailbox3); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder + .getField("Bcc").getBody()); + + builder.setBcc(Arrays.asList(group, mailbox3)); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder + .getField("Bcc").getBody()); + + builder.setBcc((Mailbox) null); + Assert.assertNull(builder.getField("Bcc")); + } + + @Test + public void testGetReplyTo() throws Exception { + Message.Builder builder = Message.Builder.of(); + Assert.assertNull(builder.getReplyTo()); + + builder.setField(DefaultFieldParser.parse("Reply-To: [email protected]")); + + Assert.assertEquals("[email protected]", ((Mailbox) builder.getReplyTo().get(0)) + .getAddress()); + } + + @Test + public void testSetReplyTo() throws Exception { + Message.Builder builder = Message.Builder.of(); + + Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); + Group group = new Group("Does", mailbox1, mailbox2); + Mailbox mailbox3 = DefaultAddressParser.DEFAULT.parseMailbox("Mary Smith <[email protected]>"); + + builder.setReplyTo(group); + Assert.assertEquals("Does: [email protected], [email protected];", + builder.getField("Reply-To").getBody()); + + builder.setReplyTo(group, mailbox3); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField( + "Reply-To").getBody()); + + builder.setReplyTo(Arrays.asList(group, mailbox3)); + Assert.assertEquals("Does: [email protected], [email protected];, " + + "Mary Smith <[email protected]>", builder.getField( + "Reply-To").getBody()); + + builder.setReplyTo((Mailbox) null); + Assert.assertNull(builder.getField("Reply-To")); + } + + @Test + public void testBuildWithDefaults() throws Exception { + Message message = Message.Builder.of() + .generateMessageId("hostname") + .setSubject("testing ...") + .setFrom("batman@localhost", "superman@localhost") + .setTo("\"Big momma\" <big_momma@localhost>") + .setBody("Yo, big momma!", Charsets.UTF_8) + .build(); + + Assert.assertEquals("text/plain", message.getMimeType()); + Assert.assertNotNull(message.getMessageId()); + Assert.assertNull(message.getDate()); + Assert.assertEquals("1.0", message.getHeader().getField(FieldName.MIME_VERSION).getBody()); + Assert.assertEquals("testing ...", message.getSubject()); + Assert.assertEquals(new MailboxList( + new Mailbox("", "batman", "localhost"), + new Mailbox("", "superman", "localhost")), message.getFrom()); + Assert.assertEquals(new AddressList( + new Mailbox("Big momma", "big_momma", "localhost")), message.getTo()); + Assert.assertEquals("text/plain", message.getMimeType()); + Assert.assertEquals("UTF-8", message.getCharset()); + } + + @Test + public void testBuildWithNoDefaults() throws Exception { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + Date date = dateFormat.parse("2014-08-01 12:00"); + + Message message = Message.Builder.of() + .setMessageId("blah@hostname") + .setDate(date) + .addField(Fields.version("1.0.1")) + .setSubject("testing ...") + .setFrom("batman@localhost", "superman@localhost") + .setTo("\"Big momma\" <big_momma@localhost>") + .setBody("Yo, big momma!", Charsets.UTF_8) + .build(); + + Assert.assertEquals("text/plain", message.getMimeType()); + Assert.assertEquals("blah@hostname", message.getMessageId()); + Assert.assertEquals(date, message.getDate()); + Assert.assertEquals("1.0.1", message.getHeader().getField(FieldName.MIME_VERSION).getBody()); + Assert.assertEquals("testing ...", message.getSubject()); + Assert.assertEquals(new MailboxList( + new Mailbox("", "batman", "localhost"), + new Mailbox("", "superman", "localhost")), message.getFrom()); + Assert.assertEquals(new AddressList( + new Mailbox("Big momma", "big_momma", "localhost")), message.getTo()); + Assert.assertEquals("text/plain", message.getMimeType()); + Assert.assertEquals("UTF-8", message.getCharset()); + } + + @Test + public void testOfOnBuilder() throws Exception { + Message original = Message.Builder.of() + .generateMessageId("hostname") + .setSubject("testing ...") + .setFrom("batman@localhost", "superman@localhost") + .setTo("\"Big momma\" <big_momma@localhost>") + .setBody("Yo, big momma!", Charsets.UTF_8) + .build(); + + Message.Builder builder = Message.Builder.of(original); + Assert.assertEquals(original.getHeader().getFields(), builder.getFields()); + Assert.assertNotSame(original.getBody(), builder.getBody()); + Assert.assertSame(original.getBody().getClass(), builder.getBody().getClass()); + } + +} http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java ---------------------------------------------------------------------- diff --git a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java index 76cbcbe..e033d2b 100644 --- a/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java +++ b/dom/src/test/java/org/apache/james/mime4j/message/AbstractEntityBuilderTest.java @@ -33,6 +33,7 @@ import org.apache.james.mime4j.dom.field.ContentTransferEncodingField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.dom.field.ParsedField; import org.apache.james.mime4j.field.DefaultFieldParser; +import org.apache.james.mime4j.internal.AbstractEntityBuilder; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.NameValuePair; import org.junit.Assert; http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/5c583037/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java ---------------------------------------------------------------------- diff --git a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java index 1820a5f..d92ad36 100644 --- a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java +++ b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java @@ -19,7 +19,6 @@ package org.apache.james.mime4j.message; -import java.io.ByteArrayInputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Arrays; @@ -43,11 +42,12 @@ import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; +@SuppressWarnings("deprecation") public class MessageBuilderTest { @Test public void testSetCustomBody() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory()); builder.use(bodyFactory); @@ -91,7 +91,7 @@ public class MessageBuilderTest { @Test public void testSetMessageId() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); String id = "<msg17@localhost>"; builder.setMessageId(id); @@ -100,7 +100,7 @@ public class MessageBuilderTest { @Test public void testCreateMessageId() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); builder.generateMessageId("hostname"); String id = builder.getMessageId(); @@ -111,7 +111,7 @@ public class MessageBuilderTest { @Test public void testGetSubject() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getSubject()); String subject = "testing 1 2"; @@ -124,7 +124,7 @@ public class MessageBuilderTest { @Test public void testSetSubject() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); builder.setSubject("Semmelbr\366sel"); Assert.assertEquals("Semmelbr\366sel", builder.getSubject()); @@ -137,7 +137,7 @@ public class MessageBuilderTest { @Test public void testGetDate() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getDate()); builder.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 05:30:00 +0530")); @@ -147,7 +147,7 @@ public class MessageBuilderTest { @Test public void testSetDate() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); builder.setDate(new Date(86400000), TimeZone.getTimeZone("GMT")); Assert.assertEquals(new Date(86400000), builder.getDate()); @@ -160,7 +160,7 @@ public class MessageBuilderTest { @Test public void testGetSender() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getSender()); builder.setField(DefaultFieldParser.parse("Sender: [email protected]")); @@ -170,7 +170,7 @@ public class MessageBuilderTest { @Test public void testSetSender() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); builder.setSender("[email protected]"); Assert.assertEquals("[email protected]", builder.getField("Sender").getBody()); @@ -181,7 +181,7 @@ public class MessageBuilderTest { @Test public void testGetFrom() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getFrom()); builder.setField(DefaultFieldParser.parse("From: [email protected]")); @@ -191,7 +191,7 @@ public class MessageBuilderTest { @Test public void testSetFrom() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); @@ -214,7 +214,7 @@ public class MessageBuilderTest { @Test public void testGetTo() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getTo()); builder.setField(DefaultFieldParser.parse("To: [email protected]")); @@ -225,7 +225,7 @@ public class MessageBuilderTest { @Test public void testSetTo() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); @@ -252,7 +252,7 @@ public class MessageBuilderTest { @Test public void testGetCc() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getCc()); builder.setField(DefaultFieldParser.parse("Cc: [email protected]")); @@ -263,7 +263,7 @@ public class MessageBuilderTest { @Test public void testSetCc() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); @@ -290,7 +290,7 @@ public class MessageBuilderTest { @Test public void testGetBcc() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getBcc()); builder.setField(DefaultFieldParser.parse("Bcc: [email protected]")); @@ -301,7 +301,7 @@ public class MessageBuilderTest { @Test public void testSetBcc() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); @@ -328,7 +328,7 @@ public class MessageBuilderTest { @Test public void testGetReplyTo() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Assert.assertNull(builder.getReplyTo()); builder.setField(DefaultFieldParser.parse("Reply-To: [email protected]")); @@ -339,7 +339,7 @@ public class MessageBuilderTest { @Test public void testSetReplyTo() throws Exception { - MessageBuilder builder = MessageBuilder.of(); + MessageBuilder builder = MessageBuilder.create(); Mailbox mailbox1 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); Mailbox mailbox2 = DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"); @@ -366,7 +366,7 @@ public class MessageBuilderTest { @Test public void testBuildWithDefaults() throws Exception { - Message message = MessageBuilder.of() + Message message = MessageBuilder.create() .generateMessageId("hostname") .setSubject("testing ...") .setFrom("batman@localhost", "superman@localhost") @@ -376,7 +376,7 @@ public class MessageBuilderTest { Assert.assertEquals("text/plain", message.getMimeType()); Assert.assertNotNull(message.getMessageId()); - Assert.assertNull(message.getDate()); + Assert.assertNotNull(message.getDate()); Assert.assertEquals("1.0", message.getHeader().getField(FieldName.MIME_VERSION).getBody()); Assert.assertEquals("testing ...", message.getSubject()); Assert.assertEquals(new MailboxList( @@ -388,116 +388,13 @@ public class MessageBuilderTest { Assert.assertEquals("UTF-8", message.getCharset()); } - /** - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Test - public void testThatDeprecatedCreateNeverReturnNullDate() throws Exception { - @SuppressWarnings("deprecation") MessageBuilder builder = MessageBuilder.create(); - - Message message = builder.generateMessageId("hostname") - .setSubject("testing ...") - .setFrom("batman@localhost", "superman@localhost") - .setTo("\"Big momma\" <big_momma@localhost>") - .setBody("Yo, big momma!", Charsets.UTF_8) - .build(); - - Assert.assertNotNull(message.getDate()); - } - - /** - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Test - public void testThatDeprecatedConstructorNeverReturnNullDate() throws Exception { - @SuppressWarnings("deprecation") MessageBuilder builder = new MessageBuilder(); - - Message message = builder.generateMessageId("hostname") - .setSubject("testing ...") - .setFrom("batman@localhost", "superman@localhost") - .setTo("\"Big momma\" <big_momma@localhost>") - .setBody("Yo, big momma!", Charsets.UTF_8) - .build(); - - Assert.assertNotNull(message.getDate()); - } - - /** - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Test - public void testThatDeprecatedCreateCopyNeverReturnNullDate() throws Exception { - Message messageWithoutDate = MessageBuilder.of().generateMessageId("hostname") - .setSubject("testing ...") - .setFrom("batman@localhost", "superman@localhost") - .setTo("\"Big momma\" <big_momma@localhost>") - .setBody("Yo, big momma!", Charsets.UTF_8) - .build(); - - @SuppressWarnings("deprecation") MessageBuilder builder = MessageBuilder.createCopy(messageWithoutDate); - - Message testee = builder.build(); - - Assert.assertNotNull(testee.getDate()); - } - - - @Test - public void testThatOfMesageReturnNullDateWhenNoDateHeader() throws Exception { - Message messageWithoutDate = MessageBuilder.of().generateMessageId("hostname") - .setSubject("testing ...") - .setFrom("batman@localhost", "superman@localhost") - .setTo("\"Big momma\" <big_momma@localhost>") - .setBody("Yo, big momma!", Charsets.UTF_8) - .build(); - - MessageBuilder builder = MessageBuilder.of(messageWithoutDate); - - Message testee = builder.build(); - - Assert.assertNull(testee.getDate()); - } - - /** - * See <a href="https://issues.apache.org/jira/browse/MIME4J-262">MIME4J-262</a> - */ - @Test - public void testThatDeprecatedReadNeverReturnNullDate() throws Exception { - String messageSource = "To: me ME <[email protected]>\n" + - "From: you YOU <[email protected]>\n" + - "Subject: message\n" + - "MIME-Version: 1.0\n" + - "\n" + - "This is a message"; - - @SuppressWarnings("deprecation") MessageBuilder builder = MessageBuilder.read(new ByteArrayInputStream(messageSource.getBytes())); - Message testee = builder.build(); - - Assert.assertNotNull(testee.getDate()); - } - - @Test - public void testThatOfInputStreamReturnNullDateWhenNoDateHeader() throws Exception { - String messageSource = "To: me ME <[email protected]>\n" + - "From: you YOU <[email protected]>\n" + - "Subject: message\n" + - "MIME-Version: 1.0\n" + - "\n" + - "This is a message"; - - @SuppressWarnings("deprecation") MessageBuilder builder = MessageBuilder.of(new ByteArrayInputStream(messageSource.getBytes())); - Message testee = builder.build(); - - Assert.assertNull(testee.getDate()); - } - @Test public void testBuildWithNoDefaults() throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); Date date = dateFormat.parse("2014-08-01 12:00"); - Message message = MessageBuilder.of() + Message message = MessageBuilder.create() .setMessageId("blah@hostname") .setDate(date) .addField(Fields.version("1.0.1")) @@ -522,8 +419,8 @@ public class MessageBuilderTest { } @Test - public void testOfWithAMessage() throws Exception { - Message original = MessageBuilder.of() + public void testCopy() throws Exception { + Message original = MessageBuilder.create() .generateMessageId("hostname") .setSubject("testing ...") .setFrom("batman@localhost", "superman@localhost") @@ -531,7 +428,7 @@ public class MessageBuilderTest { .setBody("Yo, big momma!", Charsets.UTF_8) .build(); - MessageBuilder builder = MessageBuilder.of(original); + MessageBuilder builder = MessageBuilder.createCopy(original); Assert.assertEquals(original.getHeader().getFields(), builder.getFields()); Assert.assertNotSame(original.getBody(), builder.getBody()); Assert.assertSame(original.getBody().getClass(), builder.getBody().getClass()); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
