Yleistä

Jackrabbit on Java-pohjainen avoimen lähdekoodin toteutus JSR 170 -määrityksen mukaisesta sisältövarastosta (Java Content Repository, JCR). Jackrabbit tarjoaa mm. sisältövarastoon tallennettujen tietojen hakuun, versiointiin ja transaktioiden hallintaan liittyviä palveluita. Jackrabbit pyrkii yhdistelemään sekä laajentamaan niin tietokantoihin kuin tiedostojärjestelmäänkin liittyviä toiminnallisuuksia. Jackrabbitin ylläpidosta ja kehityksestä vastaa Apache Software Foundation.

JSR 170 -määritys kuvaa standardin tavan käyttää erilaisia sisältövarastoja ja määrittelee mm. sisältövaraston kutsumisen vakiomuotoisen Java-rajapinnan kautta. Määritys ei ole millään tavalla sidottu tiettyyn toteutusarkkitehtuuriin, vaan määrityksen toteuttavan sisältövaraston taustalla oleva tallennusalusta voi olla vaikkapa tiedostojärjestelmä, XML-pohjainen taustajärjestelmä tai relaatiotietokanta. Vakiomuotoinen rajapinta mahdollistaa järjestelmän käyttämän sisältövaraston vaivattoman vaihdon toiseen saman määrityksen toteuttavaan sisältövarastoon.

Tietomalli

Jackrabbitin tietomalli koostuu työtiloista (workspace), alkioista (item), solmuista (node) ja ominaisuuksista (property), jotka yhdessä muodostavat hierarkisen kokonaisuuden. Kyselyiden teko on mahdollista SQL-, SQL2- ja XPath-kielten avulla. Kyselyiden teossa käytettävien SQL- ja SQL2-kielten syntaksit muistuttavat läheisesti relaatiotietokannoissa käytettyä SQL-kyselykieltä, mutta tosiasiassa kyse on kuitenkin täysin eri kyselykielistä. Tietomalli on esitetty kuvassa 1.

Kuva 1. Jackrabbitin tietomalli.

  • Työtila (workspace) - sisältövarasto sisältää yhden tai useamman työtilan. Jokainen työtila koostuu alkioista muodostuvasta puurakenteesta ja sisältää oman hakuindeksinsä.
  • Alkio (item) - työtilat koostuvat alkioista, jotka voivat olla joko ominaisuuksia tai solmuja.
  • Solmu (node) - solmulla voi olla nolla tai useampia lapsia (child node) tai siihen voidaan liittää nolla tai useampia ominaisuuksia. Jokaisella solmulla on oltava yksi ensisijainen solmutyyppi (primary node type), joka määrittää solmun piirteet, kuten esimerkiksi siihen liittyvät ominaisuudet ja lapset . Lisäksi solmulla voi olla yksi tai useampi sekatyyppi (mixin type), joiden avulla voidaan määritellä lisäpiirteitä, kuten esimerkiksi versiointi, lukittavuus ja viitattavuus.
  • Ominaisuus (property) - sisältää varsinaisen sisällön. Ominaisuudella on arvon lisäksi mm. nimi, tyyppi, oletusarvo sekä ominaisuuden pakollisuuden määrittävä asetus. Ominaisuuksilla on yksi vanhempi, eikä niillä voi olla lapsia.

Ominaisuudet sisältävät varsinaisen sisällön lisäksi myös muita tietoja. Jokaisella ominaisuudella on nimi ja tyyppi, joka ilmaisee ominaisuuden sisältämän sisällön tyypin. Mahdollisisa tyyppejä ovat esimerkiksi merkkijono, binääri, kokonaisluku, viittaus tai määrittelemätön. Tyypin ollessa määrittelemätön ei sisällön tyypillä ole väliä. Viittaus tarkoittaa puolestaan relaatiotietokannoissa käytettävää vierasavainta vastaavaa viittausta toiseen alkioon. Binääri-tyyppi taas mahdollistaa binäärimuotoisen datan, kuten esimerkiksi tiedostojen tallentamisen. Lisäksi ominaisuuden arvolle on mahdollistaa asettaa rajoitteita, joiden sisällä arvon on oltava. Ominaisuus voidaan myös määritellä pakolliseksi, jolloin sen puuttuminen aiheuttaa sen sisältävän solmun tallennuksen epäonnistumisen. Lisäksi ominaisuus voi sisältää yhden arvon sijasta myös useampia arvoja eli käytännössä taulukollisen arvoja.

Solmutyyppien avulla voidaan määritellä sisältövarastoa käyttävän sovelluksen tarpeita vastaavat tietomallit, joita Jackrabbit tietovarastotasolla käyttää. Tyypit jakautuvat kahteen kategoriaan: ensisijaisiin ja sekatyyppeihin. Jokaiselle solmulle annetaan ensisijainen solmutyyppi solmun luomisen yhteydessä, jonka lisäksi solmulle voidaan lisätä sekatyyppejä missä tahansa sen elinkaaren vaiheessa. Ensisijainen solmutyyppi määrittää solmun piirteet eli sallitut ja vaaditut lapsisolmut ja ominaisuudet. Sekatyypit puolestaan määrittelevät solmuun liittyviä lisäpiirteitä, jotka voivat olla ominaisuuksia tai lapsisolmuja. Lisäpiirteet voivat olla yleisiä tietovarastotason ominaisuuksia, kuten esimerkiski versiointiin ja lukitsemiseen liittyvät ominaisuudet, tai sisältövarastoon integroidun sovelluksen toimintaan liittyviä ominaisuuksia.

Molemmat solmutyypit tukevat periytymistä, jonka avulla niistä voidaan rakentaa monitasoisia hierarkioita. Jokaisen ensisijaisen solmutyypin täytyy periytyä jostakin jo olemassa olevasta ensisijaisesta solmutyypistä. Tyyppihierarkian juurena toimii Jackrabbitiin sisäänrakennettu nt:base-solmutyyppi. Sekatyyppien ei sen sijaan tarvitse välttämättä olla toisen tyypin alityyppejä. Jackarabbit tukee myös moniperintää, jolloin yksittäinen tyyppi voi periä useita muita tyyppejä. Kumpaankiin kategoriaan kuuluvien uusien tyyppien luominen on mahdollista. Solmujen, ominaisuuksien ja tyyppien nimiin sisällytetään yleensä käytettävä nimiavaruus, jotta eri lähteistä tulevien tietojen kanssa ei pääse syntymään päällekäisyyksiä.

Solmutyypit on mahdollista suunnitella siten, että niiden määrittelemät piirteet vastaavat sisältövarastoon integroidun sovelluksen käyttämiä tietomalleja. Ihmisten yhteystietoja käsittelevässä sovelluksessa ensijaisena solmutyyppinä voisi esimerkiksi olla myapp:Contact, joka määrittelisi pakolliset myapp:givenName ja myapp:familyName -ominaisuudet. Lisäksi voitaisiin määritellä esimerkiksi myapp:Emailable -sekatyyppi, joka lisäisi myapp:emailAddress -ominaisuuden solmuun. Vastaavassa relaatiotietokannassa olisi Contact-taulu, joka sisältäisi givenName-, familyName- ja emailAddress-sarakkeet. Toisaalta samat tiedot voitasiin tallentaa myös Jackrabbitin mukana tulevia ensisijaisija solmutyyppejä käyttämällä, jolloin tietojen käsittely olisi mahdollista millä tahansa JSR 170 -rajapintaa käyttävällä sovelluksella. Lisäksi myös tallennettavan tiedon rakenne olisi tällöin vapaampi.

Suhde relaatiokantoihin

Jackrabbit voi käyttää relaatiotietokantaa sisältämiensä tietojen tallentamiseen, jonka lisäksi myös kyselyjen tekeminen on mahdollista SQL-kielen syntaksia läheisesti muistuttavien kyselykielten avulla. Tästä huolimatta Jackrabbit on kuitenkin lähempänä NoSQL-tietokantaa tai avain-arvo-varastoa kuin perinteistä relaatiotietokantaa. Käytännössä Jackrabbitilla ei siis ole paljonkaan yhteistä relaatiotietokantojen kanssa.

Käytettäessä relaatiotietokantaa Jackrabbitin tallennusalustana Jackrabbit tallentaa käsittelemänsä tiedot sellaisessa muodossa, että ne eivät ole ymmärrettävissä tai haettavissa suoraan tietokantatasolla. Tiedot ovat siis läpinäkymättömiä tietokantajärjestelmälle. Hakujen tekeminen on tehtävä Jackrabbitin omien hakutoimintojen kautta, joiden toteutuksessa käytetään avoimeen lähdekoodiin perustuvaa tiedonhakuun tarkoitettua Lucene -ohjelmistokirjastoa. Jackrabbitin omat hakutoiminnot toimivat aina samalla tavalla riippumatta siitä mitä tallennusalustaa käytetään.

Relaatiotietokantojen tapaan Jackrabbit tukee käyttöoikeuksien hallintaa, viite-eheyden valvontaa, transaktioita, tietojen lukitsemista ja mahdollistaa liitosten (JOIN) käytön kyselyissä. Kyseisten ominaisuuksien käytännön toteutus eroaa kuitenkin täysin relaatiokantojen vastaavista toiminnoista. Relaatiotietokannoista poiketen Jackrabbitissä on sisäänrakennettuna tuki myös tallennettujen tietojen versioinnille.

Arkkitehtuuri

Jackrabbitin arkkitehtuuri koostuu kolmesta kerroksesta: sovellus-, rajapinta- ja totetuskerroksesta. Yksinkertaistetusti Jackrabbit toimii siten, että sovelluskerroksen järjestelmät käyttävät toteutuskerroksen tarjoamia palveluita rajapinnan kautta. Jacrabbitin yksinkertaistettu arkkitehtuuri on esitetty kuvassa 2.

Kuva 2. Jackrabbitin arkkitehtuuri.

Sovelluskerros

Sisältösovellukset voivat olla mitä tahansa JSR 170 -rajapintaa käyttäviä sovelluksia, joista osa voi olla yleiskäyttöisiä ja osa nimenomaan tiettyä käyttötarkoitusta varten suunniteltuja. Yleiskäyttöiset sovellukset käyttävät sisältövaraston valmiita solmutyyppejä, eivätkä ota suoranaisesti kantaa siihen mitä tietosisältöä niillä tallennetaan. Yleiskäyttöiset sovellukset voivat esimerkiksi tarjota käyttöliittymän sisältövarastoon tallennetun tiedon esittämiseen ja muokkaamiseen. Jackrabbitin mukana tulee esimerkiksi sisältövarastoon tallennetujen tietojen katselun mahdollistava sovellus sekä solmutyyppien hallintakäyttöliittymä. Tiettyä käyttötarkoitusta varten suunnitellut sovellukset käyttävät puolestaan sovellusta varten luotuja ja sovelluksen tietomallia vastaavia solmutyyppejä. Tällaiset sovellukset käyttävät sisältövarastoa sovelluksen käsittelemän tiedon tallentamiseen relaatiotietokannan tai tiedostojärjestelmän sijaan. Aiemmin esitetty ihmisten yhteystietoja käsittelevä sovellus on yksi esimerkki tiettyä käyttötarkoitusta varten suunnitellusta sovelluksesta.

Rajapintakerros

Jackrabbitin rajapintakerros toteuttaa JSR 170 -rajapinnan sekä lisäksi myös joukon siitä pois jätettyjä piirteitä. Kyseiset piirteet on jätetty pois rajapintamäärityksestä, koska niiden toteuttaminen olemassa oleviin ei Java-pohjaisiin järjestelmiin on haasteellista. Vain hyvin harvat sovellukset hyödyntävät Jackrabbitin JSR 170 -rajapinnan ulkopuolisia piirteitä.

Toteutuskerros

Toteutuskerros sisältää suurimman osan Jackrabbitin toiminnallisuudesta ja se onkin kerroksista suurin. Toteustuskerros jakautuu kolmeen vaikutusalueeseen (scope): varasto (repository scope), työtila (workspace scope) ja istunto (session scope). Kaikki sisältövarastoon kohdistuvat operaatiot voivat kohdistua vähintään yhteen ja osa operaatioista useaan vaikutusalueeseen.

Klusterointi

Jackrabbit tukee klusterointia, joka mahdollistaa samojen tietojen jakamisen useiden eri Jackrabbit-instanssien kesken. Klusteroinnilla voidaan parantaa järjestelmän vikasietoisuutta, kun sama tieto on saatavilla useista eri lähteistä. Klusterointia voidaan käyttää hyväksi myös kuormantasauksessa jakamalla järjestelmälle tulevat palvelupyynnöt useiden eri instanssien kesken. Käytännössä klusterointi toimii siten, että kaikki klusteriin kuuluvat Jackrabbit instanssit synkronoivat yhteiset tietonsa klusterin keskuspalvelimen kautta. Jokainen instanssi välittää tiedot kaikista muutoksista keskuspalvelimelle, jonka välityksellä klusterin instanssit saavat haettua muuttuneet tiedot paikallisiin sisältövarastoihinsa. Kaikkien sisältövarastoon kuuluvien työtilojen tietojen ei tarvitse olla klusterin kesken yhteisiä, vaan yhteiset tiedot voidaan määritellä työtilojen tasolla. Esimerkiksi sosiaalisen median sovelluksessa käyttäjien kommentit voisivat olla tallennettuna omaan työtilaansa, jonka sisältö synkronoidaan kaikkien klusterin instanssien kesken. Tällä tavoin eri instansseissa jätetyt kommentit ovat näkyvissä kaikille käyttäjille riippumatta siitä, minkä instanssin kautta he palvelua käyttävät.

Toimitusmallit

JSR 170 mahdollistaa useiden eri toimitusmallien (deployment model) käytön, jonka ansiosta eri sisältövarastosovellukset voivat valita juuri niille parhaiten sopivat toimitusmallit. Jackrabbit tukee kolmen alla esitetyn toimitusmallin käyttöä.

  • Sisällytetyssä toimitusmallissa Jackrabbit tulee sitä käyttävän sovelluksen mukana ja on ainoastaan kyseisen sovelluksen käytettävissä. Tässä mallissa sovellus on vastuussa Jackrabbitin käynnistämisestä ja sammuttamisesta eli käytännössä Jackrabbit on siis täysin riippuvainen sovelluksesta.
  • Jaettu J2EE-resurssi on toimitusmalli, jossa Jackrabbit asetetaan sovelluspalvelimen (esim. Tomcat) resurssiksi, jolloin se on kaikkien sovelluspalvelimelle asennettujen sovellusten käytettävissä. Tässä mallissa sovelluspalvelin on vastuussa Jackrabbitin käynnistämisestä ja sammuttamisesta.
  • Jackrabbit voidaan asentaa myös kokonaan omaksi kokonaisuudekseen, joka muodostaa erillisen sisältövarastopalvelimen. Tässä mallissa Jackrabbit on useiden eri sovellusten käytettävissä ja sovellukset voivat sijaita millä tahansa palvelimilla. Kahdesta muusta toimitusmallista poiketen Jackrabbitin ja sitä käyttävien sovellusten välinen tiedonvaihto tapahtuu verkkokerroksen kautta. Lisäksi toimitusmallin etuna on, että se sallii Jackrabbitin skaalaamisen erikseen sitä käyttävistä sovelluksista riippumatta.
  • No labels