Ajankohtaista

Isompi ilo irti Mule-ympäristöstä xQueryn avulla!

Kirjoittanut Alfame | 08.06.2018

XML:n muokkaaminen xQuery-kielellä

Edellisessä työpaikassani tutustuin XML:n muokkaamiseen muodosta toiseen xQuery-kieltä käyttäen. SQL-kieltä muistuttava syntaksi tuntui omaan käteen paljon sopivammalta kuin XSLT, jota voi myös käyttää XML:n muokkaamiseen.

Alfamella olen päässyt tutustumaan Mule ESB Community Editioniin, jolla voisi myös muokata sanomaa xQuery-muunnoksella. Ongelmaksi kuitenkin muodostui Mule ESB:n käyttämä alunperin XML kyselyihin suunnitellun kielen versio 3.0, joka ei toiminut kovin hyvin Alfamen asiakkaiden usein käyttämän JSON-notaation kanssa.

Sen sijaan Mule ESB:n oma kyselykieli DataWeave toimii hienosti käännöksissä XML:sta JSON-notaatioon ja toisinpäin, mutta on valitettavasti käytettävissä vain maksullisessa Mule ESB Enterprise Editionissa. Uudempi versio 3.1 xQuery kielestä esittelee uudet tietotyypit mapin ja arrayn sekä mahdollisuuden serialisoida ja deserialisoida niitä JSON-notaation välillä.

Mule ESB:n uusin versio käyttää xQuery-moottorinaan Saxon xQuery -prosessoria, jonka versio tukee xQuery kielen versiota 3.0. Saxon xQuery prosessorin 9.8 ja uudemmat versiot tukevat myös xQuery kielen versiota 3.1, jolla voi muokata sanomaa XML:n ja JSON-notaation välillä.

Mule ESB:n käyttämän Saxon prosessorin version ja uudempien Saxon prosessorin versioiden rajapinta XQJ, eli xQuery API for Java, on pysynyt samana ja Mule ESB:n korvaaminen uudemmalla versiolla on hyvin suoraviivaista. Esimerkiksi standalone-asennuksessa voi korvata Mule runtimen käyttämät Saxon prosessorin jar-tiedostot sopivilla versioilla. Tämän jälkeen Mule ESB:ssa voi käyttää xQuery kielen versiota 3.1 sanomien muokkaamiseen.

Rajapinnat mahdollistavat prosessorin vaihdon

XQJ-rajapinta on yleisesti käytössä oleva ohjelmointirajapinta xQuery-prosessoreille ja sen tarkoitus on mahdollistaa prosessorin vaihtaminen ilman, että olemassa olevaan koodiin pitää koskea. Tunnetun rajapinnan käyttäminen on yleensä viisasta, mutta XQJ-rajapinnan tapauksessa rajapinta on ollut pitkään ilman päivityksiä ja tukee ainoastaan xQueryn versiota 1.0, joka on vuodelta 2010. Tämän rajapinnan käyttäminen tarkoittaa, että Mule ESB ei pysty käyttämään xQuery-version 3.1 tuomia uusia map ja array -tietotyyppejä Saxon xQuery -prosessorin kanssa. Prosessorin sisällä uusia tietotyyppejä voi toki hyödyntää, mutta se jättää uuden xQuery-version hyödyn vähäiseksi.

Saxon xQuery -prosessoria voi käyttää myös Saxonin oman S9-rajapinnan kautta ja tämä Saxonin oma rajapinta tukee myös xQuery 3.1 version täysimittaiseen hyödyntämiseen tarvittavia uusia tietotyyppejä. Rajapinnan vaihtaminen vaatii Mule ESB:n xQuery-muokkauksiin käytettävän ohjelmakoodin uudelleenkirjoittamisen käyttäen paremmin toimivaa S9-rajapintaa. Tämän koodin uudelleenkirjoittaminen on suhteellisen isotöinen ratkaisu, sillä Saxon prosessorin sisäisesti ja S9-rajapinnassa käyttämä XML-puumallit Tiny Tree ja Linked Tree eivät ole samoja kuin Mule ESB:n käyttämää XML-puumalli JDOM.

xQuery tuo Mule ESB Community Editionin lähemmäs Enterprise Editionin ominaisuuksia

Mule ESB on tipahtanut vanhenevan rajapinnan ansaan ja ei voi hyödyntää xQueryn uusien versioiden mahdollisuuksia. En myöskään usko, että Mulesoftilla on kiinnostusta panostaa xQuery muunnoksiin, sillä Mulesoft käyttää XML:n ja JSON-notaatioiden välistä muokkausmahdollisuutta yhtenä perusteluna siirtyä käyttämään maksullista Mule ESB Enterprise Editionia.

Minusta on kuitenkin parempi käyttää xQuery-kieltä, jota voidaan ajaa millä tahansa xQuery prosessorilla kuin Mulesoftin yksin käyttämää DataWeavea. Meillä Alfamella on jo ensimmäiset kokeilut tehty S9-rajapintaa hyödyntävällä Mule ESB:n xQuery-toiminnallisuudella ja uskomme, että se on oikea tapa.