+ All Categories
Home > Documents > Rapid JCR applications development with Apache Sling

Rapid JCR applications development with Apache Sling

Date post: 12-Sep-2021
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
28
Rapid JCR applications development with Apache Sling Bertrand Delacrétaz, Senior R&D Developer, Day Software [email protected] - grep.codeconsult.ch Slides revision: 2008-11-05 Slides theme design: David Nuescheler Don’t miss Jukka on JCR, Thursday! code is there is this slide busy enough?
Transcript
Page 1: Rapid JCR applications development with Apache Sling

Rapid JCR applications developmentwith Apache Sling

Bertrand Delacrétaz, Senior R&D Developer, Day [email protected] - grep.codeconsult.ch

Slides revision: 2008-11-05Slides theme design: David Nuescheler

Don’t miss

Jukka on JCR,

Thursday!

code is there

is this slide busy enough?

Page 2: Rapid JCR applications development with Apache Sling

Intro to JCR

JCR = Java Content Repository API

JSR-170 / JSR-283

Everything Is Content - and JCR manages it as trees of Nodes and Properties, using rich data types.

silver

Don’t miss

Jukka on JCR,

Thursday!

Page 3: Rapid JCR applications development with Apache Sling

What’s JCR?

`çåíÉåí=oÉéçëáíçêó=Ñçê=g~î~qj=íÉÅÜåçäçÖó=^mf

péÉÅJiÉ~ÇW

a~ó=pçÑíï~êÉ

pí~íìëW=

cáå~ä=oÉäÉ~ëÉ=NTJàìåJOMMR

gpoJNTM

bñéÉêí=dêçìéW

Page 4: Rapid JCR applications development with Apache Sling

bñéÉêí=dêçìéW

gpoJNTM gpoJOUP

`çåíÉåí=oÉéçëáíçêó=Ñçê=g~î~qj=íÉÅÜåçäçÖó=^mf=îOKM

péÉÅJiÉ~ÇW

a~ó=pçÑíï~êÉ

pí~íìëW=

mìÄäáÅ=oÉîáÉï=`äçëÉÇ=ëÉéJOMMT

What’s JCR?

Page 5: Rapid JCR applications development with Apache Sling

What’s JCR?

“The API should be a standard, implementation independent, way to access content bi-directionally on a granular level to a content repository.” ?

Page 6: Rapid JCR applications development with Apache Sling

Best of both worlds.

data base filesystem

content repository

read

write

hier-archiesstreams

lockingaccesscontrol

integrity structure

txquery

un-structured“full-text” sort

orderversio

ningobser-vation

multi-value

Page 7: Rapid JCR applications development with Apache Sling

Known compliant Repositories

Apache Jackrabbit Oracle XML DBExo

ECMS PlatformMicrosoft

Sharepoint OpenText Livelink

Day CRX IBM FileNet P8 Xythos Repository Alfresco ECM Vignette V7

Interwoven Repository IBM CM EMC Documentum

How many

RDBMS vendors

do you need?+hundreds of TCKsregistered

* *

*

*

* using third party connector

*

Page 8: Rapid JCR applications development with Apache Sling

Sourcemix Sourcemix

Percussion Rhythmix

Lutece Portal

QuickWCM WCMS

Jahia Framework

Hippo CMS

InfoQ Online CommunityNuxeo ECM

Sakai E-learning

TYPO3 v5.0 WCMGX WebManager

Exo ECMS Platform

Liferay Enterprise Portal

Artifactory Maven Proxy

IBM FileNet WebSiteManagerApache James

medic-2-medic mapofmedicine

Day Communiqué WCMS

Apache Tapestry

Day Communique Collab

QSLabs ComplianceApache

Cocoon

Alfresco ECMS

Apache SlingMindquarry

Collaboration

Day Communique DAM

magnolia WCMS

JBoss Portal

Some known JCR Applications

Sun OpenPortal Interface 21

Spring Framework

Fast Enterprise SearchOracle PortalBEA Portal

Page 9: Rapid JCR applications development with Apache Sling

JCR code excerptRepository repository = new TransientRepository();Session session = repository.login(...);

// Create contentNode root = session.getRootNode();Node hello = root.addNode("hello");Node world = hello.addNode("world");

world.setProperty("message", "Hello, World!");session.save();

// Retrieve contentNode node = root.getNode("hello/world");print(node.getPath());print(node.getProperty("message").getString());

Page 10: Rapid JCR applications development with Apache Sling

join the fun!

Sling builds on top of JCR

Scriptable applications layer on top of JCR

OSGi-based industrial-strength framework

Simple, powerful, JCR inside

Runs on Apache Jackrabbit by default

http://incubator.apache.org/sling

Page 11: Rapid JCR applications development with Apache Sling

JCR: David Nuescheler

REST over JCR

REST -> Roy T. Fielding

released y2k162 pages

v1.0 released 2005

+300 pages

Page 12: Rapid JCR applications development with Apache Sling

Repository

Reclaiming the web.Sling URL decomposition.

/cars/audi/s4.details.html

Content Repository Path

...selects a particular script

Page 13: Rapid JCR applications development with Apache Sling

Sling architecture

OSGi bundles

OSGi webapp

OSGi framework(Apache Felix)

JCRrepository

javascript

JSP

Ruby

Velocity

etc..

debugger

WebDAVserver

Sling OSGiconsole

browserfilesystem

JSR-170 API

HTTP

resource resolution

custom servletsand components

JSR 223 scripting

servlet/script resolution

standardservlets

POST,

json GET

ESP

server-side

javascript

sling.js

utility

WebDAV

access

Friday: Felix

Meschberger on

scriptingThursday: Carsten

on Apache FelixThursday: Jukka

on JCR I should do my

slides on post-its

only

Page 14: Rapid JCR applications development with Apache Sling

A minimal Sling blogConsisting of one .esp script

cat /Volumes/localhost/apps/blog/blog.esp | wc -l54

get the code at

grep.codeconsult.ch

Page 15: Rapid JCR applications development with Apache Sling

Sling POST servlet# POST to Slingcurl -F title=hello http://localhost:8888/foo-> 200 OK

# GET created node in json formatcurl http://localhost:8888/foo.tidy.json{ "jcr:primaryType": "nt:unstructured", "title": "hello"}

POST

parameters set

node properties

Page 16: Rapid JCR applications development with Apache Sling

blog step 1: create content

! <form method="POST">! Title:! <input type="text" name="title" style="width:100%"/>! ! Text:! <textarea style="width:100%" name="text"></textarea>! ! <input type="submit" value="save"/>! ! <input type="hidden" name=":redirect" value="*"/>! </form>

Form fields drive

the content

model

Page 17: Rapid JCR applications development with Apache Sling

blog step 2: retrieve content

<script src="/system/sling.js"></script>! <form method="POST">...</form>

<!-- initialize form fields from current node values --><script>Sling.wizard();</script>

Instant CRU(D)

Page 18: Rapid JCR applications development with Apache Sling

blog step 3: navigation <ul> <li> <a href="/content/blog/*"> [Create new post]</a> </li>! <script>! var posts = Sling.getContent("/content/blog", 2);! for(var post in posts) {! ! document.write( "<li><a href=’” + post + "'>" + posts[post].title + "</a></li>");! }! </script> </ul>

Page 19: Rapid JCR applications development with Apache Sling

we got a blog!

html form + Sling.wizard() + Sling.getContent()

Page 20: Rapid JCR applications development with Apache Sling

The filetagger sampleESP scripting + java + javascript + YUI

OSGi bundle, initial content, WebDAV, observation, RAD

Page 21: Rapid JCR applications development with Apache Sling

Filetagger demobuckle up

Page 22: Rapid JCR applications development with Apache Sling

Filetagger source code filespom.xml - defines and configures OSGi bundle, initial content path, etc.

TagParser.java, TagParserImpl.java - observe rawtags and parse into tags

/apps/filetagger/filetagger.esp - main app page, YUI tree/apps/filetagger/browse.esp - browse tags page/apps/filetagger/filetagger.js - YUI tree code

/apps/filetagger/tags/tags.esp - query for a given tag/apps/filetagger/tags/siblings.esp - tag siblings navigation

/apps/filetagger/loadtags.esp - utility to display tags/apps/filetagger/menu.esp - page menu

Page 23: Rapid JCR applications development with Apache Sling

TagParserImpl - OSGi service/** TagParser service, listens for changes to "rawtags" * ! properties, and sets the multivalue "tags" property * ! accordingly.** @scr.service* @scr.component* immediate="true"* @scr.property* name="service.description"* value="Sling TagParser sample service"*/public class TagParserImpl implements TagParser, EventListener {

Apache Felix

“bundle” and

“SCR” plugins do

the rest

Page 24: Rapid JCR applications development with Apache Sling

TagParserImpl - observe and process// slightly simplified (pseudo-)codeprotected void activate(ComponentContext context) { session = repository.login(); final int events = PROPERTY_CHANGED |PROPERTY_REMOVED; session.getWorkspace().getObservationManager().addEventListener( ! ! this, events, DATA_PATH, ...); }

// Event callbackpublic void onEvent(EventIterator it) { while(it.hasNext()) { final Event e = it.nextEvent(); if(e.getPath().endsWith("/" + RAWTAGS_PROPERTY)) { handlePropertyChange(e);}}}

Page 25: Rapid JCR applications development with Apache Sling

TagParserImpl - compute tags// called with a JCR event e// property rawtags contains for example “pop, slow; guitar”Property rawtags = (Property)session.getItem(e.getPath());Node parent = rawtags.getParent();final String [] tagArray = parseTags(rawtags.getValue());

// add a node for each unique tag under our “tags” nodecreateTagNodes(tagArray);parent.setProperty(TAGS_PROPERTY, tagArray);

parent.save();

Page 26: Rapid JCR applications development with Apache Sling

Filetagger script mapping/apps/filetagger/filetagger.esp : http:/.../content/filetagger (due to content/... path)

/apps/filetagger/browse.esp : http:/.../content/filetagger/tags.browse.html

/apps/filetagger/tags/tags.esp : http:/.../content/filetagger/tags/sometag due to sling:resourceType on the “sometag” node

/apps/filetagger/tags/siblings.esp :/apps/filetagger/menu.esp : included by other scripts

Page 27: Rapid JCR applications development with Apache Sling

Filetagger: saving tags from YUIYAHOO.widget.TagsNode.prototype.saveEditorValue =function(editorData) { super.call(this,editorData); var data = "rawtags=" + escape(this.label);

// the YUI tree node knows its JCR path so // we just need to POST the property to it this.SlingPost(data, this.jcrPath);};

POST /content/filetagger/

data/feel-good.mp3/

jcr:content

...rawtags=jamesbrown

%20funk%20groove

Page 28: Rapid JCR applications development with Apache Sling

We got a typical Sling application!

JCR features: WebDAV, observation, multi-value properties, nt:unstructured

Sling goodies: simple script mappings (BYOL), POST servlet, RESTful, sling.js

OSGi bundle, code + initial contentFelix and Sling Maven plugins

join the fun!

http://incubator.apache.org/slinghttp://dev.day.comhttp://contentcentric.org/

“Sling is not a web

applications

framework, it’s just a

web framework”


Recommended