XPath alapú szabályokat legegyszerűbben a PMD Rule Designer segítségével készíthetünk, amivel a célunk az AST megfelelő csomópontjaira illeszkedő kifejezés létrehozása az adott szabályra vonatkozólag. Mielőtt elkezdenénk a PMD-s kódellenőrző kiegészítőket fejleszteni, érdemes egy kicsit felfrissíteni az XPath tudásunkat.
Az XPath kifejezések lehetőséget adnak arra, hogy bizonyos feltételek mentén kiválasszunk egy csomópontot vagy csomópont halmazt az AST-n. A fenti ábrán látható mintakódot ill. AST-t felhasználva nézzük meg a leggyakrabban használt XPath kifejezéseket.
Hivatkozás a gyerek csomópontokra
A "/" segítségével az aktuális csomópont gyerekét tudjuk elérni, ami alapesetben a gyökér csomópont. Az alábbi kifejezéssel a gyökér node-tól kezdődően eljuthatunk a ResultType node-ig:/TypeDeclaration/ClassOrInterfaceDeclaration/ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration/ResultType
Hivatkozás a leszármazott csomópontokra
A "//" operátorral az aktuális node leszármazottaira vonatkozó illeszkedést fogalmazhatunk meg. Példaként az előző kifejezés helyett használhattuk volna a //ResultType kifejezést is, mivel a mintakódot tekintve ugyanarra a node-ra illeszkednek.Attribútumok és feltételes szerkezetek
A "@" segítségével egy adott csomópont valamelyik attribútumára hivatkozhatunk. Érdemes megjegyezni, hogy a PMD által felépített AST fában az elem nevét mindig a @Image property-vel érhetjük el. A //Literal[@Image='"hello world"'] kifejezés a mintakód AST-jának a legutolsó csomópontjára fog illeszkedni ahol is "[]" jelek között a csomópont nevére vonatkozó feltételt adtunk meg.Az XPath beépített függvényeinek használata
Az XPath kifejezések használata során igénybe vehetjük a beépített függvényeket is. Példaként a contains() ill. a starts-with() függvényeket használhatjuk ahhoz, hogy kiválasszuk a minta AST fa legutolsó csomópontját: //Literal[contains(@Image,'hello')] ill. //Literal[starts-with(@Image,'"hel')] ."Wild card"-ot használó kifejezések
Egy adott helyen a "*" karakter bármilyen node-ot reprezentálhat. A //ClassOrInterfaceBodyDeclaration/*/ResultType kifejezés minden ResultType típusú node-ra illeszkedni fog, aminek a nagyszülője ClassOrInterfaceBodyDeclaration típusú.Az "XPath Axis"-t használó kifejezések
Az Xpath Axis lehetőséget ad arra, hogy az aktuális csomópont-hoz viszonyítva a rokonsági fok alapján lekérjünk a kívánt node-ok halmazát. A //Arguments/descendant::PrimaryPrefix kifejezéssel minden olyan PrimaryPrefix csomópontot visszakapunk, amelyek egy Arguments típusú csomópont leszármazottai. Összehasonlításként ugyanez a kifejezés a "*" karakterrel megfogalmazva a //Arguments/*/*/*/PrimaryPrefix kifejezés lett volna.Az érdeklődők számára a további XPath lehetőségekről a w3schools.com tutorial-t ajánlanám. A folytatásban pedig néhány gyakorlati példát fogok mutatni az XPath alapú plugin fejlesztéshez.
Nincsenek megjegyzések:
Megjegyzés küldése
Megjegyzés: Megjegyzéseket csak a blog tagjai írhatnak a blogba.