Apache Sling presentation at JavaZone 2009

2,936 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,936
On SlideShare
0
From Embeds
0
Number of Embeds
1,219
Actions
Shares
0
Downloads
48
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 7 pkt
    DEFINISJON
    JCR
    OSGi
    REST
    SLING TILFØRER
    DEMO
    NOE FOR DEG



    Først en definisjon av hva Sling er
    Så til Java Content Repository, som Sling bygger på
    OSGi og REST er også viktige begreper
    Så går vi grundigere inn på hva Sling tilbyr
    Så en demo av en applikasjon
    Til slutt ser vi på hvilke problemer Sling løser
  • Klikk for hver bullet
    3 pkt
    UTVIKLER I IDIUM
    BASERT PÅ SLING
    COMMITTER






    Committer - kan bidra til prosjektet og påvirke det
  • Klikk for hver bullet
    3 pkt
    UTVIKLER I IDIUM
    BASERT PÅ SLING
    COMMITTER






    Committer - kan bidra til prosjektet og påvirke det
  • Klikk for hver bullet
    3 pkt
    UTVIKLER I IDIUM
    BASERT PÅ SLING
    COMMITTER






    Committer - kan bidra til prosjektet og påvirke det
  • Hva er det_ vi skal snakke om
    [KLIKK]
    3pkt
    “the simplest device for delivering content very fast” står det i PR-materiellet
    4 pkt
    ENKELT, RASKT, INNHOLD
    DEFINERE INNHOLD SEINERE



    WEB-RAMMEVERK DEDIKERT TIL JCR



    APACHE LICENSE



    - det dreier seg altså om *innhold*, definisjon seinere
    - den raskeste måten å utvikle innholdsbaserte applikasjoner



    Apache-prosjekt = åpen kildekode, Apache License er en av de aller frieste lisensene
  • Hva er det_ vi skal snakke om
    [KLIKK]
    3pkt
    “the simplest device for delivering content very fast” står det i PR-materiellet
    4 pkt
    ENKELT, RASKT, INNHOLD
    DEFINERE INNHOLD SEINERE



    WEB-RAMMEVERK DEDIKERT TIL JCR



    APACHE LICENSE



    - det dreier seg altså om *innhold*, definisjon seinere
    - den raskeste måten å utvikle innholdsbaserte applikasjoner



    Apache-prosjekt = åpen kildekode, Apache License er en av de aller frieste lisensene
  • Hva er det_ vi skal snakke om
    [KLIKK]
    3pkt
    “the simplest device for delivering content very fast” står det i PR-materiellet
    4 pkt
    ENKELT, RASKT, INNHOLD
    DEFINERE INNHOLD SEINERE



    WEB-RAMMEVERK DEDIKERT TIL JCR



    APACHE LICENSE



    - det dreier seg altså om *innhold*, definisjon seinere
    - den raskeste måten å utvikle innholdsbaserte applikasjoner



    Apache-prosjekt = åpen kildekode, Apache License er en av de aller frieste lisensene
  • Hva er det_ vi skal snakke om
    [KLIKK]
    3pkt
    “the simplest device for delivering content very fast” står det i PR-materiellet
    4 pkt
    ENKELT, RASKT, INNHOLD
    DEFINERE INNHOLD SEINERE



    WEB-RAMMEVERK DEDIKERT TIL JCR



    APACHE LICENSE



    - det dreier seg altså om *innhold*, definisjon seinere
    - den raskeste måten å utvikle innholdsbaserte applikasjoner



    Apache-prosjekt = åpen kildekode, Apache License er en av de aller frieste lisensene
  • Hva er det_ vi skal snakke om
    [KLIKK]
    3pkt
    “the simplest device for delivering content very fast” står det i PR-materiellet
    4 pkt
    ENKELT, RASKT, INNHOLD
    DEFINERE INNHOLD SEINERE



    WEB-RAMMEVERK DEDIKERT TIL JCR



    APACHE LICENSE



    - det dreier seg altså om *innhold*, definisjon seinere
    - den raskeste måten å utvikle innholdsbaserte applikasjoner



    Apache-prosjekt = åpen kildekode, Apache License er en av de aller frieste lisensene
  • Sling er en plattform, som igjen er ...



    3pkt
    BYGD PÅ JCR
    basert på REST
    drevet av OSGi



    ... og vi skal se på disse delene
  • Sling er en plattform, som igjen er ...



    3pkt
    BYGD PÅ JCR
    basert på REST
    drevet av OSGi



    ... og vi skal se på disse delene
  • Sling er en plattform, som igjen er ...



    3pkt
    BYGD PÅ JCR
    basert på REST
    drevet av OSGi



    ... og vi skal se på disse delene
  • Tre standarder som Sling bygger på. Først:
    JCR - Java Content Repository
  • Tre standarder som Sling bygger på. Først:
    JCR - Java Content Repository
  • Tre standarder som Sling bygger på. Først:
    JCR - Java Content Repository
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 5 pkt
    JSR-170: JCR 1.0
    JSR-283: JCR 2.0 - ferd med å bli ferdigstilt



    5pkt
    JCR 1.0 og 2.0
    STORE FIRMAER STØTTER
    HIERARKISK DATABASE
    NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER
    RIKE DATATYPER



    ... altså vedtatte Java-standarder, med noen store firmaer bak
    [KLIKK]



    Hierarki - ikke tabeller / kolonner



    Kommer tilbake til datatyper/-struktur
  • 4 pkt
    FLERE FORSKJELLIGE IMPLEMENTASJONER AV JCR-STANDARDEN
    NYTT: OpenJCR
    APACHE JACKRABBIT ER REFERANSEIMPL, og shippes med Sling
    DE FLESTE BYGD PÅ JACKRABBIT



    Apache Jackrabbit er referanseimplementasjonen, og den som shippes med Sling
    Microsoft Sharepoint - via connector fra Day



    Mange av disse er bygd på Jackrabbit, men utvidet med proprietær funksjonalitet
  • 4 pkt
    FLERE FORSKJELLIGE IMPLEMENTASJONER AV JCR-STANDARDEN
    NYTT: OpenJCR
    APACHE JACKRABBIT ER REFERANSEIMPL, og shippes med Sling
    DE FLESTE BYGD PÅ JACKRABBIT



    Apache Jackrabbit er referanseimplementasjonen, og den som shippes med Sling
    Microsoft Sharepoint - via connector fra Day



    Mange av disse er bygd på Jackrabbit, men utvidet med proprietær funksjonalitet
  • 2pkt
    NOEN KJENTE NAVN, bl.a. NORSKE
    MYE ENTERPRISE, men SLING EGNER SEG OGSÅ FOR MINDRE LØSNINGER => ref kolibri



    Antakelig noen kjente navn her. De fleste bruker Jackrabbit som implementasjon.



    Mye enterprise-systemer, men med Sling egner JCR seg også for mindre løsninger. Derfor Idium Web.
  • 2pkt
    JSR-STANDARDER KAN VÆRE KRYPTISKE
    NØKKELEN ER å forstå HVA CONTENT REPOSITORY er



    Når det gjelder JSR-standardene, så kan de være kryptiske.



    [KLIKK]



    Nøkkelen er å forstå hva et “content repository” er
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • 3pkt
    DB og FILSYSTEM - TO FORSKJELLIGE VERDENER
    FELLES: LESE- og SKRIVE-TILGANG
    JCR: BESTE FRA BEGGE VERDENER



    Database og filsystem - vi er vant til å se på det som to forskjellige verdener
    Men det er et par ting felles: Lese- og skrivetilgang



    (Til slutt): JCR tar det beste fra begge verdener
  • MEN DET ER SELVFØLGELIG IKKE ALT



    (Klikk en gang til for å få gå videre fra plakaten)
  • MEN DET ER SELVFØLGELIG IKKE ALT



    (Klikk en gang til for å få gå videre fra plakaten)
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • I TILLEGG:



    Fulltekst-søk
    Fri struktur
    Versjonering
    Flerverdi-felt
    Spesifikk rekkefølge
    Obervasjon
    og alt dette er tilgjengelig gjennom et enkelt Java-API
  • 6pkt
    SELVFØLGELIG HIERARKI - (ET TRE)
    DYP MAN VIL
    BRED MAN VIL
    NEDERST TIL HØYRE: FIL
    IKKE VIST: VERSJONERING, SØSKEN MED SAMME NAVN
    GRØNN LEGOGKLOSS = NODE til seinere



    Så, hvordan ser et repository ut?



    Selvfølgelig et hierarki (et tre)



    Legg merke til:
    - Strukturen kan være så dyp og bred man vil
    - En node kan ha så mange barn man vil
    - Noder kan ha forskjellige attributter
    - Filnoden nederst til høyre - man kan lagre filer rett i repositoriet
    Mange features ikke demonstrert her, som:
    - versjonering
    - søsken med samme navn



    De grønne legoklossene betyr “node” - kommer til å bruke det seinere
  • 6pkt
    SELVFØLGELIG HIERARKI - (ET TRE)
    DYP MAN VIL
    BRED MAN VIL
    NEDERST TIL HØYRE: FIL
    IKKE VIST: VERSJONERING, SØSKEN MED SAMME NAVN
    GRØNN LEGOGKLOSS = NODE til seinere



    Så, hvordan ser et repository ut?



    Selvfølgelig et hierarki (et tre)



    Legg merke til:
    - Strukturen kan være så dyp og bred man vil
    - En node kan ha så mange barn man vil
    - Noder kan ha forskjellige attributter
    - Filnoden nederst til høyre - man kan lagre filer rett i repositoriet
    Mange features ikke demonstrert her, som:
    - versjonering
    - søsken med samme navn



    De grønne legoklossene betyr “node” - kommer til å bruke det seinere
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • javax.jcr er JCR-apiet
    o.a.j.c.TR er fra JackRabbit-implementasjonen i blått



    session.save() lagrer alle endringer så langt, man jobber altså i sin sandkasse



    Eksempel på hvordan man henter ut en node.
    Tar en node man har, og gir en relativ path til denne.



    Kan også gjøres med spørring: XPath eller SQL
  • 5pkt
    MANGE APP SKAL LEVE *LENGE* - VANSKELIG Å TA HØYDE FOR FREMTIDIGE TYPER DATA
    NÅR MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, BØR MAN HELLER IKKE INNFØRE DEM
    KAN INNFØRE RESTRIKSJONER ETTERHVERT
    RULES OF DATABASE AGING - ALLE “NOT NULL” BLIR BORTE
    HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNGÅ DET



    Mange applikasjoner skal leve LENGE, og det er vanskelig å ta høyde for fremtidige typer data som skal lagres.



    Når man ikke *trenger* å sette opp felter fra start, så bør man heller ikke gjøre det
    Man kan innføre rigide restriksjoner fra start
    Rules of Database App Aging: Etterhvert som datasettet blir større, blir antallet unntakstilfeller større. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL:
    f.eks. kan ikke feltet “stat” fylles ut
    Et content repository skal leve lenge, og bør kunne håndtere nye behov etterhvert



    Hierarki tilstrekkelig struktur: Det er MULIG å lage referanser, men ikke nødvendig, og ofte dumt.
  • 5pkt
    MANGE APP SKAL LEVE *LENGE* - VANSKELIG Å TA HØYDE FOR FREMTIDIGE TYPER DATA
    NÅR MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, BØR MAN HELLER IKKE INNFØRE DEM
    KAN INNFØRE RESTRIKSJONER ETTERHVERT
    RULES OF DATABASE AGING - ALLE “NOT NULL” BLIR BORTE
    HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNGÅ DET



    Mange applikasjoner skal leve LENGE, og det er vanskelig å ta høyde for fremtidige typer data som skal lagres.



    Når man ikke *trenger* å sette opp felter fra start, så bør man heller ikke gjøre det
    Man kan innføre rigide restriksjoner fra start
    Rules of Database App Aging: Etterhvert som datasettet blir større, blir antallet unntakstilfeller større. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL:
    f.eks. kan ikke feltet “stat” fylles ut
    Et content repository skal leve lenge, og bør kunne håndtere nye behov etterhvert



    Hierarki tilstrekkelig struktur: Det er MULIG å lage referanser, men ikke nødvendig, og ofte dumt.
  • 5pkt
    MANGE APP SKAL LEVE *LENGE* - VANSKELIG Å TA HØYDE FOR FREMTIDIGE TYPER DATA
    NÅR MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, BØR MAN HELLER IKKE INNFØRE DEM
    KAN INNFØRE RESTRIKSJONER ETTERHVERT
    RULES OF DATABASE AGING - ALLE “NOT NULL” BLIR BORTE
    HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNGÅ DET



    Mange applikasjoner skal leve LENGE, og det er vanskelig å ta høyde for fremtidige typer data som skal lagres.



    Når man ikke *trenger* å sette opp felter fra start, så bør man heller ikke gjøre det
    Man kan innføre rigide restriksjoner fra start
    Rules of Database App Aging: Etterhvert som datasettet blir større, blir antallet unntakstilfeller større. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL:
    f.eks. kan ikke feltet “stat” fylles ut
    Et content repository skal leve lenge, og bør kunne håndtere nye behov etterhvert



    Hierarki tilstrekkelig struktur: Det er MULIG å lage referanser, men ikke nødvendig, og ofte dumt.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • Blogg-applikasjon: Webapplikasjon for et bloggsystem.



    Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster.
    Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId.
    Det fungerer fint lenge, man får mange blogginnlegg i databasen.



    Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare få verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - altså upraktisk å innføre noe restriksjon på feltet (NOT NULL).



    Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innføres, ny relasjon.
    Legg merke til referansene som opprettholdes av IDer.



    Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal åpne for kommentarer. Da må databasestrukturen endres igjen.
  • 4pkt
    INGEN PRIMÆRNØKLER
    INNFØRE VEDLEGG - BARE SLENGE PÅ NY NODE
    JCR STØTTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE
    FLERE VEDLEGG - FLERE FILNODER



    “Vidars blogg” er en toppnivå-node, “First post” og “Second post” er noder direkte under denne.
    Slipper nøkler i det hele tatt



    Når jeg ønsker å innføre vedlegg, er det bare å slenge på en ny node.
    Og JCR støtter også filer som innhold, så jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke være en referanse til en fil på disk eller et BLOB-felt.
  • 4pkt
    INGEN PRIMÆRNØKLER
    INNFØRE VEDLEGG - BARE SLENGE PÅ NY NODE
    JCR STØTTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE
    FLERE VEDLEGG - FLERE FILNODER



    “Vidars blogg” er en toppnivå-node, “First post” og “Second post” er noder direkte under denne.
    Slipper nøkler i det hele tatt



    Når jeg ønsker å innføre vedlegg, er det bare å slenge på en ny node.
    Og JCR støtter også filer som innhold, så jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke være en referanse til en fil på disk eller et BLOB-felt.
  • 4pkt
    INGEN PRIMÆRNØKLER
    INNFØRE VEDLEGG - BARE SLENGE PÅ NY NODE
    JCR STØTTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE
    FLERE VEDLEGG - FLERE FILNODER



    “Vidars blogg” er en toppnivå-node, “First post” og “Second post” er noder direkte under denne.
    Slipper nøkler i det hele tatt



    Når jeg ønsker å innføre vedlegg, er det bare å slenge på en ny node.
    Og JCR støtter også filer som innhold, så jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke være en referanse til en fil på disk eller et BLOB-felt.
  • 4pkt
    INGEN PRIMÆRNØKLER
    INNFØRE VEDLEGG - BARE SLENGE PÅ NY NODE
    JCR STØTTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE
    FLERE VEDLEGG - FLERE FILNODER



    “Vidars blogg” er en toppnivå-node, “First post” og “Second post” er noder direkte under denne.
    Slipper nøkler i det hele tatt



    Når jeg ønsker å innføre vedlegg, er det bare å slenge på en ny node.
    Og JCR støtter også filer som innhold, så jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke være en referanse til en fil på disk eller et BLOB-felt.
  • 4pkt
    INGEN PRIMÆRNØKLER
    INNFØRE VEDLEGG - BARE SLENGE PÅ NY NODE
    JCR STØTTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE
    FLERE VEDLEGG - FLERE FILNODER



    “Vidars blogg” er en toppnivå-node, “First post” og “Second post” er noder direkte under denne.
    Slipper nøkler i det hele tatt



    Når jeg ønsker å innføre vedlegg, er det bare å slenge på en ny node.
    Og JCR støtter også filer som innhold, så jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke være en referanse til en fil på disk eller et BLOB-felt.
  • 2 pkt
    HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON
    OSGi IKKE STRENGT NØDVENDIG (MULIG Å UNNGÅ), MEN KORT SE PÅ DET






    Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon?



    OSGi er ikke nødvendig å kunne for å lage enkle Sling-applikasjoner, men vi skal se kort på det.
  • 2 pkt
    HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON
    OSGi IKKE STRENGT NØDVENDIG (MULIG Å UNNGÅ), MEN KORT SE PÅ DET






    Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon?



    OSGi er ikke nødvendig å kunne for å lage enkle Sling-applikasjoner, men vi skal se kort på det.
  • 2 pkt
    HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON
    OSGi IKKE STRENGT NØDVENDIG (MULIG Å UNNGÅ), MEN KORT SE PÅ DET






    Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon?



    OSGi er ikke nødvendig å kunne for å lage enkle Sling-applikasjoner, men vi skal se kort på det.
  • Dynamic Module System For Java



    Open Services Gateway initiative - navnet ikke lenger i bruk



    [klikk]



    4pkt
    FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER
    KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY
    BUNDLER KAN HA AVHENGIGHETER TIL ANDRE
    BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER



    Funksjonalitet pakkes i bundles - skal straks se hva en bundle er
    Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  • Dynamic Module System For Java



    Open Services Gateway initiative - navnet ikke lenger i bruk



    [klikk]



    4pkt
    FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER
    KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY
    BUNDLER KAN HA AVHENGIGHETER TIL ANDRE
    BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER



    Funksjonalitet pakkes i bundles - skal straks se hva en bundle er
    Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  • Dynamic Module System For Java



    Open Services Gateway initiative - navnet ikke lenger i bruk



    [klikk]



    4pkt
    FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER
    KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY
    BUNDLER KAN HA AVHENGIGHETER TIL ANDRE
    BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER



    Funksjonalitet pakkes i bundles - skal straks se hva en bundle er
    Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  • Dynamic Module System For Java



    Open Services Gateway initiative - navnet ikke lenger i bruk



    [klikk]



    4pkt
    FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER
    KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY
    BUNDLER KAN HA AVHENGIGHETER TIL ANDRE
    BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER



    Funksjonalitet pakkes i bundles - skal straks se hva en bundle er
    Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  • Dynamic Module System For Java



    Open Services Gateway initiative - navnet ikke lenger i bruk



    [klikk]



    4pkt
    FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER
    KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY
    BUNDLER KAN HA AVHENGIGHETER TIL ANDRE
    BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER



    Funksjonalitet pakkes i bundles - skal straks se hva en bundle er
    Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • EN VANLIG JAVA-KLASSE
    PR DEF DEL AV EN PAKKE
    HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC
    CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE
    I EN ANNEN PAKKE HAR VI CLASS A
    DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1
    MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC



    1 pkt
    DETTE KAN VI FRA FØR, DET ER VANLIG INNKAPSLING I JAVA




    Jeg kan endre implementasjonen i ImplClass så mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er altså en enhet med et interface.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER
    MEN VI PAKKER DISSE I EN BUNDLE
    EN BUNDLE *EKSPORTERER* PAKKER
    VI INNFØRER EN NY BUNDLE
    MED EN KLASSE
    VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER
    BARE DE SOM EKSPLISITT ER EKSPORTERT
    DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN



    3 pkt
    OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle
    VI FÅR ET LAG TIL MED INNKAPSLING
    KAN HERJE MED PACKAGE1 UTEN Å BRYTE ANNEN KODE






    Betyr at jeg kan herje så mye jeg vil med implementasjonen i Package1, og være sikker på at det er bakoverkompatibelt
    Package1 er usynlig for andre bundler
    - m.a.o vi kan ha private klasser
    Package2 fungerer som et interface for hele bundle’n



    Dette betyr at mye kode kan skjules, og man får veldig rene grensesnitt mellom komponenter.
  • 3pkt
    HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES
    LETT Å BYTTE UT: PGA RENE GRENSESNITT
    EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE
    Lett å bytte ut: Fordi det er så rene grensesnitt



    Lett å utvide pga komponentmodellen og dependency injection (kommer senere)
  • 3pkt
    HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES
    LETT Å BYTTE UT: PGA RENE GRENSESNITT
    EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE
    Lett å bytte ut: Fordi det er så rene grensesnitt



    Lett å utvide pga komponentmodellen og dependency injection (kommer senere)
  • 3pkt
    HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES
    LETT Å BYTTE UT: PGA RENE GRENSESNITT
    EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE
    Lett å bytte ut: Fordi det er så rene grensesnitt



    Lett å utvide pga komponentmodellen og dependency injection (kommer senere)
  • 4pkt
    EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE
    EGNE SERVLETER
    INNHOLD
    JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL






    Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere
    Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  • 4pkt
    EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE
    EGNE SERVLETER
    INNHOLD
    JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL






    Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere
    Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  • 4pkt
    EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE
    EGNE SERVLETER
    INNHOLD
    JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL






    Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere
    Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  • 4pkt
    EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE
    EGNE SERVLETER
    INNHOLD
    JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL






    Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere
    Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  • REST
  • REST
  • REST
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 5pkt
    MANGE VET
    REPRESENTIONAL STATE TRANSFER
    ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG
    INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING
    ENKLE HTTP-METODER
    (les opp hvert punkt)



    Sikkert mange som vet hva REST er og står for
    All state holdes av klienten:
    Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen
    Det eneste som er STATE, er egentlig URLen



    Unngår server-side sessions: Ingen cookie med sessionId
    Lettere å implementere clustering
  • 4pkt ++
    URL PEKER TIL *RESSURS* IKKE METODE
    EKSEMPEL: URL besudlet med METODENAVN
    VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE
    STYGT ID-FELT



    6pkt
    ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSPØRRES
    METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT
    OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE
    INGEN QUERY-STRING - INFORMASJON i SELVE URLen
    URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON
    KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen



    I det første eksempelet er URLen besudlet med metodenavn (“Article.publicShow”)
    Man vil ha forskjellige metodenavn etter hva som skal gjøres, f.eks. slette en artikkel, eller oppdatere den.
    Stygt ID-felt



    I det andre eksempelet er URLen en adresse til ressursen som etterspørres
    Metoden er HTTP GET
    Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse



    Man ser at query-stringen er borte, informasjonen flyttet inn i URLen
    Vi har plutselig fått en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  • 4pkt ++
    URL PEKER TIL *RESSURS* IKKE METODE
    EKSEMPEL: URL besudlet med METODENAVN
    VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE
    STYGT ID-FELT



    6pkt
    ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSPØRRES
    METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT
    OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE
    INGEN QUERY-STRING - INFORMASJON i SELVE URLen
    URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON
    KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen



    I det første eksempelet er URLen besudlet med metodenavn (“Article.publicShow”)
    Man vil ha forskjellige metodenavn etter hva som skal gjøres, f.eks. slette en artikkel, eller oppdatere den.
    Stygt ID-felt



    I det andre eksempelet er URLen en adresse til ressursen som etterspørres
    Metoden er HTTP GET
    Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse



    Man ser at query-stringen er borte, informasjonen flyttet inn i URLen
    Vi har plutselig fått en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  • 4pkt ++
    URL PEKER TIL *RESSURS* IKKE METODE
    EKSEMPEL: URL besudlet med METODENAVN
    VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE
    STYGT ID-FELT



    6pkt
    ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSPØRRES
    METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT
    OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE
    INGEN QUERY-STRING - INFORMASJON i SELVE URLen
    URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON
    KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen



    I det første eksempelet er URLen besudlet med metodenavn (“Article.publicShow”)
    Man vil ha forskjellige metodenavn etter hva som skal gjøres, f.eks. slette en artikkel, eller oppdatere den.
    Stygt ID-felt



    I det andre eksempelet er URLen en adresse til ressursen som etterspørres
    Metoden er HTTP GET
    Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse



    Man ser at query-stringen er borte, informasjonen flyttet inn i URLen
    Vi har plutselig fått en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  • 4pkt ++
    URL PEKER TIL *RESSURS* IKKE METODE
    EKSEMPEL: URL besudlet med METODENAVN
    VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE
    STYGT ID-FELT



    6pkt
    ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSPØRRES
    METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT
    OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE
    INGEN QUERY-STRING - INFORMASJON i SELVE URLen
    URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON
    KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen



    I det første eksempelet er URLen besudlet med metodenavn (“Article.publicShow”)
    Man vil ha forskjellige metodenavn etter hva som skal gjøres, f.eks. slette en artikkel, eller oppdatere den.
    Stygt ID-felt



    I det andre eksempelet er URLen en adresse til ressursen som etterspørres
    Metoden er HTTP GET
    Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse



    Man ser at query-stringen er borte, informasjonen flyttet inn i URLen
    Vi har plutselig fått en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  • 4pkt ++
    URL PEKER TIL *RESSURS* IKKE METODE
    EKSEMPEL: URL besudlet med METODENAVN
    VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE
    STYGT ID-FELT



    6pkt
    ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSPØRRES
    METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT
    OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE
    INGEN QUERY-STRING - INFORMASJON i SELVE URLen
    URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON
    KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen



    I det første eksempelet er URLen besudlet med metodenavn (“Article.publicShow”)
    Man vil ha forskjellige metodenavn etter hva som skal gjøres, f.eks. slette en artikkel, eller oppdatere den.
    Stygt ID-felt



    I det andre eksempelet er URLen en adresse til ressursen som etterspørres
    Metoden er HTTP GET
    Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse



    Man ser at query-stringen er borte, informasjonen flyttet inn i URLen
    Vi har plutselig fått en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • 2pkt ++
    PÅSTAND: ALT KAN UTTRYKKES MED HTTP-METODER
    BEVIS



    4 pkt ++
    LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP
    HVER OPERASJON = EGEN SERVLET
    GET liste med ordre til en webshop
    POST ny ordre, SERVEREN SVARER



    8pkt
    REST-BASERT SYSTEM
    GET til en PATH hvor ORDRE ER LAGRET
    POST til SAMME URL (men med “/” til slutt)
    SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500
    LOCATION for å vise HVOR ORDREN ER OPPRETTET
    HENTE DETALJER med GET
    DELETE for å SLETTE, PUT for å OPPDATERE
    SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR Å VISE HVA VI VIL



    Nøkkelen er å ha et fornuftig sted å poste det til
    201 Created - offisiell HTTP-response-kode (sånn som den mer kjente 404, eller 500 Internal Server Error)
    Sender også en Location-header, som ved redirect, for å fortelle hvor ordren finnes
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • Nå har vi vært gjennom disse grunnprinsippene, så skal vi se hvordan Sling bygger på dem.
  • 3 pkt
    GÅTT OPP FOR DERE AT SLING ER ET HTTP-REST-API til JCR
    ET HTTP-API i TILLEGG til JAVA-APIET
    MEN DET ER IKKE ALT






    Det har kanskje gått opp for dere at Sling gir oss et HTTP-REST-API til JCR



    ... så vi får et HTTP-API, i tillegg til JCR-java-APIet.



    ... men det er ikke alt
  • 4pkt
    IKKE BEGRENSA TIL JCR-REPOSITORIET
    KAN PODE INN EGEN SERVLET
    FILMAPPE
    DATABASE-SYSTEM



    Vi er ikke begrensa til JCR-repositoriet
  • 4pkt
    IKKE BEGRENSA TIL JCR-REPOSITORIET
    KAN PODE INN EGEN SERVLET
    FILMAPPE
    DATABASE-SYSTEM



    Vi er ikke begrensa til JCR-repositoriet
  • 4pkt
    IKKE BEGRENSA TIL JCR-REPOSITORIET
    KAN PODE INN EGEN SERVLET
    FILMAPPE
    DATABASE-SYSTEM



    Vi er ikke begrensa til JCR-repositoriet
  • 4pkt
    IKKE BEGRENSA TIL JCR-REPOSITORIET
    KAN PODE INN EGEN SERVLET
    FILMAPPE
    DATABASE-SYSTEM



    Vi er ikke begrensa til JCR-repositoriet
  • 3pkt
    KAN ALTSÅ HA DETTE
    ET TRE HVOR JCR-noder, SERVLETer, FILMAPPER, og ANNET lever som GODE NABOER
    KAN PLUGGE INN SIN EGEN LEGACY DB-APP ved å IMPLEMENTERE ET INTERFACE






    Man kan altså ha dette - et tre hvor JCR-noder, servleter, filmapper og annet lever som gode naboer



    Ved å implementere Resource-interfacet kan man også plugge inn sin egen legacy database-applikasjon.
  • 1pkt
    VI BRUKER BEGREPET “RESSURS” - DEFINISJON



    Hva er en “ressurs”?
  • 4pkt
    EN RESSURS HAR NOEN GITTE EGENSKAPER
    PATH
    - for JCR-noder: pathen til noden
    TYPE
    - for JCR-noder: en bestemt property
    METADATA
  • 4pkt
    EN RESSURS HAR NOEN GITTE EGENSKAPER
    PATH
    - for JCR-noder: pathen til noden
    TYPE
    - for JCR-noder: en bestemt property
    METADATA
  • 4pkt
    EN RESSURS HAR NOEN GITTE EGENSKAPER
    PATH
    - for JCR-noder: pathen til noden
    TYPE
    - for JCR-noder: en bestemt property
    METADATA
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 5pkt
    ENKELT Å RESOLVE EN URL til en JCR-NODE
    URLen er PATH til NODEN
    REPOSITORIET fra BLOGG-eksempelet
    DENNE REQUESTEN
    RESOLVES TIL DENNE NODEN



    Det er enkelt å resolve en URL til en JCR-node
    URLen er i virkeligheten en path til noden



    Vi tar fram mini-repositoriet fra blogg-eksempelet
    Så får vi inn denne requesten
    ... som resolves til denne noden
  • 2pkt ++
    DET VAR RESSURSER
    MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. på en WEBSIDE



    3pkt
    KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT
    RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES
    SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET






    Det var ressurser. Men en ressurs er ikke særlig til nytte hvis den ikke kan vises - vises på en webside.
  • 2pkt ++
    DET VAR RESSURSER
    MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. på en WEBSIDE



    3pkt
    KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT
    RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES
    SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET






    Det var ressurser. Men en ressurs er ikke særlig til nytte hvis den ikke kan vises - vises på en webside.
  • 2pkt ++
    DET VAR RESSURSER
    MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. på en WEBSIDE



    3pkt
    KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT
    RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES
    SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET






    Det var ressurser. Men en ressurs er ikke særlig til nytte hvis den ikke kan vises - vises på en webside.
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • EN SLING-URL ser SÅNN UT
    PATH til RESSURSEN
    LEGG MERKE TIL PROPERTYEN NEDERST
    EXTENSION
    MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  • /apps er standard-plasssering
  • /apps er standard-plasssering
  • /apps er standard-plasssering
  • /apps er standard-plasssering
  • /apps er standard-plasssering
  • /apps er standard-plasssering
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • Ressursen prosesseres først - gjør evt. tilgangsbegrensninger tidlig



    http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  • 4 pkt
    EN PLATTFORM ER VEL OG BRA
    VIL GJERNE BYGGE EGEN FUNKSJONALITET OPPÅ
    OSGi-BUNDLER ER JAR-filer med NOGO ATTÅT
    SÅ: HOT-DEPLOY til en SLING-INSTANS



    INN: En plattform er vel og bra, men det er jo bare nettopp en plattform.
    Du vil gjerne bygge din egen funksjonalitet oppå.



    OSGi-bundler er .jar-filer med noggo attåt
  • 4 pkt
    EN PLATTFORM ER VEL OG BRA
    VIL GJERNE BYGGE EGEN FUNKSJONALITET OPPÅ
    OSGi-BUNDLER ER JAR-filer med NOGO ATTÅT
    SÅ: HOT-DEPLOY til en SLING-INSTANS



    INN: En plattform er vel og bra, men det er jo bare nettopp en plattform.
    Du vil gjerne bygge din egen funksjonalitet oppå.



    OSGi-bundler er .jar-filer med noggo attåt
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • 3pkt++
    HVORDAN DEPLOYE EGEN SERVLET
    DETTE: VANLIG SERVLET som IKKE GJØR STORT
    SLING må vite HVOR I TREET servleten SKAL PLASSERES



    [KLIKK]



    5pkt++
    “ANNOTATIONS” PROSESSERES av en MAVEN-plugin TIL EN XML-fil
    KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN
    JAVADOC-NESERYNK
    VI ANGIR EN PATH
    LEGG MERKE TIL pathS



    [KLIKK]



    3pkt++
    VED å IMPLEMENTERE SlingHttpSafeMethodsServlet
    FÅR WRAPPET request-objekt
    TILGANG TIL Resource



    2pkt
    SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart
    ANNOTASJONER brukes også til DEPENDENCY INJECTION



    [NESTE SLIDE]



    Så hva gjør du hvis du vil skrive din egen servlet?
    Dette er en helt vanlig servlet som ikke gjør stort.
    For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon.



    [KLIKK]



    Her angir vi path’en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for å finne servlet’er til rendering.
    Legg merke til “pathS” - en servlet kan registreres på flere pather.



    Noen rynker nok litt på nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket.



    Hvis man ikke vil endre på koden i en gammel servlet, kan man skrive den xml-fila selv.



    Det jobbes også med “ordentlige” annotasjoner man kan bruke, men er ikke sikker på om det er ferdig ennå.



    [KLIKK]



    Eller vi kan gjøre det på denne måten: Ved å angi noen bestemte properties, blir serveren registrert på passende steder.



    Når bundlen med servlet’en deployes, dvs lastes opp til en Sling-instans, så startes den automatisk, og begynner å svare på requester.
    Man kan også un-deploye bundelen, oppdatere den med en ny versjon, osv, uten å starte applikasjonen på nytt - takket være OSGi.



    [KLIKK]



    Hvis man vil operere på ressursen som requesten går til, så kan man i stedet extende SlingSafeMethodsServlet.
    Da får man et request-objekt med tilgang til ressursen.



    Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  • [KLIKK]



    3pkt
    SCR.REFERENCE gir tilgang til KJØRENDE KOMPONENTER
    NOK å deklarere VARIABLEN - Maven-plugin’en GJØR RESTEN
    NÅR SERVLETen KJØRER, er REPOSITORY-variabelen tilgjengelig









    Man kan få instanser av kjørende komponenter ved å bruke scr.reference



    Det er nok å deklarere variabelen. Maven-SCR-plugin’en tar seg av resten.
    Når servleten kjører, er repository tilgjengelig.
  • [KLIKK]



    3pkt
    SCR.REFERENCE gir tilgang til KJØRENDE KOMPONENTER
    NOK å deklarere VARIABLEN - Maven-plugin’en GJØR RESTEN
    NÅR SERVLETen KJØRER, er REPOSITORY-variabelen tilgjengelig









    Man kan få instanser av kjørende komponenter ved å bruke scr.reference



    Det er nok å deklarere variabelen. Maven-SCR-plugin’en tar seg av resten.
    Når servleten kjører, er repository tilgjengelig.
  • [KLIKK]



    3pkt
    SCR.REFERENCE gir tilgang til KJØRENDE KOMPONENTER
    NOK å deklarere VARIABLEN - Maven-plugin’en GJØR RESTEN
    NÅR SERVLETen KJØRER, er REPOSITORY-variabelen tilgjengelig









    Man kan få instanser av kjørende komponenter ved å bruke scr.reference



    Det er nok å deklarere variabelen. Maven-SCR-plugin’en tar seg av resten.
    Når servleten kjører, er repository tilgjengelig.
  • 1pkt ++
    ANDRE KOMPONENTER man vil TENKES Å UTVIKLE



    3pkt++
    [KLIKK FOR HVER BULLET]
    SERVLET-FILTRE
    AUTENTISERINGS-MEKANISMER feks. OpenID
    RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON



    1pkt
    [KLIKK]
    UANSETT: HOT-DEPLOY



    Andre komponenter man kan tenkes å ville utvikle



    [KLIKK FOR HVER BULLET]



    Autentiserings-mekanismer: F.eks. OpenID
    Resource providere: Gjør ressurser tilgjengelig, f.eks. det legacy database-systemet



    Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren.
    Hot-deploy, start, stopp, oppdatering ...



    Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen vår. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten å ta ned serveren. Vi bare deployer ny kode.
  • 1pkt ++
    ANDRE KOMPONENTER man vil TENKES Å UTVIKLE



    3pkt++
    [KLIKK FOR HVER BULLET]
    SERVLET-FILTRE
    AUTENTISERINGS-MEKANISMER feks. OpenID
    RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON



    1pkt
    [KLIKK]
    UANSETT: HOT-DEPLOY



    Andre komponenter man kan tenkes å ville utvikle



    [KLIKK FOR HVER BULLET]



    Autentiserings-mekanismer: F.eks. OpenID
    Resource providere: Gjør ressurser tilgjengelig, f.eks. det legacy database-systemet



    Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren.
    Hot-deploy, start, stopp, oppdatering ...



    Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen vår. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten å ta ned serveren. Vi bare deployer ny kode.
  • 1pkt ++
    ANDRE KOMPONENTER man vil TENKES Å UTVIKLE



    3pkt++
    [KLIKK FOR HVER BULLET]
    SERVLET-FILTRE
    AUTENTISERINGS-MEKANISMER feks. OpenID
    RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON



    1pkt
    [KLIKK]
    UANSETT: HOT-DEPLOY



    Andre komponenter man kan tenkes å ville utvikle



    [KLIKK FOR HVER BULLET]



    Autentiserings-mekanismer: F.eks. OpenID
    Resource providere: Gjør ressurser tilgjengelig, f.eks. det legacy database-systemet



    Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren.
    Hot-deploy, start, stopp, oppdatering ...



    Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen vår. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten å ta ned serveren. Vi bare deployer ny kode.
  • 1pkt ++
    ANDRE KOMPONENTER man vil TENKES Å UTVIKLE



    3pkt++
    [KLIKK FOR HVER BULLET]
    SERVLET-FILTRE
    AUTENTISERINGS-MEKANISMER feks. OpenID
    RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON



    1pkt
    [KLIKK]
    UANSETT: HOT-DEPLOY



    Andre komponenter man kan tenkes å ville utvikle



    [KLIKK FOR HVER BULLET]



    Autentiserings-mekanismer: F.eks. OpenID
    Resource providere: Gjør ressurser tilgjengelig, f.eks. det legacy database-systemet



    Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren.
    Hot-deploy, start, stopp, oppdatering ...



    Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen vår. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten å ta ned serveren. Vi bare deployer ny kode.
  • 1pkt ++
    ANDRE KOMPONENTER man vil TENKES Å UTVIKLE



    3pkt++
    [KLIKK FOR HVER BULLET]
    SERVLET-FILTRE
    AUTENTISERINGS-MEKANISMER feks. OpenID
    RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON



    1pkt
    [KLIKK]
    UANSETT: HOT-DEPLOY



    Andre komponenter man kan tenkes å ville utvikle



    [KLIKK FOR HVER BULLET]



    Autentiserings-mekanismer: F.eks. OpenID
    Resource providere: Gjør ressurser tilgjengelig, f.eks. det legacy database-systemet



    Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren.
    Hot-deploy, start, stopp, oppdatering ...



    Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen vår. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten å ta ned serveren. Vi bare deployer ny kode.
  • 2pkt ++
    SCRIPTS i stedet for SERVLETer
    RASKERE å UTVIKLE
    [KLIKK]



    4pkt
    SLING har mange INNEBYGDE SCRIPT-motorer
    [KLIKK]
    ECMA-Script = Server-side JAVASCRIPT
    [KLIKK]
    JSR-223 - JAVA SCRIPTING fra JAVA 6
    KAN PLUGGE INN EGNE



    ... scripts i stedet for servlet’er



    ECMAScript bedre kjent som JavaScript, men nå snakker vi om server-side



    JSR-223: Alle scriptspråk som støttes gjennom Java Scripting
  • 2pkt ++
    SCRIPTS i stedet for SERVLETer
    RASKERE å UTVIKLE
    [KLIKK]



    4pkt
    SLING har mange INNEBYGDE SCRIPT-motorer
    [KLIKK]
    ECMA-Script = Server-side JAVASCRIPT
    [KLIKK]
    JSR-223 - JAVA SCRIPTING fra JAVA 6
    KAN PLUGGE INN EGNE



    ... scripts i stedet for servlet’er



    ECMAScript bedre kjent som JavaScript, men nå snakker vi om server-side



    JSR-223: Alle scriptspråk som støttes gjennom Java Scripting
  • 2pkt ++
    SCRIPTS i stedet for SERVLETer
    RASKERE å UTVIKLE
    [KLIKK]



    4pkt
    SLING har mange INNEBYGDE SCRIPT-motorer
    [KLIKK]
    ECMA-Script = Server-side JAVASCRIPT
    [KLIKK]
    JSR-223 - JAVA SCRIPTING fra JAVA 6
    KAN PLUGGE INN EGNE



    ... scripts i stedet for servlet’er



    ECMAScript bedre kjent som JavaScript, men nå snakker vi om server-side



    JSR-223: Alle scriptspråk som støttes gjennom Java Scripting
  • 2pkt ++
    SCRIPTS i stedet for SERVLETer
    RASKERE å UTVIKLE
    [KLIKK]



    4pkt
    SLING har mange INNEBYGDE SCRIPT-motorer
    [KLIKK]
    ECMA-Script = Server-side JAVASCRIPT
    [KLIKK]
    JSR-223 - JAVA SCRIPTING fra JAVA 6
    KAN PLUGGE INN EGNE



    ... scripts i stedet for servlet’er



    ECMAScript bedre kjent som JavaScript, men nå snakker vi om server-side



    JSR-223: Alle scriptspråk som støttes gjennom Java Scripting
  • 2pkt ++
    SCRIPTS i stedet for SERVLETer
    RASKERE å UTVIKLE
    [KLIKK]



    4pkt
    SLING har mange INNEBYGDE SCRIPT-motorer
    [KLIKK]
    ECMA-Script = Server-side JAVASCRIPT
    [KLIKK]
    JSR-223 - JAVA SCRIPTING fra JAVA 6
    KAN PLUGGE INN EGNE



    ... scripts i stedet for servlet’er



    ECMAScript bedre kjent som JavaScript, men nå snakker vi om server-side



    JSR-223: Alle scriptspråk som støttes gjennom Java Scripting
  • 2pkt
    RASKEST UTVIKLING - INGEN KOMPILERING, DEPLOYING
    SCRIPTs lagres i REPOSITORIET






    Raskeste - slipper å kompilere, deploye etc - man lagrer rett i repositoriet. Kort roundtrip.
  • 5pkt
    BLOGGPOST-NODE
    EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT
    CURRENTNODE
    SKRIV UT PROPERTIES med mindre-enn-prosent-erlik
    SLING.INCLUDE



    Dette er noden som er forespurt i requesten



    Vi plasserer



    Forklar ESP



    currentNode er noden som er spurt etter i requesten



    Skriver ut enkelt-properties - med mindre-enn-prosent-erlik



    sling.include - inkluderer resultatet av en annen request. Gjør det mulig å dele opp kode i flere skriptfiler.
  • 5pkt
    BLOGGPOST-NODE
    EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT
    CURRENTNODE
    SKRIV UT PROPERTIES med mindre-enn-prosent-erlik
    SLING.INCLUDE



    Dette er noden som er forespurt i requesten



    Vi plasserer



    Forklar ESP



    currentNode er noden som er spurt etter i requesten



    Skriver ut enkelt-properties - med mindre-enn-prosent-erlik



    sling.include - inkluderer resultatet av en annen request. Gjør det mulig å dele opp kode i flere skriptfiler.
  • 5pkt
    BLOGGPOST-NODE
    EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT
    CURRENTNODE
    SKRIV UT PROPERTIES med mindre-enn-prosent-erlik
    SLING.INCLUDE



    Dette er noden som er forespurt i requesten



    Vi plasserer



    Forklar ESP



    currentNode er noden som er spurt etter i requesten



    Skriver ut enkelt-properties - med mindre-enn-prosent-erlik



    sling.include - inkluderer resultatet av en annen request. Gjør det mulig å dele opp kode i flere skriptfiler.
  • BYTT TIL TERMINAL



    For å demonstrere tydelig skal vi bruke tekst-http-klienten curl



    Vis hvordan man oppretter og henter en node:
    -F angir et parameter man poster



    curl -F title=hello http://admin:admin@localhost:8888/foo
    => 200 OK



    curl http://admin:admin@localhost:8888/foo.tidy.json
  • NESTEN så hele koden kan TWITRES
  • 4 pkt
    HTTP-metode POST
    FELTNAVN blir PROPERTIES på NODEN
    TITLE-feltet BEHANDLES SPESIELT, BLIR NAVN
    :REDIRECT









    POST - HTTP-metode for å lagre nytt innhold
    Feltnavnene blir properties på noden
    TITLE-feltet behandles spesielt, og blir node-navnet
    :redirect forteller Post-servleten at vi skal redirectes til den ny-opprettede noden
  • 2pkt
    SLING.JS - JAVASCRIPT-BIBLIOTEK som følger med SLING
    SLING.WIZARD() POPULERER skjemafeltene via JSON






    sling.js er et javascript-bibliotek som følger med Sling
    Sling.wizard() sørger for å populere skjemafeltene med verdier fra noden via JSON
  • 2 pkt
    SLING.GETCONTENT henter noder fra ANGITT NODE og 2 NIVÅER NED
    DOCUMENT.WRITE skriver ut TITTEL fra NODER hentet fra JSON



    BYTT TIL TextWrangler












    Sling.getContent henter noder fra angitt node og 2 nivåer ned



    Vis at fila ligger i webdav, åpne den



    Gå til http://localhost:8888/content/blog/*.html
    Fyll ut skjemaet
    Lagre
  • 5pkt
    NOEN FØLER SEG SNYTT?
    BILDESKALERING
    RSS-FEED
    KOMMENTARER
    ADMINISTRASJONS-GRENSESNITT



    BYTT TIL Firefox



    Synes du dette var for simpelt?
    OK, da legger vi til dette:
  • 5pkt
    NOEN FØLER SEG SNYTT?
    BILDESKALERING
    RSS-FEED
    KOMMENTARER
    ADMINISTRASJONS-GRENSESNITT



    BYTT TIL Firefox



    Synes du dette var for simpelt?
    OK, da legger vi til dette:
  • 5pkt
    NOEN FØLER SEG SNYTT?
    BILDESKALERING
    RSS-FEED
    KOMMENTARER
    ADMINISTRASJONS-GRENSESNITT



    BYTT TIL Firefox



    Synes du dette var for simpelt?
    OK, da legger vi til dette:
  • 5pkt
    NOEN FØLER SEG SNYTT?
    BILDESKALERING
    RSS-FEED
    KOMMENTARER
    ADMINISTRASJONS-GRENSESNITT



    BYTT TIL Firefox



    Synes du dette var for simpelt?
    OK, da legger vi til dette:
  • 5pkt
    NOEN FØLER SEG SNYTT?
    BILDESKALERING
    RSS-FEED
    KOMMENTARER
    ADMINISTRASJONS-GRENSESNITT



    BYTT TIL Firefox



    Synes du dette var for simpelt?
    OK, da legger vi til dette:
  • 5pkt
    HVA SKJEDDE HER?
    DISSE SCRIPTENE og ET PAR JAVAKLASSER
    SCRIPTENE ligger i REPOSITORIET
    Java-klassene I EN BUNDLE
    SE NÆRMERE på JAVA-klassene
  • 5pkt
    HVA SKJEDDE HER?
    DISSE SCRIPTENE og ET PAR JAVAKLASSER
    SCRIPTENE ligger i REPOSITORIET
    Java-klassene I EN BUNDLE
    SE NÆRMERE på JAVA-klassene
  • 5pkt
    HVA SKJEDDE HER?
    DISSE SCRIPTENE og ET PAR JAVAKLASSER
    SCRIPTENE ligger i REPOSITORIET
    Java-klassene I EN BUNDLE
    SE NÆRMERE på JAVA-klassene
  • 1 pkt
    BRUKER JCR-feature OBSERVATION = EventListener
  • 5 pkt
    NÅR KOMPONENTEN AKTIVERES
    HENTE OBSERVATIONMANAGER
    LEGGE OSS TIL SOM EVENTLISTENER
    FOR Event.NODE_ADDED
    UNDER en bestemt PATH
  • 4 pkt
    IMPLEMENTERE METODE onEvent
    FÅ PATH til NY NODE
    LAG THUMBNAILS (createThumbnails)
    UNNGÅ EVIG LØKKE med !event.getPath(“thumbnails”)












    Event-listeneren er registrert på repository-nivået
    Dvs den vil trigge uansett hvordan noder blir opprettet, trenger ikke være fra web-grensesnittet (f.eks. WebDav)
  • JCR-FUNKSJONALITET: WebDAV, OBSERVATION
    SLING-SNACKS: Script-MAPPING, REST
    Pakk koden i en bundle og deploy til serveren - applikasjonen kjører
  • JCR-FUNKSJONALITET: WebDAV, OBSERVATION
    SLING-SNACKS: Script-MAPPING, REST
    Pakk koden i en bundle og deploy til serveren - applikasjonen kjører
  • JCR-FUNKSJONALITET: WebDAV, OBSERVATION
    SLING-SNACKS: Script-MAPPING, REST
    Pakk koden i en bundle og deploy til serveren - applikasjonen kjører
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • ER DETTE NOE FOR DEG?



    6 pkt++
    NØKKELSPØRSMÅL: Behandler du INNHOLD?
    PÅSTAND:
    [KLIKK]
    JA
    INNHOLD = Data som lagres for å kunne hentes fram igjen
    I REST er fokus på RESSURSEN, ikke METODEn. RESSURS = INNHOLD.
    Altså: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER



    [KLIKK]



    2 pkt++
    VANT TIL å definere TABELLER og KOLONNER - gir UNØDVENDIGE RESTRIKSJONER
    BONUS-FEATURES
    FULLTEKST-SØK: Alt blir automatisk søkbart



    [NESTE SLIDE]












    Få fokus vekk fra SOA-metoder, innfør ROA.



    Nei til SOA, ja til ROA! Hvis du stadig må finne på kreative metodenavn i



    Etter at vi hadde snakket om hierarki i stedet for RDBMS:
    Diskusjon om forretningslogikk - hva med f.eks. forumtråder? (Håkon)
    Man er så vant til å måtte definere felter og kolonner at det er vanskelig å tenke anderledes. RDBMS bare fordelaktig hvis man absolutt MÅ ha strenge restriksjoner.



    Et annet foredrag på JavaZone: På tide å kaste ut relasjonsdatabasen? Ja!



    CouchDB - Amazon SimpleDB - eksempler på at det fins behov for snillere databaser.



    Tar gjerne utfordring - gi meg eksempler på data som ikke er innhold.



    Hierarki - har du noen gang laget en sånn tabell?
    Hva når en mappe skal ha flere foreldre?
    Hadde det ikke vært fint med en plattform hvor dette er gjennomtenkt og implementert?



    Annet foredrag: På tide å kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  • (Forutsatt at man har Maven installert)
    SJEKKE UT
    SETT MINNE (trenger ofte mer minne for å bygge, ikke for å kjøre)
    BYGG (kan også bygge uten Maven)



    TILGJENGELIG UNDER HELE JAVAZONE - SPØR OM HJELP
  • (Forutsatt at man har Maven installert)
    SJEKKE UT
    SETT MINNE (trenger ofte mer minne for å bygge, ikke for å kjøre)
    BYGG (kan også bygge uten Maven)



    TILGJENGELIG UNDER HELE JAVAZONE - SPØR OM HJELP
  • (Forutsatt at man har Maven installert)
    SJEKKE UT
    SETT MINNE (trenger ofte mer minne for å bygge, ikke for å kjøre)
    BYGG (kan også bygge uten Maven)



    TILGJENGELIG UNDER HELE JAVAZONE - SPØR OM HJELP
  • (Forutsatt at man har Maven installert)
    SJEKKE UT
    SETT MINNE (trenger ofte mer minne for å bygge, ikke for å kjøre)
    BYGG (kan også bygge uten Maven)



    TILGJENGELIG UNDER HELE JAVAZONE - SPØR OM HJELP
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • 5 pkt



    SLING ER LETT Å KOMME I GANG MED - et par SCRIPTS
    PLUGG INN egne BUNDLER
    UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER
    ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  • AVSLUTTER med LINKER til de som vil VITE MER



    4 pkt
    HJEMMESIDE til PROSJEKTET
    15-MINUTTERS INTRO
    MAILINGLISTE
    HJEMMESIDE for JACKRABBIT jcr-IMPLEMENTASJON



    SPØRSMÅL?






    For de som har lyst til å vite mer:



    Wiki’en - et slags springbrett til hjemmesida, men med mye bra halvferdig stoff



    Veldig bra mailingliste - aktive deltakere, får raskt svar
  • Apache Sling presentation at JavaZone 2009

    1. 1. Apache Sling gjør webutvikling moro igjen
    2. 2. Agenda 1. Hva er Apache Sling? 2. Hva er Java Content Repository (JCR)? 3. Kort om OSGi 4. Kort om REST 5. Sentrale konsepter i Apache Sling 6. Demo: Blogg-applikasjon 7. Er Apache Sling noe for deg? 2
    3. 3. vidar@idium.no 3
    4. 4. vidar@idium.no • Utvikler i Idium AS 3
    5. 5. vidar@idium.no • Utvikler i Idium AS • Bygger et produkt basert på Apache Sling 3
    6. 6. vidar@idium.no • Utvikler i Idium AS • Bygger et produkt basert på Apache Sling • Committer til Apache Sling-prosjektet 3
    7. 7. Hva er Apache Sling? 4
    8. 8. Hva er Apache Sling? • “the simplest device for delivering content very fast” 4
    9. 9. Hva er Apache Sling? • “the simplest device for delivering content very fast” 4
    10. 10. Hva er Apache Sling? • “the simplest device for delivering content very fast” • Web-rammeverk dedikert til Java Content Repository (JCR) 4
    11. 11. Hva er Apache Sling? • “the simplest device for delivering content very fast” • Web-rammeverk dedikert til Java Content Repository (JCR) • Open source fra Apache Software Foundation 4
    12. 12. Sling-plattformen 5
    13. 13. Sling-plattformen • bygd på JCR • basert på REST • drevet av OSGi 5
    14. 14. OSGi REST JCR 6
    15. 15. OSGi REST JCR 6
    16. 16. Java Content Repository 7
    17. 17. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 7
    18. 18. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 7
    19. 19. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database 7
    20. 20. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database • Noder og attributter 7
    21. 21. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database • Noder og attributter • Rike datatyper 7
    22. 22. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum 8
    23. 23. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum • OpenJCR (java.net) 8
    24. 24. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum • OpenJCR (java.net) 8
    25. 25. JCR-applikasjoner • Oracle Portal • Enonic Vertical Site • IBM Workplace Web Content • BEA Portal • Hippo CMS Management • JBoss Portal • jLibrary • Day Communiqué • JBoss DNA • Magnolia CMS • Apache James • Sun OpenPortal • Drools • Alfresco ECMS • Fast Enterprise • BEA WebLogic • Idium Web (snart!) Search Portal 9
    26. 26. JSR-170 JSR-170 ❝ The API should be a standard, implementation independent way to access content bi-directionally on a granular level to a content repository” 10
    27. 27. JSR-170 JSR-170 ❝ The API should be a standard, implementation independent way to access content bi-directionally on a granular level to a content repository” 10
    28. 28. Java Content Repository 11
    29. 29. Java Content Repository Database Filsystem 11
    30. 30. Java Content Repository Database Filsystem Lese- tilgang Skrive- tilgang 11
    31. 31. Java Content Repository Database Filsystem et ur Integrit Strukt Lese- tilgang Spør rin g er Trigger e Skrive- tilgang 11
    32. 32. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data 11
    33. 33. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 11
    34. 34. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 12
    35. 35. Java Content Repository Database Filsystem But wait, et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data there’s more! Java Content Repository 12
    36. 36. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 12
    37. 37. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 13
    38. 38. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data st- Fulltek PI søk Java A ne ring ølge Versjo Rekkef uktur Fri str Multi- Event- r value listene Java Content Repository 13
    39. 39. Hvordan ser et repository ut? 14
    40. 40. Hvordan ser et repository ut? Rotnode Attribute Attribute Name: Produkter Name: Nyheter lastUpdate: 09-09-2009 lastUpdate: 09-09-2009 Name: Gressklipper Name: Hurtigmikser Name: Nettsted lansert ... ... price: 4600.00 price: 699.00 lastUpdate: 09-09-2009 colour: white summary: Velkommen ... body: Sist fredag... vidar@idium.no authors: elgar@idium.no Name: Bråker mye Name: Styr unna ... author: jens@gmail.com author: jens@gmail.com body: Klipper pent, ... body: Denne er ikke ... Name: portrett.jpg stars: 4 stars: 1 lastUpdate: 09-09-2009 jcr:content [binærdata] 14
    41. 41. Hvordan ser et repository ut? Rotnode Attribute Attribute Name: Produkter Name: Nyheter lastUpdate: 09-09-2009 lastUpdate: 09-09-2009 Name: Gressklipper Name: Hurtigmikser Name: Nettsted lansert ... ... price: 4600.00 price: 699.00 lastUpdate: 09-09-2009 colour: white summary: Velkommen ... body: Sist fredag... vidar@idium.no authors: elgar@idium.no Name: Bråker mye Name: Styr unna ... author: jens@gmail.com author: jens@gmail.com body: Klipper pent, ... body: Denne er ikke ... Name: portrett.jpg stars: 4 stars: 1 lastUpdate: 09-09-2009 jcr:content [binærdata] 14
    42. 42. Hello, World! 15
    43. 43. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; 15
    44. 44. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); 15
    45. 45. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); 15
    46. 46. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone 15
    47. 47. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo 15
    48. 48. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo Hello, message World! 15
    49. 49. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! 15
    50. 50. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! // Hente innhold Node node = root.getNode(“javazone/demo”); 15
    51. 51. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! // Hente innhold Node node = root.getNode(“javazone/demo”); print(node.getProperty(“message”).getString()); 15
    52. 52. Innhold først, struktur senere 16
    53. 53. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter 16
    54. 54. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter • Restriksjoner kan innføres etterhvert 16
    55. 55. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter • Restriksjoner kan innføres etterhvert • Hierarki vil ofte være tilstrekkelig struktur – unngå referanser på tvers av hierarkiet 16
    56. 56. Blogg-applikasjon 17
    57. 57. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date 17
    58. 58. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date post blog id name author title text Id Id First Intet mer 1 Vidars blogg Vidar 1 1 post! å ... 2 ... ... 2 1 ... ... ... ... ... ... ... ... ... 17
    59. 59. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date image post blog id name author title text image Id Id First Intet mer 1 Vidars blogg Vidar 1 1 NULL post! å ... 2 ... ... 2 1 ... ... NULL ... ... ... ... ... ... ... NULL 17
    60. 60. Blogg-applikasjon RDBS-modell: Blog Post Attachment blogId blogId* attachmentId author postId postId* title filename text date post blog attach id name author title text postId title Id Id mentId First Intet mer 1 Vidars blogg Vidar 1 1 1 1 feriebilde.jpg post! å ... 2 ... ... 2 1 ... ... 2 1 ... ... ... ... ... ... ... ... ... ... ... 17
    61. 61. Blogg-applikasjon JCR-modell: 18
    62. 62. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... 18
    63. 63. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
    64. 64. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
    65. 65. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
    66. 66. Moral Innhold først, strukturere senere 19
    67. 67. Moral Innhold først, strukturere senere – kanskje. 19
    68. 68. OSGi REST JCR 20
    69. 69. OSGi REST JCR 20
    70. 70. The Dynamic OSGi Module System for Java 21
    71. 71. The Dynamic OSGi Module System for Java • Open Services Gateway initiative 21
    72. 72. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler 21
    73. 73. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) 21
    74. 74. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) • Bundler kan ha avhengigheter til andre bundler 21
    75. 75. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) • Bundler kan ha avhengigheter til andre bundler • En bundle eksporterer gitte java-pakker til andre pakker 21
    76. 76. Standard Java-pakkemodell class Package1.ImplClass private String something; public getSomething() 22
    77. 77. Standard Java-pakkemodell Package1 class Package1.ImplClass private String something; public getSomething() 22
    78. 78. Standard Java-pakkemodell Package1 public class Package1.ClassB public void doSomething() { ImplClass some = new ImplClass(); some.getSomething(); } class Package1.ImplClass private String something; public getSomething() 22
    79. 79. Standard Java-pakkemodell Package1 public class Package1.ClassB public void doSomething() { ImplClass some = new ImplClass(); some.getSomething(); } class Package1.ImplClass private String something; public getSomething() 22
    80. 80. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
    81. 81. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
    82. 82. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
    83. 83. OSGi bundles Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
    84. 84. OSGi bundles MyBundle.jar Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
    85. 85. OSGi bundles MyBundle.jar [exports Package2] Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
    86. 86. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
    87. 87. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
    88. 88. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
    89. 89. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
    90. 90. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
    91. 91. OSGi i Apache Sling 24
    92. 92. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles 24
    93. 93. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles • Lett å bytte ut bundles/komponenter med egen funksjonalitet 24
    94. 94. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles • Lett å bytte ut bundles/komponenter med egen funksjonalitet • Lett å utvide med egne bundles 24
    95. 95. Behov for egne bundles 25
    96. 96. Behov for egne bundles • Egne innholdstilbydere 25
    97. 97. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester 25
    98. 98. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester • Initielt innhold 25
    99. 99. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester • Initielt innhold • Plugin-moduler til Jackrabbit 25
    100. 100. OSGi REST JCR 26
    101. 101. OSGi REST JCR 26
    102. 102. REST 27
    103. 103. REST • REpresentional State Transfer • All state holdes av klienten 27
    104. 104. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions 27
    105. 105. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions • Back-to-basic: Bruke HTTP-verbene som de var ment 27
    106. 106. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions • Back-to-basic: Bruke HTTP-verbene som de var ment • GET henter • POST lagrer • PUT oppdaterer • DELETE sletter 27
    107. 107. URLer med mening 28
    108. 108. URLer med mening • URLen peker til en ressurs, ikke en metode 28
    109. 109. URLer med mening • URLen peker til en ressurs, ikke en metode • http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 28
    110. 110. URLer med mening • URLen peker til en ressurs, ikke en metode • http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow 28
    111. 111. URLer med mening • URLen peker til en ressurs, ikke en metode • 8402 http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow 28
    112. 112. URLer med mening • URLen peker til en ressurs, ikke en metode • 8402 http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow • http://domain.com/articles/siste_nytt_fra_javazone 28
    113. 113. Alt kan uttrykkes med GET, POST, PUT, DELETE 29
    114. 114. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST GET /listWebshopOrders POST /submitWebshopOrder?name=... Takk, ordren din er registrert. GET /getWebshopOrderDetail?id=352 POST /cancelWebshopOrder?id=352 POST /updateWebshopOrder?id=352&... 29
    115. 115. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
    116. 116. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
    117. 117. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
    118. 118. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
    119. 119. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
    120. 120. OSGi REST JCR 30
    121. 121. OSGi REST JCR 30
    122. 122. Apache Sling er et REST-API til JCR 31
    123. 123. Apache Sling er et REST-API til JCR +++ 31
    124. 124. Virtuelt ressurs-tre 32
    125. 125. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet 32
    126. 126. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet 32
    127. 127. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet • En filmappe 32
    128. 128. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet • En filmappe • Din eksisterende database 32
    129. 129. Virtuelt ressurs-tre jcr:root Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 UserJsonServlet Second p.. text: ... date: ... images orders JCR-node Servlet Filmappe RDBMS 33
    130. 130. Ressurser En ressurs er en abstraksjon av noe som kan adresseres med en URL 34
    131. 131. Egenskaper ved en ressurs 35
    132. 132. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR 35
    133. 133. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR • Type • for JCR-noder: sling:resourceType 35
    134. 134. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR • Type • for JCR-noder: sling:resourceType • Metadata • f.eks. sist endret-dato 35
    135. 135. Resource Resolver 36
    136. 136. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving 36
    137. 137. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
    138. 138. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving http://domain.com/vidars_blogg/first_post.fulltext.html Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
    139. 139. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving http://domain.com/vidars_blogg/first_post.fulltext.html Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
    140. 140. Rendering av ressurser 37
    141. 141. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript 37
    142. 142. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript • Ressursens ressurstype bestemmer hvilken servlet/skript som velges 37
    143. 143. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript • Ressursens ressurstype bestemmer hvilken servlet/skript som velges • Servleter/skript finnes i det samme virtuelle ressurstreet 37
    144. 144. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com 38
    145. 145. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path 38
    146. 146. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
    147. 147. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
    148. 148. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
    149. 149. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Selector Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
    150. 150. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Selector Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost bloggpost 38
    151. 151. Servlet/Script Resolver fulltext html bloggpost 39
    152. 152. Servlet/Script Resolver bloggpost fulltext html 39
    153. 153. Servlet/Script Resolver / apps / bloggpost / fulltext / html 39
    154. 154. Servlet/Script Resolver / apps / bloggpost / fulltext / html 39
    155. 155. Request-prosessering 40
    156. 156. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 40
    157. 157. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 40
    158. 158. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 40
    159. 159. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 4. Kall servleten/skriptet 40
    160. 160. Request-prosessering 1. Finn fram til ressursen Reso ur ce-first process ing Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 4. Kall servleten/skriptet 40
    161. 161. Hva med min egen kode? 41
    162. 162. Hva med min egen kode? • Java-kode pakkes i OSGi-bundler 41
    163. 163. Hva med min egen kode? • Java-kode pakkes i OSGi-bundler • Bundlen deployes til en kjørende Sling- instans (hot-deploy) 41
    164. 164. Din egen servlet public class MyServlet extends HttpServlet { doGet(HttpServletRequest req, HttpServletResponse res) { res.getWriter().println(author); } } 42
    165. 165. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends HttpServlet { doGet(HttpServletRequest req, HttpServletResponse res) { res.getWriter().println(author); } } 42
    166. 166. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { res.getWriter().println(author); } } 42
    167. 167. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { Resource resource = res.getResource(); ValueMap values = resource.adaptTo(ValueMap.class); String author = values.get(“author”, String.class); res.getWriter().println(author); } } 42
    168. 168. Dependency injection 43
    169. 169. Dependency injection /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { repository.doStuff(); } } 43
    170. 170. Dependency injection /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { /**@scr.reference */ private SlingRepository repository; doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { repository.doStuff(); } } 43
    171. 171. Andre komponenter 44
    172. 172. Andre komponenter • Servlet-filtre 44
    173. 173. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer 44
    174. 174. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer • Resource-providere 44
    175. 175. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer • Resource-providere • ... 44
    176. 176. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer Hot- ploy! de • Resource-providere • ... 44
    177. 177. Rendering-scripts 45
    178. 178. Rendering-scripts Ressurser kan rendres med scripts. 45
    179. 179. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
    180. 180. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
    181. 181. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
    182. 182. Rendering-scripts • Raskeste måten å utvikle på • Scripts kan hentes fra repositoriet eller fra bundler 46
    183. 183. Ressurs-rendering i ESP 47
    184. 184. Ressurs-rendering i ESP First post body: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost author: Vidar summary: Alltid drømt om å v.. 47
    185. 185. Ressurs-rendering i ESP <h1><%=currentNode.name%></h1> First post <% body: Intet mer å... if (currentNode.author) { %> date: 08-09-2009 sling:resourceType: bloggpost author: Vidar Av <%=currentNode.author%> summary: Alltid drømt om å v.. <% } %> <p style=”font-weight: bold”><%=currentNode.summary%></p> <%=currentNode.body%> <% sling.include(currentNode.path + “images.html”); %> 47
    186. 186. Ressurs-rendering i ESP /apps/bloggpost/fulltext/html.esp <h1><%=currentNode.name%></h1> First post <% body: Intet mer å... if (currentNode.author) { %> date: 08-09-2009 sling:resourceType: bloggpost author: Vidar Av <%=currentNode.author%> summary: Alltid drømt om å v.. <% } %> <p style=”font-weight: bold”><%=currentNode.summary%></p> <%=currentNode.body%> <% sling.include(currentNode.path + “images.html”); %> 47
    187. 187. Arkitektur 48
    188. 188. Arkitektur JCR API Apache Jackrabbit 48
    189. 189. Arkitektur JCR API OSGi Apache Jackrabbit Apache Felix 48
    190. 190. Arkitektur Sling Engine / APIer JCR API OSGi Apache Jackrabbit Apache Felix 48
    191. 191. Arkitektur OSGI-bundler Scripts Initielt innhold Din applikasjon Sling Engine / APIer JCR API OSGi Apache Jackrabbit Apache Felix 48
    192. 192. Demo Poste nytt innhold
    193. 193. Demo En mini-blogg-applikasjon med 70 linjer kode Could you just twitter me the code you’ve written today?
    194. 194. 1: Opprette nye poster <form method=”POST”> Title: <input type=”text” name=”title” /> Summary: <textarea name=”summary”></textarea> Body: <textarea name=”body”></textarea> <button type=”submit”>Lagre</button> <input type=”hidden” name=”:redirect” value=”*”/> </form>
    195. 195. 2. Hente eksisterende <script src=”/system/sling.js”></script> <form method=”POST”> ... </form> <!-- Sett feltverdier fra nodens property-verdier --> <script>Sling.wizard();</script>
    196. 196. 3. Navigasjon <ul> <li> <a href="/content/blog/*.html">[Ny post]</a> <script> var posts = Sling.getContent("/content/blog", 2); for(var post in posts) { document.write("<li><a href='/content/blog/" + i + "'>" + posts[post].title + "</a></li>"); } </script> </ul> Koden er tilgjengelig på http://tinyurl.com/slingblog46
    197. 197. Litt for simpelt for deg? 54
    198. 198. Litt for simpelt for deg? • Hva med • On-the-fly skalering av bilder • RSS-feed • Kommentarer • Separat admin-grensesnitt 54
    199. 199. Hva skjedde her? Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
    200. 200. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
    201. 201. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
    202. 202. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
    203. 203. Thumbnail-generator: OSGi-komponent import javax.jcr.*; import javax.jcr.observation.*; import org.osgi.service.component.ComponentContext; /** * Observerer endringer under /content/espblog, og * genererer thumbnails for bilder som lastes opp. * @scr.service * @scr.component immediate=”true” */ public class ThumbnailGeneratorServiceImpl implements ThumbnailGeneratorService, EventListener {
    204. 204. Registrere EventListener /** @scr.reference (settes automatisk av OSGi-rammeverket*/ private SlingRepository repository; /** kalles av OSGi-rammeverket når komponenten startes */ protected void activate(ComponentContext context) { Session s = repository.loginAdministrative(); // Observer nt:file NODE_ADDED ObservationManager m = s.getWorkspace().getObservationManager(); String[] types = {“nt:file”}; m.addEventListener( this, Event.NODE_ADDED, “/espblog/posts”, ... ); }
    205. 205. Eventhandler /** * Kalles av JCR-implementasjonen hver gang det skjer en * event som vi har registrert oss for */ public void onEvent(EventIterator it) { while (it.hasNext()) { Event event = it.nextEvent(); String p = event.getPath(); if (!p.contains(“thumbnails”)) { Node n = session.getRootNode().getNode(p); createThumbnails(addedNode); } } }
    206. 206. En typisk Sling-applikasjon
    207. 207. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation
    208. 208. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation • Sling-snacks • Enkel skript-mapping • REST-grensesnitt • Innholdslasting
    209. 209. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation • Sling-snacks • Enkel skript-mapping • REST-grensesnitt • Innholdslasting • Alt pakket i en OSGi-bundle - deployes til server
    210. 210. Bør du vurdere Apache Sling / JCR? 60
    211. 211. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? 60
    212. 212. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? • Ja, det gjør du. 60
    213. 213. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture 60
    214. 214. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture • Lei av å måtte endre databasestrukturen for å innføre ny funksjonalitet? 60
    215. 215. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture • Lei av å måtte endre databasestrukturen for å innføre ny funksjonalitet? Versjonering Tilgangskontroll Fulltekst-søk med Apache Lucene 60
    216. 216. Kom i gang
    217. 217. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run
    218. 218. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run
    219. 219. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run Eller last ned ferdig bygd kjørbar .jar eller .war http://sling.apache.org/site/downloads.cgi
    220. 220. Oppsummering 62
    221. 221. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon 62
    222. 222. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) 62
    223. 223. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) • Fremdeles ungt, stor økning i brukerbase 62
    224. 224. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) • Fremdeles ungt, stor økning i brukerbase • Buzzword-compliant Hot- REST JSON Script d eploy 62
    225. 225. Lesestoff • http://sling.apache.org • .../site/discover-sling-in-15-minutes.html • dev@sling.apache.org • http://jackrabbit.apache.org 63
    226. 226. vidar@idium.no 64

    ×