Shooting rabbits with sling

5,701 views

Published on

Introduction to Apache Jackrabbit and Apache Sling.

Published in: Technology
  • Be the first to comment

Shooting rabbits with sling

  1. 1. Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling
  2. 2. JCR • Content Repository API for Java • JSR-170 & JSR-283 • javax.jcr • Object database • Hierarchical data model • Apache Jackrabbit – reference implementation
  3. 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. 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. 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. 6. Property • Property contains data • Types: – string, binary, long, double, date, boolean, name, path, reference • Can be multivalued
  7. 7. Searching • Node names and properties are indexed • Jackrabbit uses Apache Lucene • Supported query languages: – XPath – JCR-SQL – JCR-SQL2 (recommended)
  8. 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. 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. 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. 11. Other features • Locking • Access control – Users & groups – Groups can be members of other groups – Privileges on nodes to read, write, etc.
  12. 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. 13. Apache Sling HTTP access to JCR repository
  14. 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. 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. 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. 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. 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. 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!
  20. 20. URL decomposition /content/corporate/jobs/developer.print.a4.html/mysuffix • Resource path • Selectors • Extension • Suffix
  21. 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. 22. Extension /content/corporate/jobs/developer.print.a4.html/mysuffix • Defines content format • Most common: html, json, xml • But may be png
  23. 23. Selectors /content/corporate/jobs/developer.print.a4.html/mysuffix • Specifies additional variants of the given content type • Optional • Multiple selectors are allowed
  24. 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. 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. 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. 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. 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. 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. 30. Why do we use resolver? • API is friendlier than JCR • Sling provides us resources and resolver in many places – Servlets – Scripts
  31. 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. 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. 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. 34. Q&A

×