@author fmyamauti
*/
public class ComunicacaoThread extends Thread {
private Socket socket;
private ObjectInputStream input;
private ObjectOutputStream output;
private Date datReferencia;
private Pacote pacote;
private Marcacao marcacao;
private Funcionario funcionario;
private Funhor funhor;
private FunhorExcecao funhorExcecao;
private MarcacaoDAO marcacaoDAO;
private MensagemDAO mensagemDAO;
private FuncionarioDAO funcionarioDAO;
private FunhorDAO funhorDAO;
private FunhorExcecaoDAO funhorExcecaoDAO;
private String pathArquivoEquipe;
private String pathMarcacoesXML;
private String pathMarcacoesTXT;
private String timeZone;
static Logger logger = Logger.getLogger(ComunicacaoThread.class);
private Appender fileAppender;
private TimesheetServerFrame timesheetServerFrame;
/** Creates a new instance of ComunicacaoThread */
public ComunicacaoThread(Socket socket) {
super(“ComunicacaoThread”);
this.socket = socket;
pacote = new Pacote();
marcacaoDAO = new MarcacaoDAO();
funcionarioDAO = new FuncionarioDAO();
mensagemDAO = new MensagemDAO();
funhorDAO = new FunhorDAO();
funhorExcecaoDAO = new FunhorExcecaoDAO();
BasicConfigurator.configure();
try {
fileAppender = new FileAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN), “debug.log”);
logger.addAppender(fileAppender);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setPathArquivoEquipe(String pathArquivoEquipe) {
this.pathArquivoEquipe = pathArquivoEquipe;
}
public void setPathMarcacoesXML(String pathMarcacoesXML) {
this.pathMarcacoesXML = pathMarcacoesXML;
}
public void setPathMarcacoesTXT(String pathMarcacoesTXT) {
this.pathMarcacoesTXT = pathMarcacoesTXT;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public int getCodOperacao() {
return pacote.getCodOperacao();
}
public void setTimesheetServerFrame(TimesheetServerFrame timesheetServerFrame) {
this.timesheetServerFrame = timesheetServerFrame;
}
@Override
public void run() {
try {
// Obtém pacote enviado pelo cliente.
input = new ObjectInputStream(socket.getInputStream());
pacote = (Pacote)input.readObject();
// Processa o pacote.
pacote = processarPacote(pacote);
// Envia resposta ao cliente.
output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(pacote);
output.flush();
output.reset();
} catch (ClassNotFoundException ex) {
desconectar();
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: “, ex);
} catch (IOException ex) {
desconectar();
ex.printStackTrace(System.out);
logger.error(”[ComunicacaoThread]: ", ex);
}
}
private void desconectar() {
try {
if ( input != null ) {
input.close();
}
if ( output != null ) {
output.close();
}
if ( socket != null && socket.isConnected() ) {
socket.close();
}
anular();
} catch (IOException ex) {
anular();
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", ex);
}
}
private void anular() {
input = null;
output = null;
socket = null;
System.gc();
}
// Faz o processamento do pacote de solicitação enviado pelo cliente.
private Pacote processarPacote(Pacote pacote) {
switch (pacote.getCodOperacao()) {
// Início da aplicação cliente
case Pacote.OP_INICIO: {
try {
// Tenta obter o funcionário através de seu RE
funcionario = funcionarioDAO.getByRe(pacote.getFuncionario().getCodReRh());
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(e.getMessage());
logger.error("[ComunicacaoThread]: ", e);
}
// Se encontrou o funcionário
if ( funcionario != null ) {
datReferencia = pacote.getDatReferencia();
try {
// Obtém as marcações do funcionário e seus dados como nome, escala, jornada, site, contrato, etc.
pacote.getListMarcacao().clear();
pacote.setListMarcacao(marcacaoDAO.getByCodReDatReferencia(funcionario.getCodReRh(), datReferencia));
pacote.setFuncionario(funcionario);
pacote.setTemMarcacoesHoje(marcacaoDAO.temMarcacoesHoje(funcionario.getCodReRh()));
funhorExcecao = funhorExcecaoDAO.getByCodReRhDatExcecao(pacote.getFuncionario().getCodReRh(), datReferencia);
funhor = funhorDAO.getByCodReRhDatReferencia(pacote.getFuncionario().getCodReRh(), datReferencia);
if (funhorExcecao == null) {
pacote.getFuncionario().setFunhor(funhor);
} else {
funhorExcecao.setTempoPausa(funhor.getTempoPausa());
funhorExcecao.setTempoRefeicao(funhor.getTempoRefeicao());
pacote.getFuncionario().setFunhorExcecao(funhorExcecao);
}
pacote.setStatus(Pacote.ACK);
pacote.setMensagem(mensagemDAO.getMensagem().getDesMensagem());
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(e.getMessage());
logger.error("[ComunicacaoThread]: ", e);
}
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Funcionário não encontrado. Caso pertença à esta supervisão, solicite a atualização da equipe.");
}
// Aproveito para enviar a data e hora atuais.
pacote.setDatHorAtual(Calendar.getInstance(TimeZone.getTimeZone(timeZone), new Locale("pt", "BR")));
pacote.setTimezone(timeZone);
break;
}
// Solicitação de lista de marcações para determinada data referência.
case Pacote.OP_OBTER_MARCACOES: {
datReferencia = pacote.getDatReferencia();
try {
// Obtém as marcações através do RE e data de referência
pacote.getListMarcacao().clear();
pacote.setListMarcacao(marcacaoDAO.getByCodReDatReferencia(pacote.getFuncionario().getCodReRh(), datReferencia));
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("");
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(e.getMessage());
logger.error("[ComunicacaoThread]: ", e);
}
// Aproveito para enviar a data e hora atuais.
pacote.setDatHorAtual(Calendar.getInstance(TimeZone.getTimeZone(timeZone), new Locale("pt", "BR")));
pacote.setTimezone(timeZone);
break;
}
// Solicitação de marcação de ponto recebida.
case Pacote.OP_MARCACAO: {
try {
// Tento obter o funcionário que solicitou a marcação através do RE e senha informados.
funcionario = funcionarioDAO.getByReSenha(pacote.getFuncionario().getCodReRh(), pacote.getFuncionario().getDesSenha());
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(e.getMessage());
e.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", e);
}
// Se encontrou o funcionário
if ( funcionario != null ) {
Iterator it = pacote.getListMarcacao().iterator();
marcacao = (Marcacao)it.next();
Marcacao marcacaoAux = null;
try {
marcacaoAux = marcacaoDAO.getByReDataTipo(marcacao);
} catch (Exception ex) {
ex.printStackTrace();
logger.error("[ComunicacaoThread]: ", ex);
}
pacote.getListMarcacao().clear();
if (marcacaoAux!=null) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Marcação não efetuada: já existe marcação para este evento");
pacote.getListMarcacao().add(marcacaoAux);
pacote.setCodErro(Pacote.ERR_MARCACAO_JA_EXISTE);
} else {
try {
// Atribui a hora atual, do servidor, à marcação do funcionário.
marcacao.setHorMarcacao(Util.calHourMinToMin(Calendar.getInstance(TimeZone.getTimeZone(timeZone), new Locale("pt", "BR"))));
// Salva a marcação no BD.
marcacaoDAO.salvar(marcacao);
// Adiciona a marcação recém feita ao pacote pois será enviada de volta ao cliente.
pacote.getListMarcacao().add(marcacao);
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("Marcação efetuada com sucesso");
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Erro! Marcação não efetuada: " + e.getMessage());
e.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: ", e);
}
}
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("RE e/ou senha inválidos");
}
// Aproveito para enviar a data e hora atuais.
pacote.setDatHorAtual(Calendar.getInstance(TimeZone.getTimeZone(timeZone), new Locale("pt", "BR")));
pacote.setTimezone(timeZone);
break;
}
// Solicitação de data e hora atuais recebida
case Pacote.OP_HORA_ATUAL: {
// Data e hora atual do servidor
pacote.setDatHorAtual(Calendar.getInstance(TimeZone.getTimeZone(timeZone), new Locale("pt", "BR")));
pacote.setTimezone(timeZone);
pacote.setStatus(Pacote.ACK);
break;
}
// Solicitação de alteração de senha recebida
case Pacote.OP_ALTERAR_SENHA: {
try {
// Tento obter o funcionário através do RE e senha atual enviados.
funcionario = funcionarioDAO.getByReSenha(pacote.getFuncionario().getCodReRh(), pacote.getFuncionario().getDesSenha());
} catch (Exception e) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(e.getMessage());
logger.error("[ComunicacaoThread]: ", e);
}
// Se encontrou o funcionário
if ( funcionario != null ) {
// Atualiza a senha
funcionario.setDesSenha(pacote.getNovaSenha());
try {
// Salva no BD
funcionarioDAO.salvar(funcionario);
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("Senha alterada com sucesso!");
} catch (Exception ex) {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Erro: Não foi possível alterar a senha");
ex.printStackTrace();
logger.error("[ComunicacaoThread]: ", ex);
}
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Senha atual incorreta");
}
break;
}
case Pacote.OP_OBTER_EQUIPE: {
String pathArquivo = pathArquivoEquipe + "\\" + pacote.getNomeArquivo();
if (Util.arquivoExiste(pathArquivo)) {
ImportaDadosXML importaDadosXML = new ImportaDadosXML(pathArquivo);
importaDadosXML.setTimeZone(timeZone);
// Executa método run() de ImportaDadosXML.
importaDadosXML.start();
try {
// Faz a Thread principal aguardar até a Thread importaDadosXML finalizar.
importaDadosXML.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
logger.error("[ComunicacaoThread]: ", ex);
}
if (importaDadosXML.sucesso()) {
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("O arquivo foi processado com sucesso!");
timesheetServerFrame.atualizaTimezone();
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(importaDadosXML.getMensagem());
}
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem("Não foi possível encontrar o arquivo especificado na pasta do servidor");
}
break;
}
case Pacote.OP_EXPORTAR_MARCACOES_XML: {
String pathArquivo = pathMarcacoesXML + "\\" + pacote.getNomeArquivo();
java.sql.Date dataDe = pacote.getDataDe();
java.sql.Date dataAte = pacote.getDataAte();
ExportaDadosXML exportaDadosXML = new ExportaDadosXML(pathArquivo, dataDe, dataAte);
exportaDadosXML.setTimeZone(timeZone);
// Executa método run() de ExportaDadosXML.
exportaDadosXML.start();
try {
// Faz a Thread principal aguardar até a Thread exportaDadosXML finalizar.
exportaDadosXML.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
logger.error("[ComunicacaoThread]: ", ex);
}
if (exportaDadosXML.sucesso()) {
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("O arquivo foi gerado com sucesso!");
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(exportaDadosXML.getMensagem());
}
break;
}
case Pacote.OP_EXPORTAR_MARCACOES_TXT: {
String pathArquivo = pathMarcacoesTXT + "\\" + pacote.getNomeArquivo();
java.sql.Date dataDe = pacote.getDataDe();
java.sql.Date dataAte = pacote.getDataAte();
ExportaDadosTXT exportaDadosTXT = new ExportaDadosTXT(pathArquivo, 0, dataDe, dataAte);
exportaDadosTXT.setTimeZone(timeZone);
// Executa método run() de ExportaDadosTXT.
exportaDadosTXT.start();
try {
// Faz a Thread principal aguardar até a Thread exportaDadosTXT finalizar.
exportaDadosTXT.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
logger.error("[ComunicacaoThread]: ", ex);
}
if (exportaDadosTXT.sucesso()) {
pacote.setStatus(Pacote.ACK);
pacote.setMensagem("O arquivo foi gerado com sucesso!");
} else {
pacote.setStatus(Pacote.NACK);
pacote.setMensagem(exportaDadosTXT.getMensagem());
}
break;
}
}
return pacote;
}
}
[/code]