Utilizar el motor de búsqueda Java

El conector puede utilizar la API de JDT para buscar elementos Java (como las referencias de método, las declaraciones de campo, las implementadores de una interfaz, etc.) en los proyectos Java del área de trabajo.

El punto de entrada de la búsqueda Java es la clase SearchEngine. Podrá buscar patrones concretos dentro de un elemento Java y fijar el ámbito de la búsqueda en elementos específicos. Los patrones de búsqueda se crean mediante el método createSearchPattern. El ámbito del patrón se fija con el método createJavaSearchScope. Una vez definidos un patrón y un ámbito, se utiliza el método search para obtener los resultados.

Los resultados de la búsqueda se notifican en una interfaz IJavaSearchResultCollector, que tendrá que implementar para acceder a los resultados.

Preparar la búsqueda

Una operación de búsqueda utilizará tanto un patrón para describir la naturaleza de la búsqueda como un ámbito para restringir el rango de la investigación.

Crear un patrón de búsqueda Java

Un patrón de búsqueda define cómo se encuentran los resultados de la búsqueda. Puede crear un patrón de búsqueda a partir de un elemento Java (vea createSearchPattern(IJavaElement, int)) o a partir de una serie (vea createSearchPattern(String, int, int, boolean)). El último método soporta caracteres comodín (es decir, '*') y permite ampliar los resultados de la búsqueda.

Por ejemplo, el siguiente código crea un patrón de búsqueda para buscar referencias a un método dado:

    // Obtener el método
    IMethod method = ...;
    
    // Crear el patrón de búsqueda
    ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);

El siguiente código crea un patrón de búsqueda para buscar declaraciones de todos los tipos que empiezan por "Obj":

    // Crear el patrón de búsqueda
    ISearchPattern pattern = SearchEngine.createSearchPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);

Los patrones de búsqueda soportados son los siguientes:

Crear un ámbito de búsqueda Java

Si le interesa obtener los resultados de la búsqueda en un proyecto dado o incluso en un paquete dado, o si sabe que los resultados de la búsqueda solo pueden estar en una jerarquía de un tipo dado, puede crear el ámbito de búsqueda adecuado mediante createJavaSearchScope(IJavaElement[]) o createHierarchyScope(IType).

Por ejemplo, el siguiente código crea un ámbito de búsqueda en un paquete dado:

    // Obtener el paquete
    IPackageFragment pkg = ...;

    // Crear el ámbito de la búsqueda
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});

O bien, para crear un ámbito de búsqueda en la jerarquía de un tipo dado, utilizaría el siguiente código:

    // Obtener el tipo
    IType type = ...;

    // Crear el ámbito de la búsqueda
    IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);

Por último, puede crear un ámbito de búsqueda en toda el área de trabajo:

    // Crear el ámbito de la búsqueda
    IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

Buscar

Una vez que ha creado un patrón y un ámbito para la búsqueda y ha implementado la interfaz IJavaSearchResultCollector, puede iniciar una consulta de búsqueda de la forma siguiente:

    // Obtener el patrón de búsqueda
    ISearchPattern pattern = ...;

    // Obtener el ámbito de la búsqueda
    IJavaSearchScope scope = ...;

    // Obtener el recolector de resultados de la búsqueda
    IJavaSearchResultCollector collector = ...;

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

Se envía una notificación de que se inicia la búsqueda al recolector de los resultados de la búsqueda mediante el método aboutToStart. Luego se informa de cada uno de los resultados de la búsqueda mediante el método accept. Por último, se obtiene done para indicar que la búsqueda ha finalizado.

Reunir los resultados de la búsqueda

Los resultados de la búsqueda se notifican mediante el método accept. Los párrafos que siguen detallan cada uno de los argumentos de este método.

Recursos y elementos Java

Un resultado de la búsqueda se puede corresponder con un elemento Java (por ejemplo, con una declaración de tipo) o puede estar contenido en un elemento Java (por ejemplo, en una referencia a un tipo dentro de un método). El motor de búsqueda siempre trata de encontrar el elemento Java más interno que se corresponde con el resultado de la búsqueda o que lo contiene. Por ejemplo, una búsqueda de declaraciones de tipo por nombre puede encontrar una declaración de tipo local. Puesto que el modelo Java no representa tipos locales, el método que contiene esta declaración de tipo local se entrega al recolector de resultados.

El motor de búsqueda también intenta entregar el recurso que contiene el elemento Java al recolector de resultados. Por lo tanto, si el elemento Java es un método de una unidad de compilación, el recurso es la correspondiente interfaz IFile. Si el elemento está en un archivo .jar, el recurso es el archivo .jar, si dicho archivo .jar está en el área de trabajo. Si es un archivo .jar externo, el recurso será null.

Posiciones del fuente

Las posiciones del fuente son relativas a la unidad de compilación que contiene el resultado de la búsqueda. Si el resultado de la búsqueda está en un archivo .jar, las posiciones del fuente son relativas al fuente conectado. Son (-1, -1) si no existe ningún fuente conectado al archivo .jar.

Resultados de la búsqueda exactos e inexactos

En la mayoría de los casos, los resultados de la búsqueda son exactos, lo cual significa que el motor de búsqueda ha podido determinar que la coincidencia dada es la que se solicitó. Sin embargo, en algunos casos el motor de búsqueda no puede hacerlo así y se devuelve una coincidencia inexacta. Algunas de las posibles razones por las que una coincidencia puede ser inexacta son:

Copyright IBM Corporation y otras empresas 2000, 2003. Reservados todos los derechos.