Linha de Produto: | Datasul |
---|---|
Segmento: | Tecnologia |
Módulo: | Menu |
Função: | Pesquisa de Programas |
Ticket: | |
Requisito/Story/Issue (informe o requisito relacionado) : | DFWKFOUNDATION-1123 |
Exceções causadas ao pesquisar os seguintes exemplos com usuário configurado em inglês ou espanhol.
EXCEPTION 1:
2019-09-17 17:17:12,656 ERROR [org.hibernate.hql.PARSER] line 1:19230: unexpected token: s 2019-09-17 17:17:12,657 WARN [org.hibernate.hql.ast.HqlParser] processEqualityExpression() : No expression to process! 2019-09-17 17:17:12,657 ERROR [org.hibernate.hql.PARSER] line 1:19846: unexpected token: ',' 2019-09-17 17:17:12,657 ERROR [org.hibernate.hql.PARSER] line 1:20109: unexpected token: ',' 2019-09-17 17:17:12,658 WARN [org.hibernate.hql.ast.HqlParser] processEqualityExpression() : No expression to process! 2019-09-17 17:17:12,658 ERROR [org.hibernate.hql.PARSER] line 1:25867: unexpected token: , |
SIMULAÇÃO:
Buscar pela palavra "REPORT" ou "EPI" na barra de busca de programas.
ANÁLISE:
Problema ocorre quando um nome verbalizado possui aspas simples no seu conteúdo, causando erro SQL na cláusula IN.
Deve ser avaliada ou a substituição das aspas simples por aspas duplas (pois na base está gravado com aspas duplas) ou mudar a base de dados para não ter esse tipo de caracter no nome verbalizado
--------------------------------------------------------------------------------------
EXCEPTION 2:
2019-10-01 10:23:35,425 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/menu-html].[Jersey REST Service]] Servlet.service() for servlet Jersey REST Service threw exception org.hibernate.QueryParameterException: could not locate named parameter [logVisualizMenu] |
SIMULAÇÃO:
Buscar por qualquer letra com o usuário em inglês: "a, c, ca"
--------------------------------------------------------------------------------------
EXCEPTION 3:
2019-10-01 10:31:43,479 WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 0, SQLState: HY000 2019-10-01 10:31:43,479 ERROR [org.hibernate.util.JDBCExceptionReporter] [DataDirect][OpenEdge JDBC Driver]Software caused connection abort: recv failed. 2019-10-01 10:31:43,480 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/menu-html].[Jersey REST Service]] Servlet.service() for servlet Jersey REST Service threw exception java.sql.SQLException: [DataDirect][OpenEdge JDBC Driver]Software caused connection abort: recv failed. |
SIMULAÇÃO:
Buscar por "is, ts, ep" com o usuário em inglês.
---------------------------------------------------------------------------------------
EXCEPTION 4:
2019-10-01 10:46:24,937 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/menu-html].[Jersey REST Service]] Servlet.service() for servlet Jersey REST Service threw exception java.lang.StringIndexOutOfBoundsException: String index out of range: -1 |
SIMULAÇÃO:
Buscar por "is" com o usuário em espanhol
Das exceções listadas, apenas a de número 2 ("could not locate named parameter [logVisualizMenu]") foi simulada. Esta exceção é causada porque o hibernate espera como valor de parâmetro qualquer classe que herde da classe Object do Java, porém como era passado o valor "true", estava sendo utilizado o tipo primitivo de dados "boolean", que não herda da classe Object.
A solução encontrada foi alterar a cláusula WHERE da consulta gerada para outros idiomas, alterando o filtro do logVisualizMenu para não ser passado como parâmetro, mas sim ser utilizado um valor fixo direto no SQL. Antes, apesar de ser passado como parâmetro pro hibernate, o filtro logVisualizMenu sempre recebia "true", não variando. Isto faz com que seja desnecessário utilizá-lo como parâmetro, uma vez que sempre possuirá o mesmo valor, independente das variações da consulta.
Incluída também a remoção de caracteres especiais na listagem de literais dos programa, para evitar erros de sintaxe no SQL quando alguma tradução possuir caracteres especiais (e.g. aspas ou parênteses).
A implementação desta correção no back-end foi implementada na sub-tarefa .
Mesmo não sendo simulações das demais exceções listadas, todos os testes apresentaram a exceção "org.hibernate.exception.GenericJDBCException: could not execute query", cuja causa está na maneira em que é realizada a consulta de programas quando o usuário está em um idioma diferente do português. Para realizar o filtro, primeiro são buscadas na tabela StringExtProdut todas as traduções que possuem o termo pesquisado, gerando uma lista de traduções. Em seguida, esta lista é utilizada para compor múltiplas cláusulas IN no SQL gerado sobre a tabela de programas. Quando a lista de traduções é muito extensa, são criadas múltiplas clausulas IN de tamanho 1000 (mil) cada, separadas por OR, para montar o SQL. Se este SQL final for muito extenso, o hibernate gera a exceção de connection timed out.
Para solucionar esta exceção, seria necessário re-estruturar a maneira como é realizada a consulta de programas para usuários em outro idioma. Por outro lado, em reunião diária realizada no dia 18 de Fevereiro de 2020, foi acordado pelo time FRAMEWORK FOUNDATION, criar uma validação na tela de menu, para que seja limitada a pesquisa para no mínimo três caracteres. A justificativa para a criação desta validação foi de que, até a data desta reunião, não havia sido apontada por cliente a problemática ao pesquisar por menos de três caracteres, evidenciando o fato de que a pesquisa por menos de três caracteres não deve ser utilizada.
A implementação desta validação no front-end foi implementada na sub-tarefa .