TabulaFramework è l'evoluzione di un applicativo che ho sviluppato nel 2005 per la ex Banca del Gottardo e ancora oggi utilizzato all'interno della banca BSI per lo sviluppo di applicativi web.
Tabula permetteva principalmente di sviluppare siti web che avevano l'obiettivo di fornire agli utenti un'interfaccia web per la visualizzazione e la gestione di dati presenti su vari database. I siti generati permettevano, oltre che a visualizzare ed interagire con i dati del database, anche di applicare dei filtri per selezionare unicamente i dati interessati e di assegnare dei commenti ai singoli record. I siti disponevano anche di una sezione amministrativa che dava la possibilità agli amministratori di monitorare lo stato, gestire le impostazioni del sito e assegnare i privilegi di accesso degli utenti.
Lo sviluppo degli applicativi web veniva eseguito direttamente da un'applicativo client che si occupava poi di generare automaticamente tutti i file necessari (asp, html, JavaScript, CSS).
TabulaFramework è l'evoluzione di Tabula e la sua filosofia di base cambia radicalmente. Non si tratta più di un applicativo di sviluppo con il compito di generare da zero un sito web ma diventa un framework di supporto che può essere integrato all'interno di progetti esistenti sviluppati con diverse tecnologie e in diversi ambienti come ad esempio SharePoint. Il framework è sviluppato principalmente in ambiente .NET e utilizza le ultime tecnologie nel campo dello sviluppo web quali ad esempio Ajax e Prototype.
Il framework è suddiviso principalmente in due parti: una parte server e una parte client.
La parte server mette a disposizione una serie di controlli .NET (user controls) accessibili direttamente dalla barra degli strumenti di VisualStudio e che possono quindi essere trascinati all'interno della pagina e configurati in modo visuale impostando il valore delle varie proprietà. Tutti i componenti di Tabula supportano la tecnologia Ajax che permette di creare siti molto interattivi e performanti dando la possibilità di aggiornare unicamente singole parti di una pagina. Il framework utilizza un'implementazione ad hoc che sfrutta in modo più efficente i componenti UpdatePanel e ScriptManager di .NET 2.0 in modo da ridurre al minimo i tempi di rigenerazione della pagina dopo ogni post back.
La parte client invece mette a disposizione una raccolta di funzioni JavaScript che permettono l'interazione lato client tra i vari componente della pagina.
Il framework implementa un proprio concetto di contesto. Il contesto è come una scatola che si trova nella memoria del server in cui è possibile depositare oggetti di ogni tipo. Questi oggetti saranno disponibili per tutte le pagine del sito e per tutta la durata della sessione dell'utente. E' possibile definire quanti contesti si vuole e per ognuno di questi è possibile memorizzare un indeterminato numero di dati o oggetti.
Il contesto permette di memorizzare informazioni che devono persistere per tutta la sessione dell'utente e che devono essere condivise tra i vari componenti di una pagina o fra componenti di pagine differenti.
Il framework mette a disposizione una serie di funzioni lato server come ad esempio la Context.Get o la Context.Set che permettono di interagire con il contesto.
I componenti del framework sfruttano la tecnologia Ajax in modo da poter aggiornare il proprio contenuto indipendentemente dagli altri componenti, quindi senza dover aggiornare l'intera pagina. Il problema di questo tipo di implementazione modulare è come fare a sapere quando uno specifico componente deve aggiornarsi. Prendiamo l'esempio di una tabella che deve visualizzare dei dati a partire da una query; se la query è fissa, quindi non generata dinamicamente, allora i dati verranno caricati unicamente al primo caricamento della pagina e non dopo ogni postback. Ma ora consideriamo il caso in cui la query viene generata dinamicamente utilizzando un valore contenuto nel contesto come mostrato nell'esempio sottostante.
SELECT * FROM tblRelazioni WHERE
CODNEA = {Context.Get(name:"currentData", field:"CODNEA")}
Il comando contenuto tra le parentesi graffe è una funzione di Tabula lato server che permette di recuperare il valore contenuto all'interno del contesto. Anche in questo caso i dati verranno caricati durante la generazione iniziale della pagina ma cosa succederà se ad un certo il contenuto del contesto verrà modificato? Anche i dati della tabella dovranno essere aggiorati perchè la query è cambiata! Tabula risolve questi problemi utilizzando il concetto di notifiche. Praticamente ogni componente (ad esempio la tabella dell'esempio precedente) può registrarsi come listener di un particolare campo di un contesto. Quando il campo del contesto verrà modificato il framework si occuperà di inviare una notifica a tutti i componenti registrati che a loro volta provvederanno ad aggiornarsi.
In conclusione il sistema di notifica è una procedura interamente automatizzata che non richiede nessun intervento da parte dell'utente e che permette ai componenti che si riferiscono ad un campo di un contesto di aggiornarsi automaticamente quando il valore del contesto viene modificato.
Al codice html generato dai componenti del framework non viene associato nessun tipo di stile e viene visualizzata unicamente una versione scheletrica del componente. E' pero` possibile personalizzare le caratteristiche grafiche di presentazione e i meccanismi di interazione con l'utente mediante il concetto dei temi. I temi sono come delle vesti che una volta preparate possono essere indossate da diversi oggetti in modo da assumere un determinato aspetto grafico. Questo ci permette di definire a priori quale dovrà essere l'aspetto grafico che dovrà avere l'intero portale internet riutilizzando i temi sui vari componenti delle diverse pagine.
I temi mettono anche a disposizione un sistema di callback. I callback sono delle funzioni che vengono richiamate quando un oggetto che utilizza il tema scatena uno specifico evento. Sarà ad esempio possibile eseguire del codice quando il componente viene caricato, oppure, nel caso di una tabella, quando l'utente esegue l'ordinamento dei dati o quando entra nella modalità di edit.
Tabula mette a disposizione un'apposito linguaggio che può essere utilizzato per modificare la logica applicativa lato server. Alla base di questo linguaggio ci sono le funzioni. La struttura di una funzione è la seguente:
{NOME_FUNZIONE(PARAMETRI)}
I parametri vengono passati mediante la seguente sintassi:
PARAMETRO1:VALORE1, PARAMETRO2:VALORE2, ...
Le funzioni server sono sostitutive nel senso che una volta eseguite la sintassi della funzione viene sostituita con il valore ritornato dalla funzione. Vediamo un esempio con la funzione Context.Get che si occupa di leggere il valore contenuto all'inteno di un campo del contesto. Nell'esempio sottostante questa funzione va a comporre una stringa. Prima di essere eseguita il codice è il seguente:
Il campo del contesto contiene il
valore {Context.Get(name:"un_contesto", field:"un_campo")}!
Se il contesto contiene ad esempio la stringa "abcde" allora il codice diventerà:
Il campo del contesto contiene il valore abcde!
Il linguaggio supporta anche le condizioni mediante la seguente sintassi:
{ if ( CONDIZIONE2 ) [ CODICE2 ] else [ CODICE3 ]}