Acesso Negado ao Criar um Arquivo no Tomcat

Bom dia, pessoal!

Fiz uma app web, onde há um cadastro de notícias. Essas notícias devem ser disponibilizadas por RSS. Até aí, tudo tranquilo (ah, a propósito, usei o Mentawai pra construir a aplicação). Criei algumas classes pra gerar o XML no formato do RSS, testei se o formato está correto e funcionou. O problema está sendo na hora de disponibilizar o arquivo em uma URL para que um leitor de RSS possa acessá-lo. A ideia é que fique algo como http://odominio.algumacoisa/Sistema/feed.xml. Tentei duas formas de gravar: uma, colocando somente o nome do arquivo (caminho relativo) na hora de salvar, o que ocasiona um erro de permissão negada no Tomcat. Eu tentei também pegar o contexto pra salvar o arquivo, mas se eu faço isso, o arquivo é salvo na pasta do projeto (C:\Users\MeuUsuario\Documents…). Dei uma pesquisada geral, e tentei configurar permissões de escrita do Tomcat, no arquivo catalina.policy, mas não obtive sucesso.

Alguém tem alguma sugestão?

Olá,

bem, eu não acho que escrever um arquivo no servidor e disponibilizá-lo para download seja uma boa abordagem. Porque não cria o objeto que representa seu XML RSS e o disponibiliza para download no momento da requisição? Lembra que download de arquivos em sistemas WEB não são feitos necessariamente a partir de arquivos obtidos do disco.
Não sei como o Mentawai faz isso, mas deve haver alguma maneira de alterar o content-type da resposta e forçar o download de um inputStream ou array de bytes.

Espero ter ajudado.

Amigo, provavelmente o windows está bloqueando a tentativa de salvar o arquivo na partição c:
Se você tiver outra partição em seu disco tente salvar nessa partição.

Caso não tenha outra partição tente salvar um pen-drive, sei la =) Tive problema uma vez com upload de arquivos, devido a permissão de escrita na partição c:

A ideia de colocar uma URL com o arquivo foi por ver todos os outros locais que disponibilizam feeds RSS fazem assim. Mas vou tentar então criar uma action que retorne um arquivo XML (já tenho algumas que retornam arquivos PDF, então não deve ser muito difícil). Assim que obtiver uma resposta, publico aqui.

Bem, não é o fato de acessar um RSS via URL que significa que há um arquivo XML lido diretamente e enviado ao cliente.
Inclusive acho que menos de 0,001% dos provedores de RSS façam isso. Acredito que quase todos fazem como fazemos com páginas HTML dinâmicas (seja geradas com JSP, ASP, PHP ou outra tecnologia servidora).
Inclusive você pode configurar um JSP para gerar uma resposta RSS tranquilamente, bastando configurar a diretiva de página para resposta de um dos tipos de RSS.

A sim, e essa abordagem ainda pode causar-lhe alguns problemas. Imagine se essas notícias sejam constantemente atualizadas, pode haver problemas de IO em caso de muitas escritas/leituras desse arquivo.
Fazendo como te recomendei, você faz como já fazemos na geração de HTML. Você não fica criando/atualizando um arquivo HTML no servidor para fazer o cliente fazer download dele, não é?
Bem, espero que tenha sido claro na minha explicação :wink:

Olha eu ressuscitando o tópico… Mas enfim…

Fiquei um tempo tentando formas de modificar as permissões de escrita no Tomcat, todas sem êxito. Por fim, resolvi tentar fazer como uma action retornando o arquivo do RSS. Estava montando o XML na mão, com as próprias classes nativas do Java mesmo, mas resolvi não reinventar a roda e estou usando a Rome pra fazer o trabalho. O arquivo está sendo gerado corretamente, porém o navegador reconhece ele como um XML comum, e não como um feed RSS. Só pra fins de ilustração, estes são trechos do código:

a minha Action:

[code]// Tirei os imports pra enxugar o código…

public class HelloMentawai extends BaseAction {

@Override
public String execute() throws Exception {       

    SyndFeed feed = new SyndFeedImpl();
    feed.setFeedType("rss_2.0");
    feed.setTitle("Exemplo Feed");
    feed.setLink("http://rafaeltoledo.net");
    feed.setDescription("Feed de teste");

    SyndEntry entry = new SyndEntryImpl();
    entry.setTitle("Título Teste");
    entry.setLink("http://rafaeltoledo.net/item-inexistente");
    entry.setPublishedDate(new Date());

    SyndContent description = new SyndContentImpl();
    description.setType("text/html");
    description.setValue("Conteúdo qualquer...");
    entry.setDescription(description);

    List<SyndEntry> entries = new ArrayList<SyndEntry>();
    entries.add(entry);

    feed.setEntries(entries);

    SyndFeedOutput out = new SyndFeedOutput();
    String xml = out.outputString(feed);
    byte[] saida = xml.getBytes();
    output.setValue("stream", saida);
    
    return "RSS";
}

}[/code]

e no ApplicationManager:

[code]…

public class ApplicationManager extends org.mentawai.core.ApplicationManager {

@Override
public void loadActions() {
    ActionConfig ac = new ActionConfig("HelloWorld", HelloMentawai.class);
    ac.addConsequence("RSS", new StreamConsequence("text/xml"));
    addActionConfig(ac);
}

}[/code]

No caso, tentei modificar o parâmetro do StreamConsequence… como disse, “text/xml” ele simplesmente exibe o conteúdo do XML no browser. Tentei colocar “application/rss+xml” mas aí o navegador faz o download do arquivo… alguma sugestão?

accredito que voce precisa de um rss reader para exibirr, o arquivo rss e um xml e o navegador vai exibir como xml ou fazer download no caso de application/rss+xml

Então… o que acontece é que antes eu estava gerando o XML e colocando-o estaticamente no Tomcat. Aí, quando eu acessava o arquivo, o navegador reconhecia-o automaticamente como um feed RSS. Agora ele reconhece como um XML genérico ou tenta fazer o download do arquivo…

Gerei exatamente o mesmo arquivo que estava funcionando quando eu jogava estaticamente no servidor, e não funcionou com a Action retornando-o. Ele reconhece como um arquivo XML genérico. Tentei gerar o RSS na mão, tentei gerar usando Rome, tentei gerar usando o Apache Commons Digester, mas em nenhum dos casos, o navegador entendeu o arquivo como RSS… Alguma outra ideia?