Presentation is loading. Please wait.

Presentation is loading. Please wait.

Shooting rabbits with sling

Similar presentations

Presentation on theme: "Shooting rabbits with sling"— Presentation transcript:

1 Shooting rabbits with sling
Introduction to Apache Jackrabbit & Apache Sling

2 JCR Content Repository API for Java JSR-170 & JSR-283 Object database
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 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: able Popular types: nt:base, nt:unstructured, nt:folder

6 Property Property contains data Types: Can be multivalued
string, binary, long, double, date, boolean, name, path, reference Can be multivalued Show examples here: CRXDE and Eclipse “Helloworld”

7 Searching Node names and properties are indexed
Jackrabbit uses Apache Lucene Supported query languages: XPath JCR-SQL JCR-SQL2 (recommended)

8 SQL2 Main purpose: find node by property contents
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 Eclipse example Versioning

10 Observation Event listener We can filter events with: Usage examples:
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
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 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 HTTP access to JCR repository
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
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> jug/hellocomponent

19 How does it work? /apps/jug/hellocomponent GET /content/home.html
Get node path from URL Get extension Get HTTP method GET /content/home.html Find sling:resourceType Choose appropriate script (POST.jsp, json.jsp, etc.) /apps/jug/hellocomponent Render node using found renderer and appropriate script Hello JUG!

20 URL decomposition /content/corporate/jobs/developer.print.a4.html/mysuffix Resource path Selectors Extension Suffix

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: jobs.print.a4.GET.html.esp jobs.print.a4.html.esp jobs.print.a4.esp jobs.print.GET.html.esp jobs.print.html.esp jobs.print.esp jobs.GET.html.esp jobs.html.esp jobs.GET.esp jobs.esp

26 Composed resources Page Left column Main <html>
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 Left column Article list Twitter widget
Contact info <c:forEach var=“par” items=“${resource.children}”> <sling:include path=“${par.path}” resourceType=“${par[‘sling:resourceType’]}”/> </c:forEach>

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 = ”jug/hellocomponent”) public class AuthCheckerServlet extends SlingSafeMethodsServlet private ResourceResolverFactory resolverFactory; public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { response.getWriter().println(“Hello world”); }

33 Sling – pros and cons Similar to JCR Pros Cons
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 Show CQ as demo – what page?

34 Q&A

Download ppt "Shooting rabbits with sling"

Similar presentations

Ads by Google