Olá a todos :) !
Estou desenvolvendo um sistema de publicações oficiais com o Vraptor, na minha aplicação tem o passo principal do sistema que é a publicação do documento onde realizo várias etapas: salvo a data da publicação, geração de um arquivo pdf e por fim assino digitalmente o pdf gerado. Atualmente meu código está concentrado no controlador e no service:
@Get("/publicacao/{id}/gerar")
public void gerarDiario(Integer id) throws Exception{
//faz um monte de coisa antes..
//salva a data da publicação no banco e gera um nome padrão para a publicacao
publicacoes.publicar(publicacao);
publicacoesService.publicarDiario(publicacao);
result.redirectTo(this).lista( );
}
as outras classes envolvidas no processo:
@Stateless
public class DiarioService {
@Inject
private AssinadorA1 assinadorA1;
@Inject
private HtmlToPdfConverter converter;
@Inject
private publicacaoBuilder builder;
public void publicar(Publicacao publicacao){
/**um documento possui várias publicações
o publicacaoBuilder gera uma String com o html de todas as
publicações de um documento**/
String conteudo = builder.convert(publicacao);
/**
pega o html gerado anteriormente e converte em um arquivo pdf
e salva em um diretório dentro do servidor
**/
converter.convertToFile(conteudo, PATH_PUBLICACAO publicacao.getCaminho());
/*assina digitalmente o arquivo criado*/
assinadorA1.signA1( PATH_PUBLICACAO + publicacao.getCaminho(), PATH_PUBLICACAO + UUID.randomUUID()+publicacao.getCaminho());
}
}
O código acima funciona, mas acredito que eu possa melhora ló, uma coisa que achei bem legal e que deixaria esse código bem desacoplado seriam os eventos do CDI mas fiquei com dúvida em dois pontos:
1- Eu preciso que todo esse processo ocorra exatamente nesta ordem: salvar a data da publicação no banco, gerar o html da publicação, gerar o pdf e assinar o pdf. utilizando os eventos do CDI posso definir a ordem em que eles ocorrem?
2- Preciso que todo esse processo seja transacional, qualquer operação que falhe deve invalidar todo o processo, os eventos CDI são transacionais?
desde já agradeço qualquer ajuda.