Utilizando o Mecanismo de Pesquisa Java

Seu plug-in pode utilizar a API do JDT para pesquisar projetos Java na área de trabalho de elementos Java, como referências de métodos, declarações de campo, implementadores de uma interface, etc.

O ponto de entrada da pesquisa Java é a classe SearchEngine. Você pode pesquisar determinados padrões em um elemento Java e criar um escopo de pesquisa para elementos específicos.  Os padrões de pesquisa podem ser criados utilizandocreateSearchPattern.  O escopo de um padrão é criado utilizandocreateJavaSearchScope.  Depois de definidos o padrão e o escopo, o métodosearch é utilizado para coletar os resultados.

Os resultados da pesquisa são relatados a um IJavaSearchResultCollector,que você deve implementar para acessar os resultados.

Preparando a Pesquisa

Uma operação de pesquisa utilizará um padrão para descrever a natureza da pesquisa e um escopo para restringir a faixa de investigação.

Criando um Padrão de Pesquisa Java

Um padrão de pesquisa define como os resultados da pesquisa são encontrados. Você pode criar um padrão de pesquisa a partir de um elemento Java (consulte createSearchPattern(IJavaElement, int)) ou a partir de uma cadeia (consulte createSearchPattern(String, int, int, boolean).) O último método suporta caracteres curinga (por ex., '*') e pode ser utilizado para ampliar os resultados da pesquisa.

Por exemplo, a criação de um padrão de pesquisa para pesquisar referências a um determinado método é feita da seguinte forma:

    // Obter o método
    IMethod method = ...;
    
    // Criar o padrão de pesquisa
    ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);

Ou a criação de um padrão de pesquisa para pesquisar declarações de todos os tipos que comecem com "Obj":

    // Criar o padrão de pesquisa
    ISearchPattern pattern = SearchEngine.createSearchPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);

Os seguintes padrões de pesquisa são suportados:

Criando um Escopo de Pesquisa Java

Se você estiver interessado nos resultados de pesquisa de um determinado projeto ou até mesmo de um determinado pacote, ou se souber que os resultados da pesquisa só podem estar em uma hierarquia de um determinado tipo, poderá criar o escopo de pesquisa apropriado utilizando createJavaSearchScope(IJavaElement[]) ou createHierarchyScope(IType).

Por exemplo, a criação de um escopo de pesquisa em um determinado pacote é feita da seguinte forma:

    // Obter o pacote
    IPackageFragment pkg = ...;

    // Criar o escopo de pesquisa
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});

Ou a criação de um escopo de pesquisa na hierarquia de um determinado tipo:

    // Obter o tipo
    IType type = ...;

    // Criar o escopo de pesquisa
    IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);

Finalmente, você pode criar um escopo de pesquisa em toda a área de trabalho:

    // Criar o escopo de pesquisa
    IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

Pesquisando

Depois de ter criado um padrão de pesquisa e um escopo de pesquisa e de ter implementado IJavaSearchResultCollector, será possível iniciar uma consulta de pesquisa como a seguir:

    // Obter o padrão de pesquisa
    ISearchPattern pattern = ...;

    // Obter o escopo de pesquisa
    IJavaSearchScope scope = ...;

    // Obter o coletor de resultados da pesquisa
    IJavaSearchResultCollector collector = ...;

    // Pesquisar
    SearchEngine searchEngine = new SearchEngine();
    searchEngine.search(ResourcesPlugin.getWorkspace(), pattern, scope, collector);

Uma notificação do início da pesquisa é enviada ao coletor de resultados da pesquisa utilizando o método aboutToStart.  Em seguida, cada resultado da pesquisa é relatado com o método accept. Finalmente, done indica que a pesquisa terminou.

Coletando Resultados da Pesquisa

Os resultados da pesquisa são relatados com o método accept. Os parágrafos a seguir detalham cada argumento para este método.

Recursos e Elementos Java

Um resultado de pesquisa pode corresponder a um elemento Java (por ex., uma declaração de tipo) ou pode estar contido em um elemento Java (por ex., uma referência a um tipo dentro de um método). O mecanismo de pesquisa sempre tenta localizar o elemento Java mais interno que corresponder ou contiver o resultado da pesquisa. Por exemplo, a pesquisa de declarações de tipo pelo nome pode encontrar uma declaração de tipo local. Como o gabarito Java não representa tipos locais, o método que contém esta declaração de tipo local é fornecido ao coletor de resultados.

O mecanismo de pesquisa também tenta fornecer o recurso que contém o elemento Java para o coletor de resultados. Portanto, se o elemento Java for um método em uma unidade de compilação, o recurso será o IFile correspondente. Se o elemento estiver contido em um arquivo .jar, o recurso será o arquivo .jar, se este arquivo .jar estiver na área de trabalho. Se for um arquivo .jar externo, o recurso será null.

Posições de Origem

As posições de origem são fornecidas em relação à unidade de compilação que contém o resultado da pesquisa. Se o resultado da pesquisa estiver contido em um arquivo .jar, as posições de origem serão relativas à origem conectada. Elas serão (-1, -1) se não houver origem conectada ao arquivo .jar.

Resultados Exatos e Inexatos da Pesquisa

Na maioria dos casos, os resultados da pesquisa são precisos, significando que o mecanismo de pesquisa conseguiu determinar que a correspondência fornecida era o que se esperava. No entanto, em alguns casos o mecanismo não é eficiente e a correspondência é inexata. Alguns motivos possíveis pelos quais uma correspondência seria inexata são:

Copyright IBM Corporation e outros 2000, 2003. Todos os Direitos Reservados.