package org.jboss.seam.rss.ui;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.contexts.Contexts;
import yarfraw.core.datamodel.ChannelFeed;
import yarfraw.core.datamodel.FeedFormat;
import yarfraw.core.datamodel.YarfrawException;
import yarfraw.io.FeedWriter;
/*
* atomFeed =
element atom:feed {
atomCommonAttributes,
(atomAuthor*
& atomCategory*
& atomContributor*
& atomGenerator?
& atomIcon?
& atomId
& atomLink*
& atomLogo?
& atomRights?
& atomSubtitle?
& atomTitle
& atomUpdated
& extensionElement*),
atomEntry*
}
*/
public class UIFeed extends SyndicationComponent
{
private static final String COMPONENT_TYPE = "org.jboss.seam.rss.ui.UIFeed";
private static final String EXTENSION = "xml";
private static final String MIMETYPE = "text/xml";
private boolean sendRedirect = true;
private String uid;
private String title;
private String subtitle;
private Date updated;
private String link;
private FeedFormat feedFormat = FeedFormat.ATOM10;
@SuppressWarnings("unchecked")
@Override
public void encodeBegin(FacesContext facesContext) throws IOException
{
ChannelFeed channelFeed = new ChannelFeed();
channelFeed.setUid(getUid());
channelFeed.setTitle(getTitle());
channelFeed.setDescriptionOrSubtitle(getSubtitle());
if (getUpdated() != null)
{
channelFeed.setPubDate(getUpdated(), new SimpleDateFormat(ATOM_DATE_FORMAT));
}
channelFeed.addLink(getLink());
Contexts.getEventContext().set(FEED_IMPL_KEY, channelFeed);
}
@Override
public void encodeEnd(FacesContext facesContext) throws IOException
{
ChannelFeed channelFeed = (ChannelFeed) Contexts.getEventContext().get(FEED_IMPL_KEY);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try
{
FeedWriter.writeChannel(feedFormat, channelFeed, byteStream);
}
catch (YarfrawException e)
{
/**
* Was IOException, but 1.5 does not have this constructor
* http://java.sun.com/j2se/1.5.0/docs/api/java/io/IOException.html
*/
throw new RuntimeException("Could not create feed", e);
}
Writer responseWriter = ((HttpServletResponse) facesContext.getExternalContext().getResponse()).getWriter();
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.setContentType(MIMETYPE);
response.setContentLength(byteStream.size());
responseWriter.write(byteStream.toString());
response.flushBuffer();
facesContext.responseComplete();
}
public boolean isSendRedirect()
{
return sendRedirect;
}
public void setSendRedirect(boolean sendRedirect)
{
this.sendRedirect = sendRedirect;
}
@Override
public String getFamily()
{
return COMPONENT_TYPE;
}
public String getTitle()
{
return (String) valueOf("title", title);
}
public void setTitle(String title)
{
this.title = title;
}
public String getSubtitle()
{
return (String) valueOf("subtitle", subtitle);
}
public void setSubtitle(String subtitle)
{
this.subtitle = subtitle;
}
public Date getUpdated()
{
return (Date) valueOf("updated", updated);
}
public void setUpdated(Date updated)
{
this.updated = updated;
}
public String getLink()
{
return (String) valueOf("link", link);
}
public void setLink(String link)
{
this.link = link;
}
public FeedFormat getFeedFormat()
{
return (FeedFormat) valueOf("feedFormat", feedFormat);
}
public void setFeedFormat(FeedFormat feedFormat)
{
this.feedFormat = feedFormat;
}
public String getUid()
{
return (String) valueOf("uid", uid);
}
public void setUid(String uid)
{
this.uid = uid;
}
}