ExMinerSOF funciona como um plug-in integrado com a IDE Eclipse. O desenvolvedor pode receber recomendações de duas maneiras: uma consulta manual pelo desenvolvedor; ou uma consulta proativa realizada pela ferramenta baseado no contexto de programação atual do desenvolvedor.
4.2.1
Consulta Manual pelo Desenvolvedor
Através da consulta manual, o desenvolvedor pode informar um termo específico para a pesquisa. É possível pesquisar por uma sequência de nomes de métodos ou pelo nome de uma exceção, podendo informar ambos ao mesmo tempo. Em especial, o método deve ser identificado pelo seu nome totalmente qualificado (do inglês: fully qualified name); ou seja, o desenvolvedor deve informar não apenas o nome do método, como também o caminho e nome da classe. Por exemplo, ao invés de informar apenas "contains", o desenvolvedor deve informar de maneira mais específica o caminho do método, como "org.fest.assertions.CharArrayAssert. contains". Ainda é possível, indicar mais de um método, separado-os por vírgula. Dessa forma, a busca se restringe ao contexto de interesse do desenvolvedor.
Com base nos termos informados, a ferramenta irá checar se eles estão relacionados a alguma stack trace anteriormente minerada a partir do StackOverflow. Em outras palavras, é verificado na base de stack traces se o método está relacionado a alguma exceção com nome semelhante ao informado, através dos frames que compõem as stacks. Tendo algum resultado retornado, é apresentado uma lista de stack traces e informações adicionais sobre a postagem relacionada (como as tags, data de criação, etc). A visualização dessas informações será apresentada na seção 4.3.1.
4.2.2
Recomendação Proativa por Chamada de Método
A ferramenta também dispõe de uma abordagem proativa, que tem o objetivo prin- cipal de tornar a própria ferramenta responsável por alertar o desenvolvedor sobre as potenciais ameaças dos métodos de APIs que estejam sendo usados em seu código. Este recurso está presente tanto para chamadas de métodos específicos, quanto para uma classe como um todo, considerando que em uma classe possam existir várias chamadas de mé- todos. Nesta seção trataremos do recurso para uma chamada de método em específico. O recurso a nível de classe será explicado na seção a seguir.
Para ativar o recurso proativo em uma chamada de método, o desenvolvedor pode utilizar o atalho "Ctrl+Space" em seu código fonte. A ferramenta, então, descobre o termo que está em foco e utiliza a informação sobre o contexto da classe do desenvolvedor para montar o nome totalmente qualificado do método que será pesquisado.
Por exemplo, pelo código fonte da Figura 14, caso o desenvolvedor solicite a ajuda da ferramenta com o cursor do editor na posição ilustrada, o mecanismo de recomendação identificaria o termo "add". Segundo o sistema de recomendações do Java, dentro do con- texto do desenvolvedor, haveriam quatro métodos qualificados com este nome ou parte dele. Devido a isto, a ferramenta leva em consideração a lista de nomes de métodos quali- ficados de acordo com o termo "add" da classe "ArrayList"; que são: add e addAll. Caso o termo tiver exatamente o mesmo nome de algum método contido nessa lista de métodos re- comendadas pelo Java, apenas ele será considerado na busca. Assim, a ferramenta buscará a ocorrência de stack traces vinculadas apenas ao método: "java.util.ArrayList.add". Este recurso é usado para tornar a pesquisa de stack traces mais eficiente, trazendo resultados mais precisos para a necessidade do desenvolvedor.
Figura 14: Trecho de código para ilustrar a atuação do mecanismo de recomendação da ferramenta.
Em relação as assinaturas de métodos, nas stack traces não há como identificar méto- dos com mesmo nome que tenham quantidade de parâmetros diferentes. Por este motivo, métodos com essas características são considerados iguais no momento da construção dos termos de busca. O método "java.util.ArrayList.add", anteriormente citado, é um exem- plo. A classe "java.util.ArrayList" possui dois métodos com o nome "add", mas com parâmetros diferentes. A nível de stack trace não há como diferenciar esses métodos, por isso o mecanismo de recomendação não faz distinção entre eles.
Com base na lista de nomes de métodos construída seguindo a heurística explicada anteriormente, é feito a pesquisa pelas ocorrências desses métodos na base de stack traces. Como resultado, a ferramenta irá mostrar a lista de exceções que podem fluir através dos métodos pesquisados (interface excepcional descoberta), como também o número de postagens nas quais cada par de método-exceção foi mencionado. A forma com que essas informações são exibidas será explicado na seção 4.3.2.
4.2.3
Recomendação Proativa por Classe Importada
Outra abordagem proativa permite ao desenvolvedor analisar uma classe de sua apli- cação por completo. Nessa abordagem, a ferramenta identifica todas as chamadas de métodos e declarações de "import" existentes na classe selecionada pelo desenvolvedor.
A partir de cada chamada de método e utilizando um parser de árvore sintática abstrata, é recuperado o seu nome totalmente qualificado. Para cada nome de método é realizada a consulta pela sua interface excepcional descoberta, ou seja, a lista de exceções que podem fluir a partir de cada método. A recomendação é exibida ao desenvolvedor em forma de marcadores no código fonte. Eles sinalizam a linha correspondente a chamada do método e informam sobre as exceções que fluem a partir dele, assim como a quantidade de ocorrências no SOF para cada uma delas, com base no banco de stack traces.
De forma semelhante, para as declarações de classes, iniciadas pelo termo "import", é feito a identificação do nome da classe declarada na sentença e a partir dela é con- sultado a quantidade de exceções diferentes que possuem ao menos uma ocorrência no SOF. Por exemplo, caso no código fonte exista alguma chamada à métodos da classe "java.util.ArrayList" e, por isso, tiver declarado a importação desta classe, a ferramenta irá identifica-la e irá consultar as exceções que estiverem relacionadas a algum método contidos no caminho da classe que foi declarada. Esse entendimento ficará mais claro na seção 4.3.2.