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

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

Transcript of Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Page 1: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Shooting rabbits with sling

Introduction to Apache Jackrabbit & Apache Sling

Page 2: 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

Page 3: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 4: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 5: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 6: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Property

• Property contains data• Types:– string, binary, long, double, date, boolean, name,

path, reference• Can be multivalued

Page 7: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Searching

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

Page 8: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

SQL2SELECT * FROM [cq:PageContent] AS sWHERE 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

Page 9: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 10: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 11: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Other features

• Locking• Access control– Users & groups– Groups can be members of other groups– Privileges on nodes to read, write, etc.

Page 12: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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…

Page 13: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Apache Sling

HTTP access to JCR repository

Page 14: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 15: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 16: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 17: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 18: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Sample HTML renderer<html><head><title>ESP example</title></head><body> <h1>Hello<%= currentNode.getProperty('name') %> </h1> <h2><%= currentNode.getProperty('city') %> </h2></body></html>

Page 19: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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, etc.)

/apps/jug/hellocomponent • Render node using

found renderer and appropriate script

Hello JUG!

Page 20: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

URL decomposition

/content/corporate/jobs/developer.print.a4.html/mysuffix

• Resource path• Selectors• Extension• Suffix

Page 21: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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.

Page 22: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Extension

/content/corporate/jobs/developer.print.a4.html/mysuffix

• Defines content format• Most common: html, json, xml• But may be png

Page 23: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Selectors

/content/corporate/jobs/developer.print.a4.html/mysuffix

• Specifies additional variants of the given content type• Optional• Multiple selectors are allowed

Page 24: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 25: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Script resolutionGET /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.esp2. jobs.print.a4.html.esp3. jobs.print.a4.esp4. jobs.print.GET.html.esp5. jobs.print.html.esp6. jobs.print.esp7. jobs.GET.html.esp8. jobs.html.esp9. jobs.GET.esp10. jobs.esp

Page 26: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Composed resourcesPage

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>

Page 27: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 28: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 29: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Resolver usageResource 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);

Page 30: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Why do we use resolver?

• API is friendlier than JCR• Sling provides us resources and resolver in

many places– Servlets– Scripts

Page 31: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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.

Page 32: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Sample Sling servlet@Component@Service@SlingServlet(resourceTypes = ”jug/hellocomponent”)public class AuthCheckerServlet extends SlingSafeMethodsServlet {

@Referenceprivate ResourceResolverFactory resolverFactory;

public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse

response) {response.getWriter().println(“Hello world”);

}}

Page 33: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

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

Page 34: Shooting rabbits with sling Introduction to Apache Jackrabbit & Apache Sling.

Q&A