package gcom.gui.micromedicao;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.micromedicao.ArquivoTextoRoteiroEmpresa;
import gcom.micromedicao.ArquivoTextoRoteiroEmpresaDivisao;
import gcom.micromedicao.FiltroArquivoTextoRoteiroEmpresa;
import gcom.micromedicao.FiltroArquivoTextoRoteiroEmpresaDivisao;
import gcom.micromedicao.SituacaoTransmissaoLeitura;
import gcom.tarefa.TarefaException;
import gcom.util.IoUtil;
import gcom.util.ZipUtil;
import gcom.util.filtro.ParametroSimples;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.zip.ZipOutputStream;
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 RetornarArquivoZipLeituraAction extends GcomAction {
/**
* Este caso de uso permite Retornar um Arquivo Txt Leitura
*
* [UC0629] Retornar Arquivo Txt Leitura
*
*
* @author R�mulo Aur�lio
* @date 13/10/2008
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
ActionForward retorno = null;
ConsultarArquivoTextoLeituraActionForm form = (ConsultarArquivoTextoLeituraActionForm) actionForm;
String[] idsRegistrosRemocao = form.getIdsRegistros();
Fachada fachada = Fachada.getInstancia();
Collection colecaoArquivoTextoRoteiroEmpresa = fachada
.pesquisarArquivosTextoRoteiroEmpresaCompletoParaArquivoZip(idsRegistrosRemocao);
Iterator colecaoArquivoTextoRoteiroEmpresaIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresa
.iterator();
ArquivoTextoRoteiroEmpresa arquivoTextoRoteiroEmpresa = null;
ZipOutputStream zos = null;
// filtro para pesquisar os arquivos dividido caso a rota seja dividida.
FiltroArquivoTextoRoteiroEmpresaDivisao filtroArquivoTextoRoteiroEmpresaDivisao = null;
if (colecaoArquivoTextoRoteiroEmpresa != null
&& !colecaoArquivoTextoRoteiroEmpresa.isEmpty()) {
if (colecaoArquivoTextoRoteiroEmpresaIterator.hasNext()) {
arquivoTextoRoteiroEmpresa = (ArquivoTextoRoteiroEmpresa) colecaoArquivoTextoRoteiroEmpresaIterator
.next();
}
// Informa��es da rota
// ----------------------------------------------------------
String localidade = arquivoTextoRoteiroEmpresa.getLocalidade()
.getId() + "";
String setorComercial = arquivoTextoRoteiroEmpresa
.getCodigoSetorComercial1() + "";
String codigoRota = arquivoTextoRoteiroEmpresa.getRota()
.getCodigo() + "";
// -----------------------------------------------------------------------------/
String nomeArquivo = "Rol_Grupo";
String grupo = "";
// Verifica se o grupo de faturamento est� selecionado e
// seta o grupo atrav�s do primeiro arquivo pesquisado.
if (!form.getGrupoFaturamentoID().equals("-1")) {
grupo = "_"
+ arquivoTextoRoteiroEmpresa.getFaturamentoGrupo()
.getId();
}
String nomeArquivoZip = nomeArquivo + grupo + ".zip";
File compactadoTipo = new File(nomeArquivoZip);
try {
zos = new ZipOutputStream(new FileOutputStream(compactadoTipo));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
colecaoArquivoTextoRoteiroEmpresaIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresa
.iterator();
try {
while (colecaoArquivoTextoRoteiroEmpresaIterator.hasNext()) {
arquivoTextoRoteiroEmpresa = (ArquivoTextoRoteiroEmpresa) colecaoArquivoTextoRoteiroEmpresaIterator
.next();
if (arquivoTextoRoteiroEmpresa
.getSituacaoTransmissaoLeitura().getId()
.equals(SituacaoTransmissaoLeitura.LIBERADO)
|| arquivoTextoRoteiroEmpresa
.getSituacaoTransmissaoLeitura()
.getId()
.equals(SituacaoTransmissaoLeitura.EM_CAMPO)) {
// Id da rota do arquivo principal
Integer idRota = arquivoTextoRoteiroEmpresa.getRota()
.getId();
// Ano e m�s de faturamento da rota
Integer anoMesFaturamento = arquivoTextoRoteiroEmpresa
.getAnoMesReferencia();
// Array contendo situa��o para atualizar o arquivo
// principal
// quando a rota for dividida
Integer[] idsSituacaoTransmissao = new Integer[1];
idsSituacaoTransmissao[0] = SituacaoTransmissaoLeitura.EM_CAMPO;
/*
*
*
* Verifica se a rota � dividida para adicionar ao zip
* os arquivos divididos.
*
* @author Felipe Santos
*
* @date 19/07/2011
*/
if (fachada.isRotaDividida(idRota, anoMesFaturamento)) {
filtroArquivoTextoRoteiroEmpresaDivisao = new FiltroArquivoTextoRoteiroEmpresaDivisao();
filtroArquivoTextoRoteiroEmpresaDivisao
.adicionarParametro(new ParametroSimples(
FiltroArquivoTextoRoteiroEmpresaDivisao.ARQUIVO_TEXTO_ROTEIRO_EMPRESA_ID,
arquivoTextoRoteiroEmpresa.getId()));
// Array para ordenar a cole��o por Numero de
// Sequencia
// do arquivo e Situacao de Transmissao
String[] orderby = new String[] {
FiltroArquivoTextoRoteiroEmpresaDivisao.NUMERO_SEQUENCIA_LEITURA,
FiltroArquivoTextoRoteiroEmpresaDivisao.SITUACAO_TRANS_LEITURA };
filtroArquivoTextoRoteiroEmpresaDivisao
.adicionarCaminhoParaCarregamentoEntidade(FiltroArquivoTextoRoteiroEmpresaDivisao.ARQUIVO_TEXTO_ROTEIRO_EMPRESA);
filtroArquivoTextoRoteiroEmpresaDivisao
.adicionarCaminhoParaCarregamentoEntidade(FiltroArquivoTextoRoteiroEmpresa.SITUACAO_TRANS_LEITURA);
// Seta no filtro o crit�rio para ordena��o da
// cole��o
filtroArquivoTextoRoteiroEmpresaDivisao
.setCampoOrderBy(orderby);
// Cole��o contendo os arquivos divididos da rota
Collection colecaoArquivoTextoRoteiroEmpresaDivisao = fachada
.pesquisar(
filtroArquivoTextoRoteiroEmpresaDivisao,
ArquivoTextoRoteiroEmpresaDivisao.class
.getName());
Iterator colecaoArquivoTextoRoteiroEmpresaDivisaoIterator = (Iterator) colecaoArquivoTextoRoteiroEmpresaDivisao
.iterator();
/*
* Para cada arquivo dividido, descomprime o arquivo
* e adiciona o n�mnero de sequ�ncia do arquivo em
* seu nome. Em seguida, comprime o arquivo
* novamente e adiciona-o ao zip.
*/
while (colecaoArquivoTextoRoteiroEmpresaDivisaoIterator
.hasNext()) {
ArquivoTextoRoteiroEmpresaDivisao arquivoTextoRoteiroEmpresaDivisao = (ArquivoTextoRoteiroEmpresaDivisao) colecaoArquivoTextoRoteiroEmpresaDivisaoIterator
.next();
// Arquivo dividido original
File arquivoOriginal = new File(
arquivoTextoRoteiroEmpresaDivisao
.getNomeArquivo());
FileOutputStream out = new FileOutputStream(
arquivoOriginal.getAbsolutePath());
out.write(arquivoTextoRoteiroEmpresaDivisao
.getArquivoTexto());
out.close();
// Descomprime o arquivo dividido original
File arquivoDescomprimido = ZipUtil
.descomprimirGzip(arquivoOriginal);
// Renomeia o arquivo descomprimido com sufixo
// sendo o n�mero de sequ�ncia do arquivo
// dividido
File arquivoDescomprimidoRenomeado = new File(
arquivoDescomprimido.getAbsolutePath()
+ "-"
+ arquivoTextoRoteiroEmpresaDivisao
.getNumeroSequenciaArquivo());
arquivoDescomprimido
.renameTo(arquivoDescomprimidoRenomeado);
// Comprime o arquivo renomeado
File arquivoComprimido = ZipUtil
.comprimirGzip(arquivoDescomprimidoRenomeado);
// Adiciona no arquivo zip final
ZipUtil.adicionarArquivo(zos, arquivoComprimido);
arquivoDescomprimidoRenomeado.delete();
arquivoComprimido.delete();
zos.closeEntry();
// Atualiza situa��o do arquivo dividido para EM
// CAMPO
fachada.atualizarArquivoTextoDivisaoEnviado(
arquivoTextoRoteiroEmpresaDivisao
.getId(),
SituacaoTransmissaoLeitura.EM_CAMPO);
}
fachada.atualizarArquivoTextoEnviado(
arquivoTextoRoteiroEmpresa.getId(),
SituacaoTransmissaoLeitura.EM_CAMPO);
} else {
// Arquivo original
File arquivoOriginal = new File(
arquivoTextoRoteiroEmpresa.getNomeArquivo());
FileOutputStream out = new FileOutputStream(
arquivoOriginal.getAbsolutePath());
/*
* Par�metro do m�todo out.write()
* modificado. Adiciona diretamente o array de bytes
* -> arquivoTextoRoteiroEmpresa.getArquivoTexto()
*/
out.write(arquivoTextoRoteiroEmpresa
.getArquivoTexto());
out.close();
// Adiciona no arquivo zip final
ZipUtil.adicionarArquivo(zos, arquivoOriginal);
arquivoOriginal.delete();
zos.closeEntry();
// Atualiza situa��o do arquivo para EM CAMPO
fachada.atualizarArquivoTextoEnviado(
arquivoTextoRoteiroEmpresa.getId(),
SituacaoTransmissaoLeitura.EM_CAMPO);
}
} else {
throw new ActionServletException(
"atencao.arquivo_nao_pode_baixar_rota_invalida",
localidade, setorComercial, codigoRota);
}
}
zos.flush();
zos.close();
httpServletResponse.setContentType("application/zip");
httpServletResponse.addHeader("Content-Disposition",
"attachment; filename=" + nomeArquivoZip);
File arquivoZip = new File(nomeArquivoZip);
ServletOutputStream sos = httpServletResponse.getOutputStream();
// Finaliza o arquivo zip final
sos.write(IoUtil.getBytesFromFile(arquivoZip));
sos.flush();
sos.close();
arquivoZip.delete();
} catch (IOException e) {
e.printStackTrace();
throw new TarefaException("Erro ao gerar o arquivo zip", e);
} catch (ActionServletException ex2) {
throw ex2;
}
}
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
throw new TarefaException("Erro ao fechar o zip do relatorio", e);
}
return retorno;
}
}