El conector puede utilizar la API JDT para buscar elementos Java, como por ejemplo referencias de método, declaraciones de campo, 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. Los métodos de fábrica (factory) de esta clase, como por ejemplo createSearchPattern (crea un patrón de búsqueda) o createJavaSearchScope (crea un ámbito de búsqueda Java) son utilizados por el método search. Este método informa de los resultados a un IJavaSearchResultCollector que el usuario debe implementar.
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.
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 (consulte createSearchPattern(IJavaElement, int)) o a partir de una serie (consulte createSearchPattern(String, int, int, boolean).) El último método soporta caracteres comodín (i.e. '*') y puede utilizarse para ampliar los resultados de búsqueda.
Por ejemplo, la creación de un patrón de búsqueda para buscar referencias a un método determinado se realiza de la siguiente forma:
// Obtener el método IMethod method = ...; // Crear el patrón de búsqueda ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);
O la creación de 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 siguientes patrones de búsqueda están soportados:
Si está interesado en los resultados de búsqueda de un proyecto determinado o incluso de un paquete determinado, o si sabe que los resultados de búsqueda sólo pueden encontrarse en una jerarquía de un tipo determinado, puede crear el ámbito de búsqueda adecuado mediante createJavaSearchScope(IJavaElement[]) o createHierarchyScope(IType).
Por ejemplo, la creación de un ámbito de búsqueda de un paquete determinado se realiza de la siguiente forma:
// Obtener el paquete IPackageFragment pkg = ...; // Crear el ámbito de búsqueda IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
O bien, la creación de un ámbito de búsqueda en la jerarquía de un tipo determinado es:
// Obtener el tipo IType type = ...; // Crear el ámbito de búsqueda IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Finalmente, puede crear un ámbito de búsqueda en toda el área de trabajo:
// Crear el ámbito de búsqueda IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
Una vez que ha creado un patrón y un ámbito de búsqueda y ha implementado 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 búsqueda IJavaSearchScope scope = ...; // Obtener el recolector de resultados de 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 resultados de búsqueda mediante el método aboutToStart. A continuación, se informa de cada uno de los resultados de la búsqueda mediante el método accept. Finalmente, done indica que la búsqueda ha finalizado.
Los resultados de búsqueda se notifican mediante el método accept. Los párrafos que siguen detallan cada uno de los argumentos de este método.
Un resultado de búsqueda puede corresponder a un elemento Java (por ejemplo, a una declaración de tipo) o puede estar contenido en un elemento Java (por ejemplo, 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 corresponde a, o que contiene, el resultado de búsqueda. 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 tanto, si el elemento Java es un método de una unidad de compilación, el recurso es el IFile correspondiente. Si el elemento se encuentra en un archivo .jar, el recurso es el archivo .jar, si éste se encuentra en el área de trabajo. Si se trata de un archivo .jar externo, el recurso es null.
Las posiciones del código fuente son relativas a la unidad de compilación que contiene el resultado de búsqueda. Si el elemento se encuentra en un archivo .jar, las posiciones del código fuente son relativas al código fuente conectado. Son (-1, -1) si no existe ningún código fuente conectado al archivo .jar.
En la mayoría de los casos, los resultados de búsqueda son exactos, lo cual significa que el motor de búsqueda ha podido determinar que la coincidencia dada es la que se le solicitó. Sin embargo, en algunos casos el motor de búsqueda no puede hacerlo, y la coincidencia es inexacta. Algunas de las posibles razones por las que una coincidencia puede ser inexacta son: