package org.jboss.seam.mail.ui;
import java.io.IOException;
import java.io.StringWriter;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.jboss.seam.mail.ui.context.MailResponseWriter;
import org.jboss.seam.ui.util.JSF;
/**
* Abstract base class for mail ui components
*
*/
public abstract class MailComponent extends UIComponentBase
{
// Cache Message
private UIMessage message;
private static final String FAMILY = "org.jboss.seam.mail";
@Override
public String getFamily()
{
return FAMILY;
}
@Override
public boolean getRendersChildren()
{
return true;
}
protected String encode(FacesContext facesContext) throws IOException
{
return encode(facesContext, this, null, false);
}
/**
* Deprecated, use {@link MailComponent#encode(FacesContext, UIComponent, String)}
*/
@Deprecated
protected String encode(FacesContext facesContext, UIComponent cmp) throws IOException
{
return encode(facesContext, cmp, null, true);
}
protected String encode(FacesContext facesContext, String contentType) throws IOException
{
return encode(facesContext, this, contentType, false);
}
protected String encode(FacesContext facesContext, UIComponent cmp, String contentType) throws IOException
{
return encode(facesContext, cmp, contentType, true);
}
/**
* Encode the children of cmp, writing to a string (rather than the http
* response object) and return the string
*/
protected String encode(FacesContext facesContext, UIComponent cmp, String contentType, boolean root)
throws IOException
{
ResponseWriter response = facesContext.getResponseWriter();
StringWriter stringWriter = new StringWriter();
ResponseWriter cachingResponseWriter = ((MailResponseWriter) response).cloneWithWriter(
stringWriter, contentType);
facesContext.setResponseWriter(cachingResponseWriter);
if (root)
{
JSF.renderChild(facesContext, cmp);
}
else
{
JSF.renderChildren(facesContext, cmp);
}
facesContext.setResponseWriter(response);
String output = stringWriter.getBuffer().toString();
return output;
}
/**
* look up the tree for mail message
*
* @throws MessagingException
*/
public MimeMessage findMimeMessage() throws MessagingException
{
return findMessage().getMimeMessage();
}
/**
* look up the tree for UIMessage
*/
public UIMessage findMessage()
{
if (message == null)
{
message = (UIMessage) findParent(this, UIMessage.class);
if (message == null)
{
throw new UnsupportedOperationException("Must have a m:message tag in the tree");
}
}
return message;
}
public MimeMultipart getRootMultipart() throws IOException, MessagingException
{
return (MimeMultipart) findMimeMessage().getContent();
}
/**
* Deprecated, use {@link MailComponent#findParent(UIComponent, Class)}
*/
@Deprecated
public MailComponent findParent(UIComponent parent)
{
return findParent(parent, null);
}
/**
* find the first parent that is a mail component of a given type
*/
public MailComponent findParent(UIComponent parent, Class<?> c)
{
if (parent == null)
{
return null;
}
if (parent instanceof MailComponent)
{
if (c == null || c.isAssignableFrom(parent.getClass()))
{
return (MailComponent) parent;
}
}
return findParent(parent.getParent(), c);
}
/**
* Get a valuebinding as a string
*/
protected String getString(String localName)
{
if (getValue(localName) != null)
{
return getValue(localName).toString();
}
else
{
return null;
}
}
/**
* Get a vauebinding
*/
protected Object getValue(String localName)
{
if (getValueExpression(localName) == null)
{
return null;
}
else
{
return getValueExpression(localName).getValue(getFacesContext().getELContext());
}
}
/**
* Get a valuebinding as a Boolean
*/
protected Boolean getBoolean(String localName)
{
Object o = getValue(localName);
if (o != null)
{
if (o instanceof Boolean)
{
return (Boolean) o;
}
else
{
return Boolean.valueOf(o.toString());
}
}
else
{
return null;
}
}
}