Shooting rabbits with sling

Tomasz Rękawek
Tomasz RękawekCommitter at Apache Sling
Shooting rabbits with sling
Introduction to Apache Jackrabbit &
Apache Sling
JCR
• Content Repository API for Java
• JSR-170 & JSR-283
• javax.jcr
• Object database
• Hierarchical data model
• Apache Jackrabbit – reference implementation
Mantra: everything is content
• Content is content
– Blogs, articles, posts, etc.
• Structured data
– List of addresses in e-mail database
• Unstructured data
– Word document
• ACLs
• Code
Content hierarchy
• JCR has tree-like data model
• Repository consists of items
• Item can be node or property
• Node children are properties or other nodes
• Properties are leaves
Node
• Nodes form content hierarchy
• Nodes are named
• Each node has primary type specifying it’s structure
(allowed and required children and properties)
– Something like class
– Eg. myapp:Contact requires properties myapp:givenName
and myapp:familyName
• Nodes can also have mixin types
– Something like interface
– Eg. mix:versionable, mix:lockable or myapp:Emailable
• Popular types:
– nt:base, nt:unstructured, nt:folder
Property
• Property contains data
• Types:
– string, binary, long, double, date, boolean, name,
path, reference
• Can be multivalued
Searching
• Node names and properties are indexed
• Jackrabbit uses Apache Lucene
• Supported query languages:
– XPath
– JCR-SQL
– JCR-SQL2 (recommended)
SQL2
SELECT * FROM [cq:PageContent] AS s
WHERE ISDESCENDANTNODE([/content])
AND s.[jcr:title] = ’Moja strona’
• Main purpose: find node by property contents
• Avoid queries with parent path (as it’s not
indexed)
– It’s better to create a mixin or marker property
• We don’t JOIN
• SQL and XPath are isomorphic
Versioning
• Any subtree can be versioned
• Add mixin mix:versionable
• node.checkin()
– Creates new version
– Makes the node read-only
• node.checkout()
– Allows to modify the node
• Usage examples:
– Page versions at many levels
Observation
• Event listener
• We can filter events with:
– Event type
– Path
– Node types
– An explicit list of nodes
• Usage examples:
– Automatic workflows
– Generating thumbnails
– “Last modified” date
– Indexing in internal and external search engine
Other features
• Locking
• Access control
– Users & groups
– Groups can be members of other groups
– Privileges on nodes to read, write, etc.
JCR – advantages and problems
• Advantages
– Site structure is easy to reflect
– Flexible
– Hierarchical structure
• Disadvantages
– Storing large amount of structured data is neither easy nor
efficient
• Don’t load CSV file with 1 000 000 rows
– Data has to be denormalized (as there is no JOINs)
– Clustering is tricky
• Master-slave works OK
• Waiting for Jackrabbit 3.0 – codename Oak
– Transactions…
Apache Sling
HTTP access to JCR repository
Apache Sling
• Web framework
• RESTful access to JCR nodes
• Powered by OSGi
• Support multiple scripting languages (JSP,
Groovy, …)
• Open source, developed by Adobe within
Apache foundation
REST
# Create / Update
$ curl -u admin:admin –d name=‚Java User Group‛ –d city=Poznan 
localhost:8080/content/hello
# Read
$ curl localhost:8080/content/hello.tidy.json
# Delete
$ curl -X DELETE -u admin:admin 
localhost:8080/content/hello
Resource URL
• Resource path: /content/hello
– http://localhost:8080/content/hello.xml
– http://localhost:8080/content/hello.json
– http://localhost:8080/content/hello.html
• There are simple built-in renderers
• Each can be overridden
sling:resourceType
• In order to create custom rendition we need
to set sling:resourceType property
• It’s a JCR path to some renderer
• Renderer can be JSP, Java Servlet, Scala,
Python, Groovy, Ruby or ESP (internal Sling
language, kind of backend JS)
• Content-centric: you don’t invoke script
directly
Sample HTML renderer
<html>
<head><title>ESP example</title>
</head>
<body>
<h1>
Hello
<%= currentNode.getProperty('name') %>
</h1>
<h2>
<%= currentNode.getProperty('city') %>
</h2>
</body>
</html>
How does it work?
• Get node path from
URL
• Get extension
• Get HTTP method
GET /content/home.html
• Find
sling:resourceType
• Choose appropriate
script
(POST.jsp, json.jsp, e
tc.)
/apps/jug/hellocomponent
• Render node using
found renderer and
appropriate script
Hello JUG!
URL decomposition
/content/corporate/jobs/developer.print.a4.html/mysuffix
• Resource path
• Selectors
• Extension
• Suffix
Resource path
/content/corporate/jobs/developer.print.a4.html/mysuffix
• Substring before the first dot
• Path to the resource in JCR
• This part of the URL defines data.
– Rest defines way of the presentation.
Extension
/content/corporate/jobs/developer.print.a4.html/mysuffix
• Defines content format
• Most common: html, json, xml
• But may be png
Selectors
/content/corporate/jobs/developer.print.a4.html/mysuffix
• Specifies additional variants of the given content type
• Optional
• Multiple selectors are allowed
Suffix
/content/corporate/jobs/developer.print.a4.html/mysuffix
• Additional information passed to the rendering script
• Similar to GET ?name=value parameter, but can be cached
Script resolution
GET /content/corporate/jobs/developer.print.a4.html/mysuffix
/content/corporate/jobs/developer/sling:resourceType = cognifide/hr/jobs
/apps/cognifide/hr/jobs:
1. jobs.print.a4.GET.html.esp
2. jobs.print.a4.html.esp
3. jobs.print.a4.esp
4. jobs.print.GET.html.esp
5. jobs.print.html.esp
6. jobs.print.esp
7. jobs.GET.html.esp
8. jobs.html.esp
9. jobs.GET.esp
10. jobs.esp
Composed resources
Page
title
Left column Main
<html>
<head><title><%= currentNode.getProperty(’title') %></title></head>
<body>
<div class=‚left_column‛>
<sling:include path=‚left‛ resourceType=‚foundation/parsys‛/>
</div>
<div class=‚main‛>
<sling:include path=‚main‛ resourceType=‚foundation/parsys‛/>
<div>
</body>
</html>
Paragraph system
<c:forEach var=‚par‛ items=‚${resource.children}‛>
<sling:include
path=‚${par.path}‛
resourceType=‚${par[‘sling:resourceType’]}‛/>
</c:forEach>
Left column
Article
list
Twitter
widget
Contact
info
Resource Resolver
• In JCR we had Node
• In Sling we have Resource
• Virtual tree of resources, reflecting the JCR
• ResourceResolver – transforms nodes to resources
• It’s possible to create own ResourceResolvers and
reflect other data sources
– Filesystem,
– MongoDB,
– PostgreSQL
• Many ResourceResolvers may work together
– Like mount in UNIX
Resolver usage
Resource res = resourceResolver.getResource(‚/content/hello‛);
ModifiableValueMap map = res.adaptTo(ModifiableValueMap.class);
String name = map.get(‚name‛, String.class);
map.put(‚name‛, name.toUpperCase());
resourceResolver.commit();
Node node = res.adaptTo(javax.jcr.Node);
Session = resourceResolver.adaptTo(javax.jcr.Session);
Why do we use resolver?
• API is friendlier than JCR
• Sling provides us resources and resolver in
many places
– Servlets
– Scripts
Servlets
• Like ordinary servlets but…
• Can be assigned to:
– Paths
– Selectors
– Extensions
– Resource types (so can act as rendering script)
• doGet(), doPost() methods are invoked with
– SlingHttpServletRequest and …Response
– Additional methods for getting requested resource,
resolver, decompose URL, etc.
Sample Sling servlet
@Component
@Service
@SlingServlet(resourceTypes = ‛jug/hellocomponent‛)
public class AuthCheckerServlet extends SlingSafeMethodsServlet {
@Reference
private ResourceResolverFactory resolverFactory;
public void doGet(SlingHttpServletRequest request,
SlingHttpServletResponse response) {
response.getWriter().println(‚Hello world‛);
}
}
Sling – pros and cons
• Similar to JCR
• Pros
– Natural reflection of site and filesystem structure
• Document repositories, Digital Asset Management
– OSGi stack
– Javascript has easy access to repository
• Cons
– Security issues
• internal resources available as xml and json,
• handling user generated content
– Lack of free tools, eg. repo explorer
Q&A
1 of 34

More Related Content

What's hot(20)

Avik_RailsTutorialAvik_RailsTutorial
Avik_RailsTutorial
tutorialsruby423 views
JavaCro'15 - Elasticsearch as a search alternative to a relational database -...JavaCro'15 - Elasticsearch as a search alternative to a relational database -...
JavaCro'15 - Elasticsearch as a search alternative to a relational database -...
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association1.6K views
Building a spa_in_30minBuilding a spa_in_30min
Building a spa_in_30min
Michael Hackstein612 views
OSOM - Ruby on Rails OSOM - Ruby on Rails
OSOM - Ruby on Rails
Marcela Oniga447 views
Orm and hibernateOrm and hibernate
Orm and hibernate
s4al_com650 views
Slug: A Semantic Web CrawlerSlug: A Semantic Web Crawler
Slug: A Semantic Web Crawler
Leigh Dodds3.5K views
Php reports sumitPhp reports sumit
Php reports sumit
Sumit Biswas599 views
Drupal is not your Website Drupal is not your Website
Drupal is not your Website
Phase22.1K views
QconQcon
Qcon
adityaagarwal16.5K views
Qcon 090408233824-phpapp01Qcon 090408233824-phpapp01
Qcon 090408233824-phpapp01
jgregory1234266 views
Web technology  P B JadhavWeb technology  P B Jadhav
Web technology P B Jadhav
PRASHANT JADHAV108 views

Similar to Shooting rabbits with sling

PhpPhp
Phpmohamed ashraf
326 views6 slides
PhpPhp
Phpmohamed ashraf
387 views6 slides
PhpPhp
PhpSiva Subramaniyan
293 views6 slides
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes WorkshopErik Hatcher
6.1K views108 slides

Similar to Shooting rabbits with sling(20)

PhpPhp
Php
mohamed ashraf326 views
PhpPhp
Php
mohamed ashraf387 views
PhpPhp
Php
Siva Subramaniyan293 views
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes Workshop
Erik Hatcher6.1K views
REST easy with API PlatformREST easy with API Platform
REST easy with API Platform
Antonio Peric-Mazar2.5K views
Apache Content TechnologiesApache Content Technologies
Apache Content Technologies
gagravarr394 views
itPage LDC 09 PresentationitPage LDC 09 Presentation
itPage LDC 09 Presentation
Eric Landmann628 views
CI_CONF 2012: Scaling - Chris MillerCI_CONF 2012: Scaling - Chris Miller
CI_CONF 2012: Scaling - Chris Miller
The Huffington Post Tech Team414 views
CI_CONF 2012: ScalingCI_CONF 2012: Scaling
CI_CONF 2012: Scaling
Chris Miller1.8K views
Solr Application Development TutorialSolr Application Development Tutorial
Solr Application Development Tutorial
Erik Hatcher14.6K views
HDFCloud Workshop: HDF5 in the CloudHDFCloud Workshop: HDF5 in the Cloud
HDFCloud Workshop: HDF5 in the Cloud
The HDF-EOS Tools and Information Center1.2K views
01 html-introduction01 html-introduction
01 html-introduction
Mohsin Mushtaq295 views

More from Tomasz Rękawek(9)

Radio ad blockerRadio ad blocker
Radio ad blocker
Tomasz Rękawek154 views
Emulating Game Boy in JavaEmulating Game Boy in Java
Emulating Game Boy in Java
Tomasz Rękawek3.4K views
SlingQuerySlingQuery
SlingQuery
Tomasz Rękawek2K views
Code metricsCode metrics
Code metrics
Tomasz Rękawek1.3K views
Sling Dynamic IncludeSling Dynamic Include
Sling Dynamic Include
Tomasz Rękawek4K views

Recently uploaded(20)

Shooting rabbits with sling

  • 1. Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling
  • 2. JCR • Content Repository API for Java • JSR-170 & JSR-283 • javax.jcr • Object database • Hierarchical data model • Apache Jackrabbit – reference implementation
  • 3. Mantra: everything is content • Content is content – Blogs, articles, posts, etc. • Structured data – List of addresses in e-mail database • Unstructured data – Word document • ACLs • Code
  • 4. Content hierarchy • JCR has tree-like data model • Repository consists of items • Item can be node or property • Node children are properties or other nodes • Properties are leaves
  • 5. Node • Nodes form content hierarchy • Nodes are named • Each node has primary type specifying it’s structure (allowed and required children and properties) – Something like class – Eg. myapp:Contact requires properties myapp:givenName and myapp:familyName • Nodes can also have mixin types – Something like interface – Eg. mix:versionable, mix:lockable or myapp:Emailable • Popular types: – nt:base, nt:unstructured, nt:folder
  • 6. Property • Property contains data • Types: – string, binary, long, double, date, boolean, name, path, reference • Can be multivalued
  • 7. Searching • Node names and properties are indexed • Jackrabbit uses Apache Lucene • Supported query languages: – XPath – JCR-SQL – JCR-SQL2 (recommended)
  • 8. SQL2 SELECT * FROM [cq:PageContent] AS s WHERE ISDESCENDANTNODE([/content]) AND s.[jcr:title] = ’Moja strona’ • Main purpose: find node by property contents • Avoid queries with parent path (as it’s not indexed) – It’s better to create a mixin or marker property • We don’t JOIN • SQL and XPath are isomorphic
  • 9. Versioning • Any subtree can be versioned • Add mixin mix:versionable • node.checkin() – Creates new version – Makes the node read-only • node.checkout() – Allows to modify the node • Usage examples: – Page versions at many levels
  • 10. Observation • Event listener • We can filter events with: – Event type – Path – Node types – An explicit list of nodes • Usage examples: – Automatic workflows – Generating thumbnails – “Last modified” date – Indexing in internal and external search engine
  • 11. Other features • Locking • Access control – Users & groups – Groups can be members of other groups – Privileges on nodes to read, write, etc.
  • 12. JCR – advantages and problems • Advantages – Site structure is easy to reflect – Flexible – Hierarchical structure • Disadvantages – Storing large amount of structured data is neither easy nor efficient • Don’t load CSV file with 1 000 000 rows – Data has to be denormalized (as there is no JOINs) – Clustering is tricky • Master-slave works OK • Waiting for Jackrabbit 3.0 – codename Oak – Transactions…
  • 13. Apache Sling HTTP access to JCR repository
  • 14. Apache Sling • Web framework • RESTful access to JCR nodes • Powered by OSGi • Support multiple scripting languages (JSP, Groovy, …) • Open source, developed by Adobe within Apache foundation
  • 15. REST # Create / Update $ curl -u admin:admin –d name=‚Java User Group‛ –d city=Poznan localhost:8080/content/hello # Read $ curl localhost:8080/content/hello.tidy.json # Delete $ curl -X DELETE -u admin:admin localhost:8080/content/hello
  • 16. Resource URL • Resource path: /content/hello – http://localhost:8080/content/hello.xml – http://localhost:8080/content/hello.json – http://localhost:8080/content/hello.html • There are simple built-in renderers • Each can be overridden
  • 17. sling:resourceType • In order to create custom rendition we need to set sling:resourceType property • It’s a JCR path to some renderer • Renderer can be JSP, Java Servlet, Scala, Python, Groovy, Ruby or ESP (internal Sling language, kind of backend JS) • Content-centric: you don’t invoke script directly
  • 18. Sample HTML renderer <html> <head><title>ESP example</title> </head> <body> <h1> Hello <%= currentNode.getProperty('name') %> </h1> <h2> <%= currentNode.getProperty('city') %> </h2> </body> </html>
  • 19. How does it work? • Get node path from URL • Get extension • Get HTTP method GET /content/home.html • Find sling:resourceType • Choose appropriate script (POST.jsp, json.jsp, e tc.) /apps/jug/hellocomponent • Render node using found renderer and appropriate script Hello JUG!
  • 21. Resource path /content/corporate/jobs/developer.print.a4.html/mysuffix • Substring before the first dot • Path to the resource in JCR • This part of the URL defines data. – Rest defines way of the presentation.
  • 22. Extension /content/corporate/jobs/developer.print.a4.html/mysuffix • Defines content format • Most common: html, json, xml • But may be png
  • 23. Selectors /content/corporate/jobs/developer.print.a4.html/mysuffix • Specifies additional variants of the given content type • Optional • Multiple selectors are allowed
  • 24. Suffix /content/corporate/jobs/developer.print.a4.html/mysuffix • Additional information passed to the rendering script • Similar to GET ?name=value parameter, but can be cached
  • 25. Script resolution GET /content/corporate/jobs/developer.print.a4.html/mysuffix /content/corporate/jobs/developer/sling:resourceType = cognifide/hr/jobs /apps/cognifide/hr/jobs: 1. jobs.print.a4.GET.html.esp 2. jobs.print.a4.html.esp 3. jobs.print.a4.esp 4. jobs.print.GET.html.esp 5. jobs.print.html.esp 6. jobs.print.esp 7. jobs.GET.html.esp 8. jobs.html.esp 9. jobs.GET.esp 10. jobs.esp
  • 26. Composed resources Page title Left column Main <html> <head><title><%= currentNode.getProperty(’title') %></title></head> <body> <div class=‚left_column‛> <sling:include path=‚left‛ resourceType=‚foundation/parsys‛/> </div> <div class=‚main‛> <sling:include path=‚main‛ resourceType=‚foundation/parsys‛/> <div> </body> </html>
  • 27. Paragraph system <c:forEach var=‚par‛ items=‚${resource.children}‛> <sling:include path=‚${par.path}‛ resourceType=‚${par[‘sling:resourceType’]}‛/> </c:forEach> Left column Article list Twitter widget Contact info
  • 28. Resource Resolver • In JCR we had Node • In Sling we have Resource • Virtual tree of resources, reflecting the JCR • ResourceResolver – transforms nodes to resources • It’s possible to create own ResourceResolvers and reflect other data sources – Filesystem, – MongoDB, – PostgreSQL • Many ResourceResolvers may work together – Like mount in UNIX
  • 29. Resolver usage Resource res = resourceResolver.getResource(‚/content/hello‛); ModifiableValueMap map = res.adaptTo(ModifiableValueMap.class); String name = map.get(‚name‛, String.class); map.put(‚name‛, name.toUpperCase()); resourceResolver.commit(); Node node = res.adaptTo(javax.jcr.Node); Session = resourceResolver.adaptTo(javax.jcr.Session);
  • 30. Why do we use resolver? • API is friendlier than JCR • Sling provides us resources and resolver in many places – Servlets – Scripts
  • 31. Servlets • Like ordinary servlets but… • Can be assigned to: – Paths – Selectors – Extensions – Resource types (so can act as rendering script) • doGet(), doPost() methods are invoked with – SlingHttpServletRequest and …Response – Additional methods for getting requested resource, resolver, decompose URL, etc.
  • 32. Sample Sling servlet @Component @Service @SlingServlet(resourceTypes = ‛jug/hellocomponent‛) public class AuthCheckerServlet extends SlingSafeMethodsServlet { @Reference private ResourceResolverFactory resolverFactory; public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { response.getWriter().println(‚Hello world‛); } }
  • 33. Sling – pros and cons • Similar to JCR • Pros – Natural reflection of site and filesystem structure • Document repositories, Digital Asset Management – OSGi stack – Javascript has easy access to repository • Cons – Security issues • internal resources available as xml and json, • handling user generated content – Lack of free tools, eg. repo explorer
  • 34. Q&A

Editor's Notes

  1. Show examples here: CRXDE and Eclipse “Helloworld”
  2. Eclipse example Versioning
  3. jug/hellocomponent
  4. Show CQ as demo – what page?