Dagli anni ’50 ad oggi abbiamo assistito ad una costante evoluzione degli strumenti per l'elaborazione delle informazioni; queste ultime sono cambiate, durante gli anni, nella forma e nella quantità: semplici “numeri” inizialmente, generici “dati” successivamente fino ai “contenuti” che oggi le applicazioni devono essere in grado di gestire. In quantità spesso molto elevate. L'intervento partirà dalle motivazioni che hanno spinto alla creazione della prima specifica “Content Repository for JavaTM technology API” (JSR 170) per illustrare i vantaggi dal punto di vista dello sviluppatore derivanti dall'utilizzo della stessa, fino ad elencare le novità della versione 2.0 (JSR 283). Durante l'intervento verranno illustrati degli esempi di codice basati sulla reference implementation open source della specifica (il progetto Apache Jackrabbit) nonchè alcuni “case history” reali.
Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pra...
JCR 2.0: (Rapid) Content-Driven Application Development
1. JCR 2.0: (Rapid) Content-Driven Application
Development
Mario Cartia
JUG Sicilia
mario.cartia@codebase.it
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
2. A parte l'abaco, che è il più antico strumento di
calcolo usato dall'uomo, le
prime macchine costruite per effettuare
meccanicamente operazioni di calcolo, tali che ad
un variabile input dell'utente producessero un
corrispondente output come effetto di un processo
dei dati immessi determinato da una
regola matematica o logica, sono molto antiche.
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
3. Le prime importanti esigenze di calcolo
riguardarono principalmente l'astronomia,
disciplina legata da un verso a
concezioni religiose o comunque spiritualiste, e
per altro verso ad applicazioni estremamente
pratiche come quelle per la navigazione marittima.
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
4. Agli albori dell'era
informatica (anni ’50),
un computer era considerato
semplicemente una
macchina per fare i conti
superveloce, la naturale
evoluzione delle calcolatrici
usate durante la seconda
guerra mondiale.
(fonte Wikipedia)
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
5. I database sono stati utilizzati fin dall'inizio della
storia dell'informatica per la memorizzazione di
grosse quantità di dati (stringhe, numeri, date, …)
• Anni ~ ’60: Database Navigazionali
• Anni ~ ’70: Database Relazionali
• Anni ~ ’80: Database multidimensionali / ad
oggetti
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
6. ...necessità attuali
• archiviare documenti di natura più
disparata
• indicizzarne il contenuto per poter
effettuare ricerche full-text
• implementare meccanismi di
versioning e tracciatura delle
modifiche
• …
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
7. Content Repository API for Java (JCR) è una
specifica API per la piattaforma Java che
consente l’accesso a sistemi di gestione contenuti
in maniera standardizzata e vendor-independent
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
8. • JSR-170 Expert Group
Apache Software Foundation, Art Technology Group,
BEA Systems, Day Software, Fujitsu Limited, Hewlett-
Packard, IBM, Mediasurface, Novell, Oracle, SAP AG,
SAS Institute, Sun Microsystems, Vignette
• JSR-283 Expert Group
40+ aziende…
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
9. Prodotti opensource basati su JCR
JBoss Portal, Liferay Portal, Magnolia, SUN’s
OpenPortal, Nuxeo 5, OpenKM, Hippo ECM, …
Prodotti commerciali basati su JCR
Day CQ5, BEA WebLogic Portal, IBM WWCM,
Oracle WebCenter Suite, …
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
10. • La prima versione della specifica, JSR-170, era
strutturata su più livelli al fine di agevolare i
vendor e metterli in condizione di implementarla
in maniera graduale (giu 2005)
• La nuova versione, JSR-283, è pienamente
retrocompatibile ed è pensata come una
estensione della vecchia API (sett 2009)
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
11. Level 1 : Accesso read-only
• Display Portlet
• Template CMS
• Reportistica
• Applicazioni con
funzioni di ricerca e
visualizzazione in
generale
•…
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
12. Level 2 : Accesso read-write
• Creazione e gestione
completa informazioni
strutturate e non
strutturate
•…
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
13. Opzioni avanzate
• ECM
• Gestione
documentale avanzata
• Source control
management
•…
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
14. Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
15. Workspace
grafo orientato di items
• String
• Boolean
• Long
• Double
• Date
• URI
• Strutturati • Reference
• Non strutturati •…
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
16. David's model blueprints
David Nüscheler’s seven simple rules:
1.Data First, Structure Later. Maybe.
2.Drive the content hierarchy, don't let it happen.
3.Workspaces are for clone(), merge() and update().
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
17. David's model blueprints
4.Beware of Same Name Siblings.
5.References considered harmful.
6.Files are Files are Files.
7.ID's are evil.
http://wiki.apache.org/jackrabbit/DavidsModel
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
18. Un po’ di codice…
La prima versione della specifica non definiva alcun
metodo per ottenere un oggetto Repository.
La JSR-283 introduce l’oggetto RepositoryFactory
che, installato come estensione sulla piattaforma
Java, si occupa di questo compito
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
20. L’interazione con il Repository avviene mediante acquisizione di una
Session tipicamente fornendo delle credenziali per un determinato
Workspace
Session s=repository.login(Credentials credentials,
String workspaceName);
L’implementazione potrebbe prevedere un metodo login() che non
fornisce credenziali. In questo caso tipicamente si vuole utilizzare
JAAS o un altro meccanismo di autenticazione esterno
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
21. Una Session è bindata sempre e solo ad un singolo
(persistent) Workspace che è possibile ottenere utilizzando:
Workspace w=session.getWorkspace();
Session e Workspace pur essendo in corrispondenza 1:1
sono definiti su interfacce differenti perché implementano
comportamenti in scrittura differenti (transient vs.
immediately)
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
22. Il Node radice del Workspace si ottiene direttamente dalla
Session
Node n=session.getRootNode();
qualsiasi altro Node è raggiungibile dal path o dallo UUID
Node n=session.getNode(String absPath);
Node n=session.getNodeByUUID(String uuid);
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
23. Una Property si ottiene, come intuibile, dal Node
Property p=node.getProperty(String relPath);
...o iterando il Node
PropertyIterator pi=node.getProperties();
Property p=pi.nextProperty();
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
24. Property Types •BINARY
•STRING •DATE
•URI •NAME
•BOOLEAN •PATH
•LONG •WEAKREFERENCE
•DOUBLE •REFERENCE
•DECIMAL •UNDEFINED (optional)
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
25. Node Types
Ogni nodo possiede un node type primario che definisce
nomi, tipi e caratteristiche delle properties ed dei nodi
figlio che esso può o deve possedere. Ogni nodo ha una
property speciale jcr:primaryType che contiene il nome
del tipo primario dello stesso.
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
26. Mixin Node Types
I mixin node types sono utilizzati per aggiungere
specifiche properties o nodi figlio ad uno specifico Node,
tipicamente per esporre caratteristiche che sono
specifiche del repository. Ad esempio per rendere un
nodo referenziabile si aggiunge il mixin type
mix:referenceable che definisce la property jcr:uuid
che rappresenta l’identificativo del nodo.
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
27. Node Types e Mixin Types supportano
l’ereditarietà
E’ possibile definire tipi di nodo in maniera astratta.
Questi possono essere utilizzati per definire altri
tipi di nodo (o mixin) ma non assegnati in maniera
diretta.
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
28. Versioning basics
Il versionamento di un nodo si effettua in modo molto
semplice:
n.checkout();
n.setProperty(“my:field", “Hello JCR!");
n.save();
n.checkin();
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
29. Lo storico delle versioni è accessibile mediante la
classe VersionHistory che si ottiene a partire dal
Node
VersionHistory vh = n.getVersionHistory();
VersionIterator vi = vh.getAllVersions();
…
while (vi.hasNext()) {
Version v = vi.nextVersion(); …
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
30. Mediante l’ObservationManager è possibile
registrare dei listener per specifici eventi. Molto
utile, ad esempio, per implementare operazioni di
auditing
public void addEventListener(long eventTypes
, String absPath, int depth, EventListene
r listener, boolean noLocal, EventSelector
selector) throws RepositoryException;
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
31. • Migliorata gestione delle query: AQM, JQOM,
SQL bindings;
• Gestione delle JOIN nelle query;
• Gestione delle ACL;
• Retention policies dei dati;
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
32. • Meccanismo di versioning semplificato;
• Funzionalità BPM;
• Meccanismo per la gestione dei Nodetypes;
• Aggiunti nuovi tipi di nodo e di property;
• Metodo standardizzato per la creazione/rimozione dei
workspaces;
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
33. • Modello a “grafo” che consente ad un nodo di
avere più di un genitore;
• Meccanismo per ottenere la lista delle modifiche
effettuate dopo l’ultimo check-in;
• …
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
34. • E’ la reference implementation opensource della specifica
JSR-170 e JSR-283
• La versione 2.0, rilasciata da pochi giorni, è pienamente
compatibile con la specifica JCR 2.0 (JSR- 283)
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
35. • Il modulo OCM (Object to Content Mapping)
consente di salvare oggetti su un repository JCR
utilizzando lo stesso metodo comunemente
implementato nei motori ORM
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
36. @Node public class PressRelease {
@Field(path=true) String path;
@Field String title;
@Field Date pubDate;
@Field String content; …
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
37. …
PressRelease pressRelease = new PressRelease();
pressRelease.setPath("/newtutorial");
pressRelease.setTitle("This is the first tutorial on OCM");
pressRelease.setPubDate(new Date());
pressRelease.setContent("Many Jackrabbit users ask to the
dev team to make a tutorial on OCM");
ocm.insert(pressRelease);
ocm.save();
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
38. “Apache Sling is an innovative web framework that is intended to
bring back the fun to web development. (http://sling.apache.org)”
• Apache Sling è un framework basato su JCR che utilizza un
repository per la memorizzazion e la gestione di contenuti
• Le applicazioni Sling utilizzano semplici script o servlet per
processare le richieste HTTP in modalità RESTful
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
39. • L’estensione JCR ha una struttura molto simile a quella
dei package ORM appartenenti alla distribuzione Spring
ufficiale in modo tale da consentire agli sviluppatori di
riusare il proprio know-how potendo usufruire subito dei
vantaggi della API per la gestione dei contenuti
http://se-jcr.sourceforge.net/
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
40. Content Management Interoperability Services
is a proposed standard for improving interoperability
between Enterprise Content Management systems. It
proposes a data model plus a set of generic services and
several protocol bindings for these services,
including:SOAP and Representational State
Transfer (REST)/(Atom).
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010
42. GRAZIE PER L’ATTENZIONE!
contatti:
mario.cartia@codebase.it
Mario Cartia – mario.cartia@codebase.it - JUG Sicilia
Javaday IV – Roma – 30 gennaio 2010