jcr 2.0: (rapid) content-driven application development

Post on 17-May-2015

1.181 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

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.

TRANSCRIPT

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

JCR 2.0: (Rapid) Content-Driven Application Development

Mario CartiaJUG Sicilia

mario.cartia@codebase.it

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

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

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

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

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

...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

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

• 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

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

• 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

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

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

Opzioni avanzate

• ECM• Gestione documentale avanzata• Source control management• …

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

Workspace

grafo orientato di items

• Strutturati• Non strutturati

• String• Boolean• Long• Double• Date• URI• Reference• …

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

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

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

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

Repository r=RepositoryFactory.getRepository(Map pa rameters);

Oppure alla “vecchia maniera”

InitialContext ctx = ...

Repository repository = (Repository)ctx.lookup("myr epo");

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

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

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

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

Una Property si ottiene, come intuibile, dal Node

Property p=node.getProperty(String relPath);

...o iterando il NodePropertyIterator pi=node.getProperties();

Property p=pi.nextProperty();

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

Property Types

•STRING

•URI

•BOOLEAN

•LONG

•DOUBLE

•DECIMAL

•BINARY

•DATE

•NAME

•PATH

•WEAKREFERENCE

•REFERENCE

•UNDEFINED (optional)

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

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

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:uuidche rappresenta l’identificativo del nodo.

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

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

Versioning basicsIl 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

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

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, EventListener listener, boolean noLocal, EventSelector

selector) throws RepositoryException ;

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

• 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

• 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

• 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

• 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

• 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

@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

…PressRelease pressRelease = new PressRelease(); pressRelease.setPath("/newtutorial"); pressRelease.setTitle("This is the first tutorial o n 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

“ 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

• L’estensione JCR ha una struttura molto simile a quella dei package ORM appartenenti alla distribuzione Springufficiale 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

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

http://bmule.posterous.com

Mario Cartia – mario.cartia@codebase.it - JUG Sicilia

Javaday IV – Roma – 30 gennaio 2010

GRAZIE PER L’ATTENZIONE!

contatti:

mario.cartia@codebase.it

top related