Apache Sling as an OSGi-powered REST middleware

Post on 14-Apr-2017

1.103 views 3 download

Transcript of Apache Sling as an OSGi-powered REST middleware

@YourTwitterHandle#DV14 #YourTag @rombert#Devoxx #Sling

Apache Sling as an OSGi-powered REST middleware

Robert Munteanu, Adobe Systems Inc

#Devoxx #Sling @rombert

Getting to know each other

$DAYJOB Adobe Experience

Manager Apache Sling Apache Jackrabbit Apache Felix

FOSS Apache Sling MantisBT Mylyn Connector for MantisBT Mylyn Connector for Review Board

#Devoxx #Sling @rombert

Agenda● What is Apache Sling?● Meet Barry● Demo 1● Why use Sling as a RESTful middleware?● Demo 2● What else is there to Sling?

#Devoxx #Sling @rombert

Apache Sling - History

2007Incubation

2009TLP

2015Version 8

200xPre-Apache

#Devoxx #Sling @rombert

High-level View of the Code

Source: OpenHub

#Devoxx #Sling @rombert

Level of activity

Source: OpenHub

Source: status.apache.org

#Devoxx #Sling @rombert

Conceptual foundations

REST-based

Content-driven

OSGi-powered

Scripting InsideApache

#Devoxx #Sling @rombert

REST-based

/content/blog/

/content/blog/{0}.html

/

BlogViewController

BlogListController

HomeController

SlingMainServlet//content/content/blog/content/blog/hello-world

#Devoxx #Sling @rombert

REST-based

//content/content/blog/content/blog/hello-world

[sling/redirect][sling/redirect][ blog/welcome][ blog/page]

#Devoxx #Sling @rombert

Barry – Senior Buzzword Deliverer

#Devoxx #Sling @rombert

Demo time!

#Devoxx #Sling @rombert

How is everything mapped?

/ ( root )

/content/blog/comments

/content/blog/posts/content/blog/images

#Devoxx #Sling @rombert

How does Sling manage this?

ResourceProvider

JCR NoSQL FS

Couchbase MongoDB

ResourceProviderFactoryProduces

#Devoxx #Sling @rombert

SPI → API

ResourceProviderFactory

OSGi Service Registry

ResourceResolver

Registers Gets

#Devoxx #Sling @rombert

How does my code get invoked?

1 GET /content/blog/posts/hello_world.json

2 ResourceResolver.resolve(...)

3 ServletResolver.resolveServlet(...)

4 servlet.doGet(...)

#Devoxx #Sling @rombert

Reading Resources

SELECT * FROM posts WHERE id = 83

rr.getResource(“/posts/hello_world”);

#Devoxx #Sling @rombert

Reading Resources

SELECT * FROM posts

WHERE parent_id = 25

LIMIT 10

for (Resource post : resource.getChildren() ) {

// process first 10

}

#Devoxx #Sling @rombert

Reading Resources

SELECT * FROM posts

WHERE author = “john”

ORDER BY published DESC

rr.findResources(“//element(*, blog:Posts)[@author='john'] ORDER BY @published DESC”, “xpath”);

#Devoxx #Sling @rombert

Writing Resources

rr.create(parent, “new-blog-post”, Map.of(“author”, “John”, “title”, “New Blog Post”));

rr.delete(resource);

rr.commit();

#Devoxx #Sling @rombert

How do I handle requests?@SlingServlet(methods="POST", extensions="comments", resourceTypes=SlingshotConstants.RESOURCETYPE_ITEM)

public class CommentPostServlet

extends SlingAllMethodsServlet {

protected void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response) {

/* implementation */

}

}

#Devoxx #Sling @rombert

Reading dataResource res = request.getResource();

// 1. reading ...

ValueMap properties = ↵ res.getValueMap();

String title = properties.get(“jcr:title”,↵ “Missing”);

Post post = res.adaptTo(Post.class);

title = post.getTitle();

#Devoxx #Sling @rombert

Why do we need adaptTo?

Adaptable

Resource ValueMap

Map<String,Object> Post

#Devoxx #Sling @rombert

Writing dataResource res = request.getResource();

// 2. writing ...

ValueMap properties = ↵ res.adaptTo(ValueMap.class);

String title = properties.put(“jcr:title”,↵ “Hello, world”);

Post post = res.adaptTo(Post.class);

post.setTitle(“Hello, world”);

res.getResourceResolver().commit();

#Devoxx #Sling @rombert

A Sightly Template<h1>${resource.valueMap['jcr:title'] || 'Blog'}</h1>

<div data-sly-resource="${'/content/blog/stats' @resourceType='redis/stats'}"/>

<div data-sly-list.child="${resource.listChildren}">

<h2>${child.valueMap['jcr:title']}</h2>

<div data-sly-use.helper="${'welcome.js' @text=child.valueMap['jcr:description'] }">

${helper.excerpt @ context='html'} <a href="${child.path}.html">Read more</a>

</div>

</div>

#Devoxx #Sling @rombert

Demo time!

#Devoxx #Sling @rombert

Oh, but there's more

#Devoxx #Sling @rombert

More features● Eventing, Thread Pooling, Job Management, Caching● Scripting: Groovy, Scala, JSP, Sightly, Java, Ruby,

Thymeleaf● Flexible resource rendering with resource types● Very extensible due to being internally powered by OSGi –

most extension points available to clients

#Devoxx #Sling @rombert

Beyond the NoSQL datastores

#Devoxx #Sling @rombert

Buzzword checklist✔ REST✔ Middleware✔ NoSQL✔ OSGi

#Devoxx #Sling @rombert

Resources● Apache Sling – http://sling.apache.org● Sling NoSQL providers -

http://sling.apache.org/documentation/bundles/nosql-resource-providers.html

● Apache Jackrabbit Oak - http://jackrabbit.apache.org/oak/