theserverside: kickstarting jcr
DESCRIPTION
TRANSCRIPT
Kickstarting JCR: TheServerSide.com as a Content Application
Michael MarthTechnology EvangelistDay Software AG
David NueschelerCTODay Software AG
obpqof`qba
R håçï=óçìê=eqji=C=g~î~ëÅêáéíe~îÉ=~=î~ÖìÉ=ÅçåÅÉéí=çÑ=~=“`çåíÉåí=oÉéçëáíçêóÒ=~åÇ=“obpqÒ
David Nuescheler Chief Technology [email protected]
David NueschelerJackrabbit Committer / [email protected]
David NueschelerJSR-170 Spec [email protected]
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
What’s JCR?
`çåíÉåí=oÉéçëáíçêó=Ñçê=g~î~qj=íÉÅÜåçäçÖó=^mfpéÉÅJiÉ~ÇWa~ó=pçÑíï~êÉpí~íìëW=cáå~ä=oÉäÉ~ëÉ=NTJàìåJOMMR
gpoJNTM
bñéÉêí=dêçìéW
bñéÉêí=dêçìéW
gpoJNTM gpoJOUP
`çåíÉåí=oÉéçëáíçêó=Ñçê=g~î~qj=íÉÅÜåçäçÖó=^mf=îOKMpéÉÅJiÉ~ÇWa~ó=pçÑíï~êÉpí~íìëW=mìÄäáÅ=oÉîáÉï=`äçëÉÇ=ëÉéJOMMT
What’s JCR?
What’s JCR?
“The API should be a standard, implementation independent, way to access content bi-directionally on a granular level to a content repository.” ?
Best of both worlds.
data base filesystem
content repository
read
write
hier-archiesstreams
locking accesscontrol
integrity structure
tx query
un-structured“full-text” sort
orderversion
ingobser-vation
multi-value
- Reality Check -
Task: Write a JSP snippet that lists “documents” in a “folder”.”
What’s JCR?
What’s JCR?- Reality Check -
Task: Write a JSP snippet that lists “documents” in a “folder”.”
<%childCount = node.getContentCount();for(int i=0;i<childCount;i++) { IContent child = node.getContent(i); Property title = child.getPropertyByName("Title"); %><%= title.getValue() %><br/><%}%>
<%LAPI_DOCUMENTS documents
= new LAPI_DOCUMENTS(session);
LLValue childTable = new LLValue();
documents.ListObjects(volumeID, folderID,
null, null, LAPI_DOCUMENTS.PERM_SEE, chi
ldTable);
Enumeration children = childTable.enumerateValue
s();
while(children.hasMoreElements()) {
LLValue child = (LLValue)e.nextElement()
;
String title = child.toString("Name");
%><%= title %><br/><%
}%>
<%fndocs = new IFnObjSetDualProxy( fnfolder.getContents(idmFolderContent.idmFolderContentDocument));
int numDocs = fndocs.getCount();for (int i = 1; i <= numDocs; i++) {
IFnDocumentDual fndoc = new IFnDocumentDualProxy(fndocs.getItem(new Integer(i)));
IFnPropertiesDual propset = fndoc.getProperties();
IFnPropertyDual idmTitleProp = propset.getItem("Title");
String title = idmTitleProp.getValue();
%><%= title %><br/><% if (comCleanup) { cleaner.release(fndoc); }}%>
<%IDocuments documents =
new IDocumentsProxy(binder.getDocuments());
documents.cache();
int documentCount = documents.getCount();
for (int i = 0; i<documentCount; i++) {
document = new IDocumentProxy(docume
nts.getItemByIndex(i));
String title = document.getTitle()
%><%= title %><br/><%
}%>
<%PageIterator children = page.getPages();while (children.hasNext()) { Page child = children.nextPage(); Container toplevel = child.getContent(); Atom title = toplevel.getAtom("Title"); %><%= title %><br /><%}%>
+800
<%NodeIterator children = node.getNodes();while (children.hasNext()) { Node child = children.nextNode(); Property title = child.getProperty("Title"); %><%= title %><br /><%}%>
JCR API
- Functional Elevator Pitch -What’s JCR?
level 1
level 2
read, export, query
write, import, accesscontrol
sql locking obser-vation tx versioning
optional
JSR-283 Public Review Ballot
approved
Java Standardization
Java Standardization
Known compliant Repositories
Apache Jackrabbit Oracle XML DBExo
ECMS PlatformMicrosoft
Sharepoint OpenText Livelink
Day CRX IBM FileNet P8 Xythos Repository Alfresco ECM Vignette V7
Interwoven Repository IBM CM EMC Documentum
How many
RDBMS vendors
do you need?+hundreds of TCKsregistered
* *
*
*
* using third party connector
*
Sourcemix Sourcemix
Percussion Rhythmix Lutece
Portal
QuickWCM WCMS
Jahia Framework
Hippo CMS
InfoQ Online CommunityNuxeo ECM
Sakai E-learning
TYPO3 v5.0 WCMGX WebManager
Exo ECMS Platform
Liferay Enterprise Portal
Artifactory Maven Proxy
IBM FileNet WebSiteManagerApache James
medic-2-medic mapofmedicine
Day Communiqué WCMS
Apache Tapestry
Day Communique Collab
QSLabs ComplianceApache
Cocoon
Alfresco ECMSApache Sling
Mindquarry Collaboration
Day Communique DAMmagnolia WCMS
JBoss Portal
Some known JCR Applications
Sun OpenPortal Interface 21
Spring Framework
Fast Enterprise SearchOracle PortalBEA Portal
JCR - Weatherforcast-5°
2008 2009-8°
2010-12°
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
JCR: Yours truly
REST over JCR
REST -> Roy T. Fielding
released y2k162 pages
v1.0 released 2005
+300 pages
JCR
functionally broad
well designedlong term
strategicheavy duty16 tons
stable & durable
The Problem:
JCR
me
short-sighted...easily confused
developer hat
hacklazy
“i want to build webapps” the o
ther
side
functionally broad
well designedlong term
strategicheavy duty16 tons
stable & durable
The Problem:
The Silver bullet:
JCR
me (david)
developer hat
very simple projection: fits the bill
sling
silver
Apache Sling
microjax jax
JCR backed ReST-Webkit(OSGI, OCM , ...) contains
I2
3
Browser
J2EE WebServer
browser & ujax.jsreading: json & resource GET’swriting: form-POSTs & GETs
Sling Servletstranslating requests to JCR calls
JCR CompliantContent Repository
I
2
3very simple js API to read content, Forms to write content
handles all the heavy lifting, particularly security16 tons
Introducing jax
Taking the URL seriously
.../product.jsp?id=12346
Mistake 1:Addressing the “Script”Mistake 2:.jsp? What the heck?
Mistake 3:Passing in “this”
Repository
Sling URL decomposition.
/cars/audi/s4.details.html
Content Repository Path...selects a particular script
“Data First!”JCR supports “structure first” aswell. (but that’s missing point)
Getting ready...
download and installtest & mount as a drive
hello, world.
drag, drop, donehttp://localhost:7402/apps/firststeps/0_hello.html
<html>
<head><title>u
jax:hello, wor
ld</title>
</head>
<body><h2>hell
o, world</h2>
</body>
</html>
simple write example
write me!http://localhost:7402/apps/firs
tsteps/1_write.html
<html>
<head><title>u
jax: simple wr
ite example</t
itle>
</head><body>
<form action="
/content/first
steps" method=
"POST">
<!-- title -->
<h2>Title</h2>
<input type="t
ext" name="Tit
le" />
<!-- descripti
on -->
<h2>Descriptio
n</h2>
<textarea rows
="5" name="Des
cription">
</te
xtarea>
<!-- color -->
<h2>Color</h2>
<select name="
Color">
<option value=
"red">red
<option value=
"green">green
</select>
</form>
</body>
</html>
simple read example
read me!http://localhost:7402/apps/firststeps/2_read.html
<html>
<head><title>u
jax: simple re
ad example</ti
tle>
</head>
<body>
<script src
="/ujax/ujax.j
s"></script
<script>
var node=uj
ax.getContent(
"/content/firs
tsteps");
var div='<d
iv style="back
ground-color:'
+node.Color+'"
>';
document.wr
ite(div);
</script>
<h2><script>
document.write
(node.Title);
</script></h2>
<p><script>
document.write
(node.Descript
ion);
</script></p>
</div>
</body>
</html>
add newhttp://localhost:7402/apps/firststeps/3_addnew.html
add new entry
<html>
<head><title>u
jax: add new e
ntry example</
title>
</head><body>
<form action="
/content/first
steps/entries/
*"
method="PO
ST" >
<h2>Title</h2>
<input type="t
ext" name="Tit
le" />
<h2>Descriptio
n</h2>
<textarea rows
="5" name="Des
cription"></te
xtarea>
<h2>Color</h2>
<select name="
Color">
<option value=
"red">red
<option value=
"green">green
</select>
<p><input type
="submit"></p>
</form>
</body>
</html>
list entries
list entrieshttp://localhost:7402/apps/firststeps/4_list.html
<html>
<head><title>u
jax: list entr
ies example</t
itle>
[...]
<script>
var entries=uj
ax.getContent(
"/content/firs
tsteps/entries
", 2);
</script>
<div>
<script>
for (var a i
n entries) {
var entry=ent
ries[a];
document.
write('<div st
yle="backgroun
d-color:'+entr
y.Color+'">');
document.
write('<h2>'+e
ntry.Title+'</
h3>');
document.
write(entry.De
scription);
if(entry.
Image) {
[...]
}
document.
write('</div>'
);
document.
write('<a href
="4_list.html"
onclick=
”ujax.removeCo
ntent(\'/mydat
a/entries/\'+a
+'\'">
remove</
a>');
}
</script>
<a href="3_add
new.html">add
new</a>
</div>
</body>
resource oriented urlshttp://localhost:7402/content/firststeps.list.html
templates
[...]
<%= currentNod
e.Title %>
[...]
<script>
ujax.wizard();
</script>
[...]
! ! Rjax.wizard();
! </script>
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
Kickstarting JCRTSS is a Content App
What’s JCR (elevator pitch)
REST meets JCR meets Ajax
Building TSS as a Content Appsilver
Essentially:
Re-build “TSS++” as a content app.
Transform “TheServerSide.com” into a jax and JCR backed Content App.
TheServerSide.com as a content Application.
- goals -
»»NO TOOLS!
(well texteditor &
browser ;) )
Buddy coding:
Beer for
Bug.
DEMO
If you remember only 2 things.visit us: dev.day.comregister for JCR Cup 2008Make you next Application a Content Application
2
I booth &
fireside chat
Q&A
Thank you for your attention