/*******************************************************************************
* Copyright (c) 2011 - 2012 Siamak Haschemi & Benjamin Haupt
* 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
*******************************************************************************/
package de.bht.fpa.mail.s000000.common.mail.model.builder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import de.bht.fpa.mail.s000000.common.mail.model.Attachment;
import de.bht.fpa.mail.s000000.common.mail.model.Importance;
import de.bht.fpa.mail.s000000.common.mail.model.Message;
import de.bht.fpa.mail.s000000.common.mail.model.Recipient;
//@formatter:off
/**
* This class implements the builder design pattern and provides a fluent API.
* You can create Messages like this:
*
* <pre>
* Message message = MessageBuilder.newMessageBuilder()
* .text("my email")
* .sender(SenderBuilder.newSenderBuilder()
* .email("he@you.de")
* .build()
* )
* .sent(new Date())
* .build();
* </pre>
*
* @author Siamak Haschemi
*
*/
//@formatter:on
public final class MessageBuilder {
private long id;
private SenderBuilder senderBuilder;
private String text;
private String subject;
private Importance importance;
private Date received;
private Date sent;
private final List<RecipientBuilder> recipientBuilders = new LinkedList<RecipientBuilder>();
private final List<AttachmentBuilder> attachmentBuilders = new LinkedList<AttachmentBuilder>();
private boolean read;
private MessageBuilder() {
}
public static MessageBuilder newMessageBuilder() {
return new MessageBuilder();
}
public Message build() {
Message message = new Message();
message.setId(id);
if (senderBuilder != null) {
message.setSender(senderBuilder.build());
}
message.setText(text);
message.setSubject(subject);
message.setImportance(importance);
message.setReceived(received);
message.setSent(sent);
List<Recipient> recipients = new ArrayList<Recipient>(recipientBuilders.size());
for (RecipientBuilder recipientBuilder : recipientBuilders) {
recipients.add(recipientBuilder.build());
}
message.setRecipients(recipients);
List<Attachment> attachments = new ArrayList<Attachment>(attachmentBuilders.size());
for (AttachmentBuilder attachmentBuilder : attachmentBuilders) {
attachments.add(attachmentBuilder.build());
}
message.setAttachment(attachments);
message.setRead(read);
return message;
}
public MessageBuilder but() {
// @formatter:off
return newMessageBuilder()
.id(id)
.sender(senderBuilder)
.text(text)
.subject(subject)
.importance(importance)
.received(received)
.sent(sent)
.recipients(recipientBuilders)
.attachments(attachmentBuilders)
.read(read);
// @formatter:on
}
public MessageBuilder id(long id) {
this.id = id;
return this;
}
public MessageBuilder sender(SenderBuilder senderBuilder) {
this.senderBuilder = senderBuilder;
return this;
}
public MessageBuilder text(String text) {
this.text = text;
return this;
}
public MessageBuilder subject(String subject) {
this.subject = subject;
return this;
}
public MessageBuilder importance(Importance importance) {
this.importance = importance;
return this;
}
public MessageBuilder received(Date received) {
this.received = received;
return this;
}
public MessageBuilder sent(Date sent) {
this.sent = sent;
return this;
}
public MessageBuilder recipient(RecipientBuilder recipientBuilder) {
this.recipientBuilders.add(recipientBuilder);
return this;
}
public MessageBuilder recipients(Collection<RecipientBuilder> recipientBuilders) {
this.recipientBuilders.addAll(recipientBuilders);
return this;
}
public MessageBuilder attachment(AttachmentBuilder attachmentBuilder) {
this.attachmentBuilders.add(attachmentBuilder);
return this;
}
public MessageBuilder attachments(Collection<AttachmentBuilder> attachmentBuilders) {
this.attachmentBuilders.addAll(attachmentBuilders);
return this;
}
public MessageBuilder read(boolean read) {
this.read = read;
return this;
}
}