package gcom.gui.seguranca.acesso.transacao; import gcom.fachada.Fachada; import gcom.gui.GcomAction; import gcom.seguranca.acesso.FiltroOperacao; import gcom.seguranca.acesso.FiltroOperacaoEfetuada; import gcom.seguranca.acesso.Operacao; import gcom.seguranca.acesso.OperacaoEfetuada; import gcom.seguranca.acesso.usuario.FiltroUsuarioAlteracao; import gcom.seguranca.acesso.usuario.UsuarioAlteracao; import gcom.seguranca.transacao.AlteracaoTipo; import gcom.seguranca.transacao.FiltroTabelaLinhaColunaAlteracao; import gcom.seguranca.transacao.TabelaLinhaColunaAlteracao; import gcom.util.filtro.ParametroSimples; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class ConsultarOperacaoEfetuadaAction extends GcomAction { /** * < <Descri��o do m�todo>> * * @param actionMapping * Descri��o do par�metro * @param actionForm * Descri��o do par�metro * @param httpServletRequest * Descri��o do par�metro * @param httpServletResponse * Descri��o do par�metro * @return Descri��o do retorno */ public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ActionForward retorno = actionMapping.findForward("exibirOperacaoEfetuada"); ConsultarOperacaoEfetuadaActionForm form = (ConsultarOperacaoEfetuadaActionForm) actionForm; HttpSession sessao = httpServletRequest.getSession(false); HashMap resumoDados = null; FiltroOperacaoEfetuada filtroOperacaoEfetuada = new FiltroOperacaoEfetuada(); filtroOperacaoEfetuada.adicionarCaminhoParaCarregamentoEntidade(FiltroOperacaoEfetuada.OPERACAO); filtroOperacaoEfetuada.adicionarParametro(new ParametroSimples(FiltroOperacaoEfetuada.ID, new Integer(form.getIdOperacaoEfetuada()))); Collection coll = Fachada.getInstancia().pesquisar(filtroOperacaoEfetuada, OperacaoEfetuada.class.getSimpleName()); if (coll != null && !coll.isEmpty()) { OperacaoEfetuada operacaoEfetuada = (OperacaoEfetuada) coll.iterator().next(); FiltroOperacao filtroOperacao = new FiltroOperacao(); filtroOperacao.adicionarCaminhoParaCarregamentoEntidade( FiltroOperacao.ARGUMENTO_PESQUISA); filtroOperacao.adicionarCaminhoParaCarregamentoEntidade( FiltroOperacao.ARGUMENTO_PESQUISA_TABELA); filtroOperacao.adicionarParametro(new ParametroSimples(FiltroOperacao.ID,operacaoEfetuada. getOperacao().getId())); Collection collOperacao = Fachada.getInstancia().pesquisar(filtroOperacao, Operacao.class.getSimpleName()); Operacao operacao = (Operacao) collOperacao.iterator().next(); operacaoEfetuada.setOperacao(operacao); if (operacao.getArgumentoPesquisa() != null) { sessao.setAttribute("descricaoArgumento", operacao.getArgumentoPesquisa().getDescricaoColuna()); } else { sessao.setAttribute("descricaoArgumento", ""); } sessao.setAttribute("operacaoEfetuada", operacaoEfetuada); FiltroUsuarioAlteracao filtroUsuarioAlteracao = new FiltroUsuarioAlteracao(); filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.OPERACAO_EFETUADA); // filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.OPERACAO); filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.USUARIO_ACAO); // filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.USUARIO); filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.USUARIO_TIPO); filtroUsuarioAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroUsuarioAlteracao.USUARIO_FUNCIONARIO); filtroUsuarioAlteracao.adicionarParametro(new ParametroSimples(FiltroUsuarioAlteracao.OPERACAO_EFETUADA_ID, new Integer(form.getIdOperacaoEfetuada()))); coll = Fachada.getInstancia().pesquisar(filtroUsuarioAlteracao, UsuarioAlteracao.class.getName()); sessao.setAttribute("usuarioAlteracao", coll); FiltroTabelaLinhaColunaAlteracao filtroTabelaLinhaColunaAlteracao = new FiltroTabelaLinhaColunaAlteracao(); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_COLUNA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_LINHA_ALTERACAO); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA_ID, new Integer(form.getIdOperacaoEfetuada()))); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO_ID, AlteracaoTipo.ALTERACAO)); coll = Fachada.getInstancia().pesquisar(filtroTabelaLinhaColunaAlteracao, TabelaLinhaColunaAlteracao.class.getName()); //sessao.setAttribute("tabelaLinhaColunaAlteracao", coll); if (coll != null && !coll.isEmpty()) { resumoDados = consultarResumoInformacoesItemAnalisado(operacaoEfetuada); //sessao.setAttribute("tabelaLinhaColunaAlteracao", coll); } else { sessao.removeAttribute("tabelaLinhaColunaAlteracao"); } filtroTabelaLinhaColunaAlteracao = new FiltroTabelaLinhaColunaAlteracao(); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_COLUNA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_LINHA_ALTERACAO); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA_ID, new Integer(form.getIdOperacaoEfetuada()))); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO_ID, AlteracaoTipo.EXCLUSAO)); Collection exclusoes = Fachada.getInstancia().pesquisar(filtroTabelaLinhaColunaAlteracao, TabelaLinhaColunaAlteracao.class.getName()); if (coll != null && !coll.isEmpty()) { if (resumoDados == null){ resumoDados = consultarResumoInformacoesItemAnalisado(operacaoEfetuada); } //sessao.setAttribute("tabelaLinhaAlteracaoExcluida", coll); } else { sessao.removeAttribute("tabelaLinhaAlteracaoExcluida"); } filtroTabelaLinhaColunaAlteracao = new FiltroTabelaLinhaColunaAlteracao(); filtroTabelaLinhaColunaAlteracao.setConsultaSemLimites(true); filtroTabelaLinhaColunaAlteracao.setCampoOrderBy("ultimaAlteracao"); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_COLUNA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA_LINHA_ALTERACAO); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.TABELA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA); filtroTabelaLinhaColunaAlteracao.adicionarCaminhoParaCarregamentoEntidade(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.OPERACAO_EFETUADA_ID, new Integer(form.getIdOperacaoEfetuada()))); filtroTabelaLinhaColunaAlteracao.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaColunaAlteracao.ALTERACAO_TIPO_ID, AlteracaoTipo.INCLUSAO)); Collection inclusoes = Fachada.getInstancia().pesquisar(filtroTabelaLinhaColunaAlteracao, TabelaLinhaColunaAlteracao.class.getName()); Collection juncaoInclRemov = juntarInclusaoExclusaoMesmoTipo(inclusoes, exclusoes); // coll = juntarInclusaoExclusaoMesmoTipo(coll, exclusoes); coll.addAll(juncaoInclRemov); // coll.addAll(inclusoes); // coll.addAll(exclusoes); getFachada().ordenarTabelaLinhaColunaAlteracao(coll, operacao.getId()); // Collections.sort((List)coll, new Comparador()); if (coll != null && !coll.isEmpty()) { if (resumoDados == null){ resumoDados = consultarResumoInformacoesItemAnalisado(operacaoEfetuada); } sessao.setAttribute("tabelaLinhaAlteracaoIncluidas", coll); } else { sessao.removeAttribute("tabelaLinhaAlteracaoIncluidas"); } sessao.setAttribute("resumoDados", resumoDados); } return retorno; } private HashMap consultarResumoInformacoesItemAnalisado(OperacaoEfetuada operacaoEfetuada){ HashMap resumo = new HashMap(); String dadosAdicionais = operacaoEfetuada.getDadosAdicionais(); if (dadosAdicionais != null){ StringTokenizer stk = new StringTokenizer(dadosAdicionais,"$"); while (stk.hasMoreElements()) { String element = (String) stk.nextElement(); int ind = element.indexOf(":"); if (ind != -1){ String label = element.substring(0,ind); String valor = element.substring(ind + 1, element.length()); resumo.put(label,valor); } } } // FiltroTabelaLinhaAlteracao filtro = new FiltroTabelaLinhaAlteracao(); // filtro.adicionarParametro( // new ParametroSimples(FiltroTabelaLinhaAlteracao.OPERACAO_EFETUADA_ID, operacaoEfetuada.getId())); // filtro.adicionarParametro(new ParametroSimples(FiltroTabelaLinhaAlteracao.INDICADOR_PRINCIPAL, // TabelaLinhaAlteracao.INDICADOR_TABELA_LINHA_ALTERACAO_PRINCIPAL)); // // Collection coll = fachada.pesquisar(filtro, TabelaLinhaAlteracao.class.getName()); // if (coll != null && !coll.isEmpty()){ // TabelaLinhaAlteracao alteracao = (TabelaLinhaAlteracao) Util.retonarObjetoDeColecao(coll); // resumo = fachada.consultarResumoInformacoesOperacaoEfetuada(operacaoEfetuada, // alteracao.getId1()); // } return resumo; } /** * No sistema, quando se tem altera��es em cole��es, o que est� sendo feito � exclus�o de todos e inclus�o dos novos, * ent�o para ocultar tal a��o, esse m�todo faz um join das remo��es e inclusoes, afim de aparentar ter * sido uma altera��o. * @param inclusoes * @param remocoes * @return */ @SuppressWarnings("unchecked") private Collection juntarInclusaoExclusaoMesmoTipo(Collection inclusoes, Collection remocoes){ HashMap juncoes = new HashMap(); ArrayList linhasJuntadas = new ArrayList(); // percorrer as linhas de inclus�es e identificar as remo��es associadas a estas inclus�es // a rela��o entre elas � o id da coluna alterada, e a igualdade entre os seus conte�dos // al�m de identificar se esta coluna � primary key // caso seja identificada a associa��o, guarda-se no Map // idTabelaLinhaAlteracao de inclus�o -> idTabelaLinhaAlteracao da remo��o for (Iterator iter = inclusoes.iterator(); iter.hasNext();) { TabelaLinhaColunaAlteracao tlcaIncl = (TabelaLinhaColunaAlteracao) iter.next(); for (Iterator iterator = remocoes.iterator(); iterator.hasNext();) { TabelaLinhaColunaAlteracao tlcaRem = (TabelaLinhaColunaAlteracao) iterator.next(); if (tlcaIncl.getTabelaColuna().getId().equals(tlcaRem.getTabelaColuna().getId()) && tlcaIncl.getTabelaColuna().getIndicadorPrimaryKey().intValue() == new Integer("1") && tlcaIncl.getConteudoColunaAtual().equalsIgnoreCase(tlcaRem.getConteudoColunaAnterior())){ juncoes.put(tlcaIncl.getTabelaLinhaAlteracao().getId(), tlcaRem.getTabelaLinhaAlteracao().getId()); } } } // para cada jun��o montada no la�o anterior, vamos setar o valor anterior na linha de inclus�o // com o valor anterior da linha de remo��o, fazendo assim parece q a remo��o e a inclus�o // fosse uma altera��o for (Iterator iter = juncoes.keySet().iterator(); iter.hasNext();) { Integer idTLAIncl = (Integer) iter.next(); Integer idTLARem = (Integer) juncoes.get(idTLAIncl); Collection linhasJuntadasAux = new ArrayList(); boolean houveAlgumaAlteracao = false; for (Iterator iter2 = inclusoes.iterator(); iter2.hasNext();) { TabelaLinhaColunaAlteracao tlcaIncl = (TabelaLinhaColunaAlteracao) iter2.next(); if (!tlcaIncl.getTabelaLinhaAlteracao().getId().equals(idTLAIncl)){ continue; } for (Iterator iter3 = remocoes.iterator(); iter3.hasNext();) { TabelaLinhaColunaAlteracao tlcaRem = (TabelaLinhaColunaAlteracao) iter3.next(); if (tlcaRem.getTabelaLinhaAlteracao().getId().equals(idTLARem) && tlcaIncl.getTabelaColuna().getId().equals(tlcaRem.getTabelaColuna().getId())){ // caso a linha altera��o seja da chake prim�ria, sempre acrescentar if (tlcaIncl.getTabelaColuna().getIndicadorPrimaryKey().intValue() == new Integer("1") || !tlcaIncl.getConteudoColunaAtual().equalsIgnoreCase(tlcaRem.getConteudoColunaAnterior())){ tlcaIncl.setConteudoColunaAnterior(tlcaRem.getConteudoColunaAnterior()); AlteracaoTipo alteracaoTipo = new AlteracaoTipo(); alteracaoTipo.setId(AlteracaoTipo.ALTERACAO); alteracaoTipo.setDescricao("Altera��o"); tlcaIncl.getTabelaLinhaAlteracao().setAlteracaoTipo(alteracaoTipo); linhasJuntadasAux.add(tlcaIncl); } // para cada idem juntado, removemos os respectivos da cole��o de inclus�o e da de remo��o iter2.remove(); iter3.remove(); // como foi efetuada uma remo��o e uma inclus�o, n�o tinha como saber se os valores foram modificados // ou seja, pode acontecer de os conte�dos permanecerem o mesmo, neste caso n�o vamos exibir // esta flag 'houveAlgumaAlteracao' servir� para identificar se houve algum campo que foi modificado // e neste caso o conjunto de linhas (linha de identifica��o e linhas alteradas) ser�o // adicionadas na cole��o final de altera��es. if (!tlcaIncl.getConteudoColunaAtual().equalsIgnoreCase(tlcaRem.getConteudoColunaAnterior())){ houveAlgumaAlteracao = true; } } } } if (houveAlgumaAlteracao){ linhasJuntadas.addAll(linhasJuntadasAux); } } // estas adi��es ser�o as linhas que efetivamente foram de inclus�o, ou seja, n�o havia exclus�o associada a eles // da mesma forma, serao adicionadas as linhas de remo��o que n�o tinha inclus�es associadas. linhasJuntadas.addAll(inclusoes); linhasJuntadas.addAll(remocoes); //Ordenadando pelo Id da tabela para agrupar os itens atualizados // Collections.sort(linhasJuntadas, new Comparador()); return linhasJuntadas; } // Ordenador pelo Id da tabela para agrupar os itens atualizados // class Comparador implements Comparator { // public int compare(Object obj1, Object obj2){ // TabelaLinhaColunaAlteracao tlca1 = (TabelaLinhaColunaAlteracao) obj1; // TabelaLinhaColunaAlteracao tlca2 = (TabelaLinhaColunaAlteracao) obj2; // if (obj1 instanceof TabelaLinhaColunaAlteracao && obj2 instanceof TabelaLinhaColunaAlteracao){ // // int i2 = tlca1.getTabelaLinhaAlteracao().getId().intValue(); // int i1 = tlca2.getTabelaLinhaAlteracao().getId().intValue(); // int dif = Math.abs(i1) - Math.abs(i2); // if (dif == 0){ // // i1 = tlca1.getTabelaColuna().getIndicadorPrimaryKey().intValue(); // i2 = tlca2.getTabelaColuna().getIndicadorPrimaryKey().intValue(); // dif = Math.abs(i1) - Math.abs(i2); // if (dif == 0){ // dif = tlca1.getTabelaColuna().getDescricaoColuna().compareTo( // tlca2.getTabelaColuna().getDescricaoColuna()); // } // } // return dif; // } else { // return 0; // } // } // } }