package org.jboss.seam.mail.ui;
import java.io.IOException;
import java.util.List;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import org.jboss.seam.mail.ui.context.MailResponseWriter;
/**
* JSF component for rendering the body Supports plain text, html bodies and
* setting an alternative (text) part using an alternative facet
*
*/
public class UIBody extends MailComponent
{
public static final String HTML = "html";
public static final String PLAIN = "plain";
private String type = HTML;
@Override
public void encodeChildren(FacesContext facesContext) throws IOException
{
try
{
BodyPart bodyPart = new MimeBodyPart();
MimeMultipart bodyMultipart;
if (containsInlineAttachment(findMessage().getAttachments()))
{
bodyMultipart = new MimeMultipart("related");
}
else
{
bodyMultipart = null;
}
if (PLAIN.equalsIgnoreCase(getType()))
{
String body = encode(facesContext, MailResponseWriter.TEXT_PLAIN_CONTENT_TYPE);
bodyPart = getTextBody(facesContext, body);
}
else if (HTML.equals(getType()))
{
UIComponent alternative = getFacet("alternative");
String body = encode(facesContext, MailResponseWriter.HTML_PLAIN_CONTENT_TYPE);
if (alternative != null)
{
MimeMultipart multipartAlt = new MimeMultipart("alternative");
multipartAlt.addBodyPart(getTextBody(facesContext, encode(facesContext,
alternative, MailResponseWriter.TEXT_PLAIN_CONTENT_TYPE)));
multipartAlt.addBodyPart(getHtmlBody(facesContext, body));
bodyPart = new MimeBodyPart();
bodyPart.setContent(multipartAlt);
}
else
{
bodyPart = getHtmlBody(facesContext, body);
}
}
if (findMessage().getAttachments().size() > 0)
{
for (MimeBodyPart attachment : findMessage().getAttachments())
{
if (attachment.getDisposition().equalsIgnoreCase("inline"))
{
bodyMultipart.addBodyPart(attachment);
}
else
{
getRootMultipart().addBodyPart(attachment);
}
}
}
if (bodyMultipart != null)
{
bodyMultipart.addBodyPart(bodyPart, 0);
BodyPart bodyPartContent = new MimeBodyPart();
bodyPartContent.setContent(bodyMultipart);
getRootMultipart().addBodyPart(bodyPartContent, 0);
}
else
{
getRootMultipart().addBodyPart(bodyPart, 0);
}
}
catch (MessagingException e)
{
throw new FacesException(e.getMessage(), e);
}
}
public void setType(String type)
{
this.type = type;
}
/**
* The type of the body - plain or html
*/
public String getType()
{
if (type == null)
{
return getString("type");
}
return type;
}
private BodyPart getTextBody(FacesContext facesContext, String body) throws MessagingException
{
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDisposition(new Header("inline").getSanitizedValue());
String charset = findMessage().getCharset();
if (charset != null)
{
// bodyPart.setContent(body, "text/plain; charset="
// + charset + "; format=flowed");
bodyPart.setText(body, new Header(charset).getSanitizedValue());
}
else
{
bodyPart.setText(body);
}
return bodyPart;
}
private BodyPart getHtmlBody(FacesContext facesContext, Object body) throws MessagingException
{
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDisposition(new Header("inline").getSanitizedValue());
String charset = findMessage().getCharset();
if (charset != null)
{
bodyPart.setContent(body, new Header("text/html; charset=" + charset).getSanitizedValue());
}
else
{
bodyPart.setContent(body, new Header("text/html").getSanitizedValue());
}
return bodyPart;
}
private static boolean containsInlineAttachment(List<MimeBodyPart> attachments) throws MessagingException
{
for (MimeBodyPart attachment : attachments)
{
if (attachment.getDisposition().equalsIgnoreCase("inline"))
{
return true;
}
}
return false;
}
}