rapid jcr applications development with apache sling
TRANSCRIPT
![Page 1: Rapid JCR applications development with Apache Sling](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/19.jpg)
we got a blog!
html form + Sling.wizard() + Sling.getContent()
![Page 20: Rapid JCR applications development with Apache Sling](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/20.jpg)
The filetagger sampleESP scripting + java + javascript + YUI
OSGi bundle, initial content, WebDAV, observation, RAD
![Page 21: Rapid JCR applications development with Apache Sling](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/21.jpg)
Filetagger demobuckle up
![Page 22: Rapid JCR applications development with Apache Sling](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071600/613d2153736caf36b759abd6/html5/thumbnails/28.jpg)
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”