A Java keresőmotor használata

A bedolgozó használhatja a JDT API felületet, hogy a munkaterületen található Java projektekben olyan Java elemeket keressen, mint metódus hivatkozások, mező deklarációk, egy felület megvalósítóit, stb.

A Java keresés belépési pontja a SearchEngine osztály. Kereshet bizonyos mintákat Java elemekben és szűkíteti a keresést bizonyos elemekre.  Kereséséi mintákat a createPattern metódussal hozhat létre.  Mintát a createJavaSearchScope használatával szűkíthet.  A minta és a hatókör meghatározása után a search metódussal lehet az eredményeket összegyűjteni.

A keresés eredményéről a SearchRequestor kap jelentést, ezért ki kell terjeszteni az eredmények eléréséhez.

Előkészületek a kereséshez

A keresési művelet egyaránt használ egy mintát a keresés természetének leírásához és egy hatókört a vizsgálat tartományának szűkítésére.

Java keresési minta létrehozása

A keresési minta meghatározza a keresés módszerét. Keresési minta létrehozható Java elemből (lásd createPatternPattern(IJavaElement, int)) vagy karaktersorozatból (lásd createPattern(String, int, int, int).) Az utóbbi módszer támogatja a helyettesítő karaktereket (pl. '*') és a keresés eredményének szélesítésére használható.

Például adott metódus hivatkozásainak kereséséhez a következő módon lehet keresési mintát létrehozni:

    // Metódus megadása
    IMethod method = ...;
    
    // Keresési minta létrehozása
    SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);

Vagy keresési minta létrehozása minden olyan típusdeklarációra, ami az "Obj" karaktersorral kezdődik:

    // Keresési minta létrehozása
    SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);

Az alábbiakban a támogatott keresési minták láthatók:

Java keresés hatókör létrehozása

Ha csak adott projektben vagy csomagban találhaó keresési eredmények érdeklik, vagy ha tudja, hogy a keresési eredmények csak egy adott típus hierarchiájában lehetnek, akkor létrehozhatja a megfelelő keresési hatókört a createJavaSearchScope(IJavaElement[]) vagy a createHierarchyScope(IType) használatával.

Például egy adott csomagra a következőképpen készíthet keresési hatókört:

    // Csomag megadása
    IPackageFragment pkg = ...;

    // Keresési hatókör létrehozása
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});

Vagy egy adott típus hierarchiájára a következőképpen készíthet keresési hatókört:

    // Típus megadása
    IType type = ...;

    // Keresési hatókör létrehozása
    IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);

Végül a teljes munkaterületre is készíthet egy keresési hatókört:

    // Keresési hatókör létrehozása
    IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

Keresés

Ha a keresési minta és a keresési hatókör elkészült, valamint a SearchRequestor ki lett terjesztve, akkor a következőképpen indíthat egy keresési lekérdezést:

    // Keresési minta megadása
    SearchPattern pattern = ...;

    // Keresési hatókör megadása
    IJavaSearchScope scope = ...;

    // Keresési kérelmező megadása
    SearchRequestor requestor = ...;

    // Keresés
    SearchEngine searchEngine = new SearchEngine();
    searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);

A keresés elindulásáról a keresés kérelmező értesítést kap a beginReporting metódus használatával.  Majd a rendszer minden keresési eredményt jelent az acceptSearchMatch metódus használatával.Végezetül az endReporting mutatja, hogy a keresés véget ért.

Keresési eredmények összegyűjtése

A keresés eredményeiről jelentés az acceptSearchMatch használatával készül. Az alábbi bekezdések részletezik a keresési találatot.

Erőforrások és Java elemek

A keresési eredmény kapcsolódhat egy Java elemhez (pl. egy típus deklarációhoz), vagy egy Java elem tartalmazhatja a keresési eredményt (pl. hivatkozás egy típusra egy metódusban). A keresőmotor mindig megpróbálja megtalálni a legbelső Java elemet, amely kapcsolódik a keresési eredményhez, vagy tartalmazza azt. Például, ha a rendszer hivatkozásokat keres egy metódusban, akkor ilyen hivatkozást találhat egy inicializálóban is. Az inicializáló, amely tartalmazza a metódus hivatkozást, lesz a keresési eredmény egy eleme.

A keresőmotor megpróbálja megkeresni a Java elemet tartalmazó erőforrást is. Tehát, ha a Java elem egy fordítási egység metódusa, akkor a vonatkozó IFile lesz az erőforrás. Ha az elem egy .jar fájlban található, akkor .jar fájl az erőforrás, ha a .jar fájl a munkaterületen van. Ha ez egy külső .jar fájl, akkor az erőforrás null.

Forrás pozíciók

A forrás pozíciók a keresési eredményt tartalmazó fordítási egységhez relatívan vannak megadva. Ha a keresési eredmény egy .jar fájlban található, akkor a forrás pozíciók relatívak a mellékelt forráshoz. A pozíciók (-1, -1), ha a .jar fájlhoz nincs forrás mellékelve.

Pontos keresési eredmények a pontatlannal szemben

A legtöbb esetben a keresési eredmény pontos, ami azt jelenti, hogy a keresőmotor képes volt meghatározni, hogy a találat megegyezik a keresett elemekkel. Ennek ellenére bizonyos esetekben a keresőmotor nem képes megtalálni a keresett elemet, ilyenkor a keresés pontatlan. Néhány ok, amiért a keresés pontatlan lehet: