terça-feira, 29 de janeiro de 2008

Java - Gerando RSS com ROME

ROME RSS and Atom Utilities é um framework java que serve para gerar arquivos RSS de forma fácil e rápida. Sua utilização basicamente consiste na criação de um objeto Feed e uma lista de Entries a qual será atribuida ao Feed.

A seguir há um exemplo de um Servlet que processa uma lista de Notícias gravada em um banco de dados e gera o RSS utilizando PrintWriter.


//imports...

public class FeedWriter extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/xml");
OutputStream os = response.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os , "UTF-8");
PrintWriter pw = new PrintWriter(osw);
create("rss_2.0", pw);
writer.close();
}

protected void create(String feedType, Writer writer) {
try {
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType(feedType);

feed.setTitle("Noticias)");
feed.setLink("http://rome.dev.java.net");
feed.setDescription("BLA BLA BLA");

List entries = new ArrayList();
SyndEntry entry;
SyndContent description;

Dao dao = new Dao();
for (Noticia noticia : dao.findAllNoticias()) {
entry = new SyndEntryImpl();
entry.setTitle(noticia.getTitulo());
entry.setLink(noticia.getLink());
entry.setPublishedDate(noticia.getDataPost());
description = new SyndContentImpl();
description.setType("text/plain");
description.setValue(noticia.getDescricao());
entry.setDescription(description);
entries.add(entry);
}

feed.setEntries(entries);

SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,writer);
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
}


O retorno será algo semelhante a:


Para saber mais sobre o ROME, acesse http://wiki.java.net/bin/view/Javawsxml/Rome

5 comentários:

Henrique disse...

Parece ser muito interessante. Estava procurando justamente uma forma rápida de criar RSS.

Fernando Pinheiro disse...

Olá Bruno,

A dica foi boa e em ótima hora para mim.
A implementação foi fácil, contudo estou tendo problemas com os encodings.

O título das entradas estão ficando, por exemplo: "Charlie Kaufman estr�ia na dire��o e concorre � Palma de Ouro"

Claro que nos locais das ? são caracteres do nosso português. Estes dados estão OK no banco e ao definir no objeto ficam ok, apenas quando salvo o XML fico com problemas.

Já setei o entry.setEncoding("") para UTF-8, ISO-8859-1, UNICODE... mas sem sucesso.

Tens alguma experiência com este problema?

Fernando Pinheiro disse...

É incrível como, após procurar desde de manhã, após postar a dúvida consigo a solução.

Fica para registro, como resolvi. Na hora de salvar (já que estou salvando em arquivo), mudei para:

FileOutputStream fileOutputStream = new FileOutputStream(new File(_caminhoXml));
OutputStreamWriter osw = new OutputStreamWriter(fileOutputStream, rbRSS.getString("Rss.Noticia.Geral.Encoding"));
output.output(feed, osw);
osw.close();

Abs

Bruno Rossetto Machado disse...

Boa Fernando, valeu pelos Posts. :)
Que bom que pude ajudar de alguma forma.
forte abraço

Henrique disse...

Desculpa a ignorancia, eu criai uma Servlet, coloquei o código postado, adicionei as libs necessárias porém nao sei como faco pra colocar esta Servelt para rodar e gerar o arquivo xml, e nem sei como mape-la no web.xml, se alguém poder me ajudar agradeceria henrique@newt.com.br