package gcom.gui.micromedicao;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.fachada.Fachada;
import gcom.gui.GcomAction;
import gcom.micromedicao.FiltroArquivoTextoRoteiroEmpresa;
import gcom.micromedicao.ServicoTipoCelular;
import gcom.micromedicao.SituacaoTransmissaoLeitura;
import gcom.util.filtro.ParametroSimples;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Vector;
import javax.mail.SendFailedException;
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;
/**
* Action utilizado
*
* [UC0631] Processar Requisi��es do Dipositivo M�vel.
*
* @author Thiago Nascimento
* @since 15/08/2007
*
* Atualizado por: Felipe Melo
* Data: 04/12/2009
*
*/
public class ProcessarRequisicaoDipositivoMovelAction extends GcomAction {
/**
* Constantes de Classe.
*/
private static final byte RESPOSTA_ERRO = 1;
private static final byte RESPOSTA_OK = 2;
public static final int RESPOSTA_NENHUMA_ROTA_DISPONIVEL = 3;
//private static final int ARQUIVO_TEXTO_PARA_ENVIO = 2;
private static final int ARQUIVO_TEXTO_ENVIADO = 3;
private static final int ARQUIVO_TEXTO_FINALIZADO = 4;
private static final int PACOTE_BAIXAR_ARQUIVO = 0;
private static final int ATUALIZAR_MOVIMENTO = 1;
private static final int FINALIZAR_LEITURA = 2;
private static final int CONFIRMAR_ARQUIVO_RECEBIDO = 3;
private static final int TESTE_CONEXAO = 4;
/**
* M�todo Execute do Action
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) {
InputStream in = null;
OutputStream out = null;
try {
in = request.getInputStream();
DataInputStream din = new DataInputStream(in);
SistemaParametro sistemaParametro = Fachada.getInstancia().pesquisarParametrosDoSistema();
System.out.println("SP : [EMP] - " + sistemaParametro.getNomeAbreviadoEmpresa());
int pacote = din.readByte();
System.out.println("Solicitacao Mobile : " + pacote);
switch (pacote) {
case PACOTE_BAIXAR_ARQUIVO:
// Baixar Arquivo
out = response.getOutputStream();
this.baixarArquivo(din, response, out,sistemaParametro);
break;
case ATUALIZAR_MOVIMENTO:
// Atualizar Movimento
out = response.getOutputStream();
this.atualizarMovimentacao(din, response, out);
break;
case FINALIZAR_LEITURA:
// Finalizar Movimento
out = response.getOutputStream();
this.finalizarMovimentacao(din, response, out);
break;
case CONFIRMAR_ARQUIVO_RECEBIDO:
// Finalizar Movimento
this.confirmacaoArquivoRecebido(din);
if(sistemaParametro.getCodigoEmpresaFebraban().equals(SistemaParametro.CODIGO_EMPRESA_FEBRABAN_CAER)){
out = response.getOutputStream();
response.setContentLength(RESPOSTA_OK);
out.write(RESPOSTA_OK);
out.flush();
}
break;
case TESTE_CONEXAO:
out = response.getOutputStream();
response.setContentLength(RESPOSTA_OK);
out.write(RESPOSTA_OK);
out.flush();
}
} catch (IOException e) {
System.out.println("Erro: " + e.getMessage());
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo que baixa o arquivo de entrada do servidor.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @param data
* @param response
* @throws IOException
*/
public void baixarArquivo(DataInputStream data,
HttpServletResponse response, OutputStream out,SistemaParametro sistemaParametro) throws IOException {
Fachada fachada = Fachada.getInstancia();
long imei = data.readLong();
// ******************************************************************
// 08/01/2009
// COMENTADO PARA ENTRAR S� NA PROX. VERS�O
// String versao = data.readUTF();
// System.out.println("versao: " + versao);
// if(versao != null && versao.equals("v0.1")){
// *************************************************************
byte[] arq = fachada.baixarArquivoTextoParaLeitura(imei,ServicoTipoCelular.LEITURA);
if (arq != null) {
System.out.println("Inicio : Baixando arquivo Mobile");
if(sistemaParametro.getCodigoEmpresaFebraban().equals(SistemaParametro.CODIGO_EMPRESA_FEBRABAN_CAER)){
response.setContentLength(arq.length + 1);
out.write(RESPOSTA_OK);
out.write(arq);
out.flush();
}else{
response.setContentLength(arq.length);
out.write(arq);
out.flush();
}
System.out.println("Fim: Baixando arquivo Mobile");
} else {
System.out.println("Erro ao Baixar arquivo Mobile");
if(sistemaParametro.getCodigoEmpresaFebraban().equals(SistemaParametro.CODIGO_EMPRESA_FEBRABAN_CAER)){
response.setContentLength(RESPOSTA_NENHUMA_ROTA_DISPONIVEL);
out.write(RESPOSTA_NENHUMA_ROTA_DISPONIVEL);
}else{
response.setContentLength(RESPOSTA_ERRO);
out.write(RESPOSTA_ERRO);
}
out.flush();
}
// ******************************************************************
// else {
// System.out.println("Erro vers�o Mobile");
// response.setContentLength(RESPOSTA_ERRO_VERSAO);
// OutputStream out = response.getOutputStream();
// out.write(RESPOSTA_ERRO_VERSAO);
// out.flush();
// out.close();
// }
// ******************************************************************
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo que atualiza as movimenta��es dos leituristas.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @throws IOException
*
*/
public void atualizarMovimentacao(DataInputStream data,
HttpServletResponse response, OutputStream out) throws IOException {
Long imei = new Long(data.readLong());
System.out.println("atualizar Movimentacao Mobile imei = " + imei);
try {
Collection<DadosMovimentacao> dados = this
.gerarColecaoDadosMovimentacao(data, imei);
//this.atualizarLeiturasAnormalidades(dados, response, false, out);
Vector<DadosMovimentacao> v = new Vector<DadosMovimentacao>();
v.addAll(dados);
Fachada.getInstancia().atualizarLeituraAnormalidadeCelularCasoSistema(v);
System.out.println("Fim: atualizarMovimentacao Mobile");
// Resposta para o celular de OK
response.setContentLength(1);
// OutputStream out = response.getOutputStream();
out.write(RESPOSTA_OK);
out.flush();
System.out.println("Fim: atualizar faturamento movimento celular");
}catch (SendFailedException e) {
e.printStackTrace();
System.out.println("Erro ao finalizar movimento celular");
// Resposta para o celular de OK
response.setContentLength(1);
// OutputStream out = response.getOutputStream();
out.write(RESPOSTA_OK);
out.flush();
} catch (Exception e) {
e.printStackTrace();
System.out
.println("Erro ao atualizar faturamento movimento celular");
response.setContentLength(RESPOSTA_ERRO);
out.write(RESPOSTA_ERRO);
out.flush();
}
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo que atualiza as movimenta��es dos leituristas.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @throws IOException
*
*/
public void atualizarLeiturasAnormalidades(
Collection<DadosMovimentacao> dados, HttpServletResponse response,
boolean finalizacao, OutputStream out) throws IOException {
Fachada fachada = Fachada.getInstancia();
if (!dados.isEmpty()) {
//dados = null;
fachada.atualiarRoteiro(dados, true);
}
// Resposta para o celular de OK na atualiza��o
// if (!finalizacao) {
// response.setContentLength(1);
// // OutputStream out = response.getOutputStream();
// out.write(RESPOSTA_OK);
// out.flush();
// // out.close();
// }
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo que finaliza as movimenta��es.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @throws IOException
*
*/
public void finalizarMovimentacao(DataInputStream data,
HttpServletResponse response, OutputStream out) throws IOException {
Fachada fachada = Fachada.getInstancia();
Long imei = new Long(data.readLong());
System.out.println("Finalizando arquivo Mobile imei=" + imei);
try{
Collection<DadosMovimentacao> dados = this
.gerarColecaoDadosMovimentacao(data, imei);
//this.atualizarLeiturasAnormalidades(dados, response, true, out);
// out.close();
Vector<DadosMovimentacao> v = new Vector<DadosMovimentacao>();
v.addAll(dados);
//v = null;
fachada.atualizarLeituraAnormalidadeCelularCasoSistema(v);
FiltroArquivoTextoRoteiroEmpresa filtroArquivo = new FiltroArquivoTextoRoteiroEmpresa(
FiltroArquivoTextoRoteiroEmpresa.NUMERO_SEQUENCIA_LEITURA);
filtroArquivo
.adicionarCaminhoParaCarregamentoEntidade(FiltroArquivoTextoRoteiroEmpresa.GRUPO_FATURAMENTO);
filtroArquivo
.adicionarCaminhoParaCarregamentoEntidade(FiltroArquivoTextoRoteiroEmpresa.ROTA);
filtroArquivo.adicionarParametro(new ParametroSimples(
FiltroArquivoTextoRoteiroEmpresa.IMEI, imei));
filtroArquivo.adicionarParametro(new ParametroSimples(
FiltroArquivoTextoRoteiroEmpresa.SITUACAO_TRANS_LEITURA_ID,
SituacaoTransmissaoLeitura.EM_CAMPO));
fachada.atualizarArquivoTextoEnviado(imei, ARQUIVO_TEXTO_ENVIADO,
ARQUIVO_TEXTO_FINALIZADO);
// Resposta para o celular de OK
response.setContentLength(1);
// OutputStream out = response.getOutputStream();
out.write(RESPOSTA_OK);
out.flush();
System.out.println("Fim: finalizar movimento celular");
}catch (SendFailedException e) {
e.printStackTrace();
System.out.println("Erro ao finalizar movimento celular");
// Resposta para o celular de OK
response.setContentLength(1);
// OutputStream out = response.getOutputStream();
out.write(RESPOSTA_OK);
out.flush();
} catch( Exception e ){
e.printStackTrace();
System.out.println("Erro ao finalizar movimento celular");
response.setContentLength(RESPOSTA_ERRO);
out.write(RESPOSTA_ERRO);
out.flush();
}
}
/**
*
* M�todo de Comfirma��o do Recebimento do Arquivo
*
* @since 23/05/08
* @param data
* @throws IOException
*/
public void confirmacaoArquivoRecebido(DataInputStream data)
throws IOException {
Fachada fachada = Fachada.getInstancia();
long imei = data.readLong();
System.out.println("Confirmando Recebimento do arquivo Mobile imei = "
+ imei);
//Atualiza a situa��o do arquivo texto de "em campo" para "finalizado e n�o transmitido"
//Altera��o feita por S�vio Luiz
//Data:05/04/2010
fachada.atualizarArquivoTextoEnviado(imei, SituacaoTransmissaoLeitura.EM_CAMPO,
SituacaoTransmissaoLeitura.FINALIZADO_NAO_TRANSMITIDO);
//Atualiza a situa��o do arquivo texto de "liberado" para "em campo"
//Altera��o feita por S�vio Luiz
//Data:05/04/2010
fachada.atualizarArquivoTextoEnviado(imei, SituacaoTransmissaoLeitura.LIBERADO,
SituacaoTransmissaoLeitura.EM_CAMPO);
//Atualiza a situa��o do arquivo texto de "dispon�vel" para "liberado"
//Altera��o feita por S�vio Luiz
//Data:05/04/2010
fachada.atualizarArquivoTextoMenorSequencialLeitura(imei,SituacaoTransmissaoLeitura.DISPONIVEL,
SituacaoTransmissaoLeitura.LIBERADO,ServicoTipoCelular.LEITURA);
}
/**
* M�todo auxiliar que gerar uma Cole��o de Dados da Movimenta��o
*
* @param data
* @return
* @throws IOException
*/
private Collection<DadosMovimentacao> gerarColecaoDadosMovimentacao(
DataInputStream data, Long imei) throws IOException {
Collection<DadosMovimentacao> dados = new ArrayList<DadosMovimentacao>();
int imovel = data.read();
while (imovel != -1) {
byte[] b = new byte[4];
b[0] = (byte) imovel;
b[1] = (byte) data.read();
b[2] = (byte) data.read();
b[3] = (byte) data.read();
dados.add(new DadosMovimentacao(new Integer(this
.convertArrayByteToInt(b)), new Integer(data.readInt()),
new Integer(data.readByte()), new Date(data.readLong()),
imei, new Byte(data.readByte()),
new Integer(data.readInt())));
imovel = data.read();
}
return dados;
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo auxilar para converter um array de byte em um inteiro.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @param b
* @return int
*/
private int convertArrayByteToInt(byte[] b) {
int i = 0;
i += unsignedByteToInt(b[0]) << 24;
i += unsignedByteToInt(b[1]) << 16;
i += unsignedByteToInt(b[2]) << 8;
i += unsignedByteToInt(b[3]) << 0;
return i;
}
/**
* [UC0631] Processar Requisi��es do Dispositivo M�vel.
*
* M�todo auxiliar para converter byte em int.
*
* @author Thiago Nascimento
* @date 14/08/2007
*
* @param b
* @return
*/
private int unsignedByteToInt(byte b) {
return (int) b & 0xFF;
}
}