Cocoon Una introduzione
Programma Descrizione per l' utente Funzionamento interno
Parte Prima Dal punto di vista dell'utente
Che cosa è? Cocoon è una piattaforma di pubblicazione di dati XML. Con esso è possibile a partire da sorgenti diverse, database, soap, files, costruire e gestire applicazioni web con supporto per indipendenza del browser, internazionalizzazione, localizzazione, separando la logica dalla presentazione. Si possono costruire diversi tipi di applicazioni web, da portali a data warehousing È Open Source e multipiattaforma È utilizzato da compagnie quali HP e NASA. Può integrare sorgenti dati multiple e fornire un output in diverso formato (HTML,PDF,WML,SVG)
Perché è nato? Essenzialmente per separare la logica dalla presentazione dei siti web. Con l'aumentare della complessità dei siti, la gestione di diversi tipi di browser, diventa problematica la gestione e manutenzione Il sito può essere manutenuto indipendentemente da sviluppatori e designers Parti diverse di sito si integrano agevolmente
Caratteristiche principali Pubblicazione flessibile di dati in diverso formato Integrazione di sorgenti dati diverse Personalizzazione dei contenuti Integrazione di applicazioni Indipendente dalla piattaforma Architettura flessibile Multilinguaggio (utente) Open Source Multipiattaforma
Prerequisiti JDK Servlet engine (Tomcat, Web Sphere, ecc)
Generazione documenti La logica del sito é disaccoppiata dalla struttura fisica dei documenti (maggiore manutenibilità) Un documento é il risultato di un processo di generazione dati e trasformazione Il documento viene prodotto da una pipeline, cioè una serie di componenti che si trasmettono e trasformano XML.
Le pipelines I dati partono da un generatore Passano tra uno o più transformers Vengono pubblicati grazie ad un serializer Nella mappa del sito vi sono le informazioni per gestire il tutto Tutto quanto in formato XML
La configurazione La configurazione del sito é in sitemap.xmap. In essa sono dichiarati i componenti, le risorse e le pipelines <map:pipeline> <map:match pattern="helloworld.html"> <map:generate src="hw.xsp" type="serverpages"/> <map:serialize type="xml"/> </map:match> </map:pipeline>
I componenti Contenuti in sitemap Components Generators Transofrmers Serializers Readers Selectors Matchers Actions
La pipeline I generators creano i dati I transformers (opzionali) li trasformano, e li completano I'URL del documento passa al vaglio di un matcher che determina quale pipeline deve processarlo. La pipeline determina la catena di processing del documento <map:match pattern="todo.xml"> <map:mount uri-prefix="" src="status.xmap" check-reload="yes" /> </map:match>
La pipeline (2) Ogni componente ha un nome univoco ed un src (classe Java). Per ogni tipo di componente esiste un default Le risorse sono definite da URI e contengono dati, immagini, pagine statiche. Per leggerle si usano protocollo standard (http:) e privati (cocoon: e utente)
Componenti comuni Tra i componenti comuni citiamo File generator, html generator, directory generator, request (crea un XML con i parametri della richiesta) XSLT transformer. I componenti possono essere estesi in Java implementando determinate interfacce.
Actions Eseguono un compito specifico, non producono dati e non li processano. Es.: aggiungere un utente ad un database Ritornano una serie di coppie chiave-valore
I Matchers Nei matchers posso usare i parametri della richiesta con sostituzioni <map:match pattern="**body-*.html"> <map:select type="exists"> <map:when test="content/xdocs/{1}{2}.ehtml"> <map:generate src="content/xdocs/{1}{2}.ehtml" /> <map:transform src="resources/stylesheets/html2htmlbody.xsl" /> <map:transform type="linkrewriter" src="cocoon:/{1}linkmap-{2}.html"/> <map:serialize type="xml" /> </map:when> </map:select> </map:match>
XSLT I transformers usano XML, quindi c'è un largo uso di XSLT
Flusso Se c'è un match ne viene eseguito il contenuto, se si sono actions, vengono eseguite; se ritornano un oggetto, viene eseguito ciò che sta al loro interno. Ogni pipeline può avere un proprio error handler
Selectors Lo posso usare per testare parametri della richiesta o valori generati da un atto È paragonabile ad una istruzione switch del linguaggio C <map:match pattern="**body-*.html"> <map:select type="exists"> <map:when test="content/xdocs/{1}{2}.ehtml"> <map:generate src="content/xdocs/{1}{2}.ehtml" /> <map:transform src="resources/stylesheets/html2htmlbody.xsl" /> <map:transform type="linkrewriter" src="cocoon:/{1}linkmap-{2}.html"/> <map:serialize type="xml" /> </map:when> </map:select> </map:match>
Aggregazione Posso unire diverse parti di pipelines con sorgenti dati diverse per facilitare la gestione del sito <map:match pattern="*.html"> <map:aggregate element="site"> <map:part src="cocoon:/tab-{0}"/> <map:part src="cocoon:/menu-{0}"/> <map:part src="cocoon:/body-{0}"/> </map:aggregate> <map:call resource="skinit"> <map:parameter name="type" value="site2xhtml"/> <map:parameter name="path" value="{0}"/> </map:call> </map:match>
Content aggregation Posso generare le parti in modo indipendente e riunirle Posso accedere alle diverse parti per eventualmente trasformarle in altri formati (PDF) senza dovere esaminare il documento completo ed estrarre informazioni in modo complicato ed inaffidabile
Redirectors Posso ridirigere una richiesta all'interno o all'esterno
Actionset Insieme di azioni: posso decidere di chiamarle tutte o solo qualcuna a seconda di un parametro della richiesta <map:action-set name="utente"> <map:act type="add-users" action="add"/> <map:act type="mod-user" action="mod"/> <map:act type="del-user" action="delete"/> </map:action-set>
Subsitemaps Posso caricare dei sottositi, ognuno con la sua configurazione in modo modulare Facilità di manutenzione e di deployement
Views Sono viste di documenti particolari ed hanno un nome, Le posso invocare con un url o in una pipeline chiamandole per nome con un attributo label. Posso usarle anche per debug per avere i dati raw del documento in XML Oppure per trasformare in altro formato il documento
<xsp:page xmlns:xsp="http://apache.org/xsp"> <xsp:logic> String messaggio="hello World"; </xsp:logic> <document> <xsp:expr>messaggio</xsp:expr> </document> </xsp:page> XSP Posso introdurre script in codice Java per modificare la logica dell'applicativo come generators Se ne abuso corro il rischio di mischiare logica con i dati
Caching Esiste un meccanismo di caching che deve essere implementato da tutti i componenti di una pipeline
Integrazione Posso integrare attraverso miei componenti con SOAP apptraerso il SOAP logicsheet, parte del package di base. J2EE Lucene (motore di ricerca) Xindice (database XML)
Parte II Funzionamento interno
Struttura Servlet Engine Cocoon Componenti Cocoon: Generator, Transformer Standard: XML parser, ecc Avalon Utente Logging Management
Architettura di Cocoon Applicazione LogicSheets Componenti Core Avalon
Le basi Cocoon è basato su Avalon, un framework per la gestione di componenti. Avalon gestisce il pooling degli oggetti e mette a disposizione componenti di base come il logger. Definisce interfacce di base per la gestione di componenti riusabili. Excalibur è basato su Avalon ed implementa diversi componenti di cui in Avalon è definita l'interfaccia. Avalon e' basato sui ruoli che hanno metodi definiti (interfacce) ed è basato sui patterns IoC e SoC
Patterns IoC e SoC Inversion of Control Il sw che crea il componente è responsabile della sua configurazione Separation of Concerns Il componente è responsabile di un solo compito.
Customizzazione È possbile registrare diversi tipi di componenti (anche utente) ed attribuire loro un ruolo via file di configurazione. Es.: parser XML Vi sono interfacce per gestire il ciclo di vita (pooling) ed il tipo di threading model Tramite le interfacce possiamo creare nostri componenti per implementare funzionalità mancanti od implementare nuovi protocolli
Bibliografia Cocoon: Building XML Applications, New Riders Cocoon Developer's handbook SAMS
Links 1 Cocoon http://xml.apache.org/cocoon http://xml.apache.org/cocoon/faq.html Progetti Apache http://jakarta.apache.org/avalon http://xml.apache.org/xindice http://xml.apache.org/xalan-j/index.html http://xml.apache.org/xerces-j/index.html http://xml.apache.org/fop/index.html http://xml.apache.org/batik/index.html
Links 2 W3C http://www.w3.org/xml XML reference http://www.w3.org/tr/xslt XSLT reference http://www.w3.org/tr/xpath XPATH http://www.w3.org/graphics/svg
Fine