package gcom.micromedicao;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.FiltroSegurancaParametro;
import gcom.seguranca.SegurancaParametro;
import gcom.util.IoUtil;
import gcom.util.Util;
import gcom.util.filtro.ParametroSimples;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class RetornarArquivoTxtLeituraAction extends GcomAction {
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
ActionForward retorno = null;
String idArquivoTxt = httpServletRequest.getParameter("idRegistroAtualizacao");
FiltroArquivoTextoRoteiroEmpresa filtroArquivoTextoRoteiroEmpresa = new FiltroArquivoTextoRoteiroEmpresa();
filtroArquivoTextoRoteiroEmpresa.adicionarParametro(new ParametroSimples(FiltroArquivoTextoRoteiroEmpresa.ID, idArquivoTxt));
Fachada fachada = Fachada.getInstancia();
Collection colecaoArquivoTxtLeitura = fachada.pesquisar(filtroArquivoTextoRoteiroEmpresa, ArquivoTextoRoteiroEmpresa.class.getName());
ArquivoTextoRoteiroEmpresa arquivoTextoRoteiroEmpresa = (ArquivoTextoRoteiroEmpresa) colecaoArquivoTxtLeitura.iterator().next();
if (arquivoTextoRoteiroEmpresa.getSituacaoTransmissaoLeitura().getId().equals(SituacaoTransmissaoLeitura.LIBERADO)
|| arquivoTextoRoteiroEmpresa.getSituacaoTransmissaoLeitura().getId().equals(SituacaoTransmissaoLeitura.EM_CAMPO)) {
try {
boolean arquivoPossuiExtensaoGZ = arquivoTextoRoteiroEmpresa.getNomeArquivo().toUpperCase().endsWith(".GZ");
// se o arquivo n�o possuir extens�o GZ
if (!arquivoPossuiExtensaoGZ && !arquivoTextoRoteiroEmpresa.isArquivoNovoBatch()) {
File temporario = File.createTempFile("temporario", ".txt");
FileOutputStream outputStream = new FileOutputStream(temporario);
try {
if (arquivoTextoRoteiroEmpresa.getArquivoTextoNaoRecebido() != null) {
outputStream.write(((StringBuilder) IoUtil.transformarBytesParaObjeto(arquivoTextoRoteiroEmpresa.getArquivoTextoNaoRecebido()))
.toString().getBytes());
} else {
outputStream.write(((StringBuilder) IoUtil.transformarBytesParaObjeto(arquivoTextoRoteiroEmpresa.getArquivoTexto())).toString()
.getBytes());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
outputStream.close();
FileInputStream inputStream = new FileInputStream(temporario);
int INPUT_BUFFER_SIZE = 1024;
byte[] temp = new byte[INPUT_BUFFER_SIZE];
int numBytesRead = 0;
ByteArrayOutputStream arquivo = new ByteArrayOutputStream();
while ((numBytesRead = inputStream.read(temp, 0, INPUT_BUFFER_SIZE)) != -1) {
arquivo.write(temp, 0, numBytesRead);
}
inputStream.close();
inputStream = null;
arquivo.close();
httpServletResponse.setContentType("text/plain");
httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" + arquivoTextoRoteiroEmpresa.getNomeArquivo());
ServletOutputStream out;
out = httpServletResponse.getOutputStream();
out.write(arquivo.toByteArray());
out.flush();
out.close();
} else {
httpServletResponse.setContentType("application/zip");
if (arquivoTextoRoteiroEmpresa.isArquivoNovoBatch()) {
httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" + arquivoTextoRoteiroEmpresa.getNomeArquivo() + ".gz");
Util.escreverArquivo(getCaminhoArquivoNovoBatch(arquivoTextoRoteiroEmpresa), httpServletResponse);
} else {
httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" + arquivoTextoRoteiroEmpresa.getNomeArquivo());
ServletOutputStream out = httpServletResponse.getOutputStream();
if (arquivoTextoRoteiroEmpresa.getArquivoTextoNaoRecebido() != null) {
out.write(arquivoTextoRoteiroEmpresa.getArquivoTextoNaoRecebido());
} else {
out.write(arquivoTextoRoteiroEmpresa.getArquivoTexto());
}
out.flush();
out.close();
}
}
// Atualizar Situacao do Arquivo
fachada.atualizarArquivoTextoEnviado(arquivoTextoRoteiroEmpresa.getId(), SituacaoTransmissaoLeitura.EM_CAMPO);
} catch (Exception e) {
e.printStackTrace();
reportarErros(httpServletRequest, "erro.sistema");
}
} else {
throw new ActionServletException("atencao.arquivo_nao_pode_baixar");
}
return retorno;
}
private String getCaminhoArquivoNovoBatch(ArquivoTextoRoteiroEmpresa arquivoTextoRoteiroEmpresa) {
StringBuilder caminhoCompleto = new StringBuilder();
FiltroSegurancaParametro filtroSegurancaParametro = new FiltroSegurancaParametro();
filtroSegurancaParametro.adicionarParametro(new ParametroSimples(FiltroSegurancaParametro.NOME, SegurancaParametro.NOME_PARAMETRO_SEGURANCA.CAMINHO_ARQUIVOS.toString()));
Collection parametros = Fachada.getInstancia().pesquisar(filtroSegurancaParametro, SegurancaParametro.class.getName());
SegurancaParametro caminho = (SegurancaParametro) parametros.iterator().next();
caminhoCompleto.append(caminho.getValor())
.append(arquivoTextoRoteiroEmpresa.getFaturamentoGrupo().getId() + "/")
.append(arquivoTextoRoteiroEmpresa.getAnoMesReferencia() + "/")
.append(arquivoTextoRoteiroEmpresa.getNomeArquivo() + ".gz");
return caminhoCompleto.toString();
}
}