Xalp

Extendible Array-based Linked Programming

Draf document

Il seguente documento è una bozza che spiega il funzionamento di Xalp. Xalp è un prototipo sviluppato dal reparto elaborazione della F.lli Di Biasi s.n.c.

Obbiettivi : Xalp si propone di raggiungere 5 obbettivi:

  1. Permettere al codice lato Client di poter accedere a dati remoti statici o generati da una elaborazione ( passando eventualmente parametri alla funzione che elaborerà i dati ) senza dover effettuare il refresh della pagina.

  2. Permettere al codice lato Client di poter accedere a più servizi remoti eventualmente passando l'output di una elaborazione come input di un altra elaborazione senza dover badare alla piattaforma e al linguaggio con i quali sono implementati i vari metodi remoti.

  3. Permettere al servizio remoto di poter inviare metodi eseguibili al client insieme alle informazioni generate dal servizio stesso in base alla richiesta. Eventualmente il servizio remoto può generare oggetti nella pagina visualizzata dal client.

  4. Permettere una netta separazione tra Client e Server. Un client Xalp non deve risiedere su di un server web.

  5. Permettere lo sviluppo di Server destinati esclusivamente ad eseguire la logica applicativa di un servizio senza dover fornire anche l'interfaccia grafica.

Panoramica

Xalp è formato da due componenti: Xalp Client CORE( XCC ) e Xalp Remote CORE ( XRC ). Inoltre Xalp definisce la struttura di un oggetto contenitore denominato _xalpObject che incapsula al proprio interno tutte le informazioni ( valori di ritorno, oggetti complessi, funzioni ) che il servizio remoto invocato spedisce verso il client. Xalp è progettato unicamente per operare immerso in pagine web, con trasporto basate su HTTP o HTTPS.

Xalp estende le funzionalità del linguaggio Javascript permettendo di effettuare comunicazioni tramite HTTP senza dover utilizzare tecnologia AJAX e senza dover effettuare il refresh delle pagine.

La comunicazione HTTP tra Client e Server è non-bloccate quindi un client Xalp dovrà implementare una funzione callBack richiamata quando l'invocazione del servizio è conclusa  ( quando il servizio esegue il metodo commitService) che si occuperà di gestire i dati ricevuti.

Architettura di Xalp

L'oggetto _xalpObject

XCC è interamente basato su Javascript. E' composto da un unico file denominato xalp.js.  XCC fornisce un unica funzione utente con firma :

  1.     SERVICE_URL : specifica l'URL dove il servizio da invocare risiede.

  2.     ARG_ARRAY :   E' un oggetto javascript di tipo Array che contiene gli argomenti da passare al servizio. (vedere : xalp-like Service)

  3.     callBackFunct :  Specifica il nome della funzione da invocare quando la chiamata è conclusa e i dati sono resi disponibili al client.

  4.     Delay                :  Attualmente non implementato. Pasare zero come parametro.

Nel file xalp.js è presente anche un metodo _commitCall(reqN). Tale funzione non è da utilizzare manualmente perchè viene richiamata dal servizio remoto quando l'esecuzione della chiamata è completata sia lato client che lato server

Esempio di utilizzo di una chiamata xalp:

 

<html>

    <head>

    <script language="javascript" src="./xalp.js"></script>   ( è necessario inserire nel tag <head> )

    </head>

    <body>

    <script language="javascript">

   

            function invocaEcho()

            {

                    var e = prompt("cosa inviare?");

                    var myParam = new Array();

                    myParam['echoMsg'] = e;

 

                    invoke("http://www.dibiasi.it/sourceData/xalp/basic/echo.aspx",myParam,"alertEcho",0);

            }           

 

          function alertEcho(_xalpObject)

         {

            alert(_xalpObject['echoResult']);  // si assume che il server abbia aggiunto all'oggeto _xalpObject il contenuto indicizzato tramite la stringa

                                                                 // echoResult.

        }

 

    </script>

</body>

</html>

 

Il programmatore, lato client, si occupa essenzialmente di gestire il risultato di una chiamata tramite Xalp. Ogni servizio che segue la specifica Xalp ritorna un oggetto di tipo _xalpObject. E' in questo oggetto che vanno recuperati i dati che il servizio rende disponibile per il client.

 

XRC  è la parte di Xalp che si occupa di implementare il servizio remoto. XRC non è una applicazione bensì una classe che mette a disposizione i seguenti metodi:

A seconda della piattaforma di sviluppo utilizzata per implementare il servizio remoto potrebbero essere disponibili un numero diverso di oggetti mappabili. Eventualmente è possibile utilizzare un mapper personalizzato per poter mappare oggetti complessi anche se appendObject dovrebbe soddisfare la maggior parte delle esigenze.

 

Il tipo di XRC analizzato in questo documento è quello fornito nel file xalpSpec.zip disponibile sul sito dibiasi.it. Tale XRC abilita le applicazioni web basate su architettura .NET a fornire servizi Xalp.

 

 

La classe XalpNet ( XRC per piattaforma .NET )

 

Questa implementazione dell 'XRC permette il mapping dei seguenti oggetti appartenti al framework .NET

 

 

System.data.sqlClient.sqlDataReader : L'oggetto viene mappato in un array di tipo :  Array[0..#rowOfQuery]['fieldName'] ovvero un array di array. Al primo livello vi si accede utilizzando il numero della riga desiderata mentre al secondo livello vi si accede tramite il numero del campo oppure tramite il nome del campo desiderato.


String :   L'oggetto viene mappato in una stringa javascript.
Integer : L'oggetto viene mappato in una stringa javascript.
Double : L'oggetto viene mappato in una stringa javascript.
 

System.collections.generic.Dictionary (of String,String) : L'oggetto viene mappato in un array a cui è possibile accedere tramite le key del dizionario.

                                                                                             Array['key'].contains['value']

System.collections.generic.Dictionary (of String,Double) : Come sopra.

System.collections.generic.Dictionary (of String,Integer) : Come sopra

 

ArrayList : L'oggetto ArrayList viene mappato in un array javascript. Il mapping automatico dell'oggetto ArrayList assume che i valori contenuti siano di tipo String,Integer o Double. Altri tipi di contenuto non verranno mappati è la classe solleverà un eccezzione. Per creare strutture complesse fare riferimento alla sezione successiva

 

DateTime : L'oggetto viene mappato in un array contenete due valori. Un valore indicizzato tramite la chiave date contentente la data e un valore indicizzato tramite la chiave time contenete l'ora. Array[{'date','time'}]{.contains['value']}. Il formato della data utilizzata è yyyyMMdd mentre per l'ora è hhhhmmss.


 

La classe XalpNet e gli oggetti complessi.

 

La classe XalpNet permette la costruzione di oggetti complessi mediante il metodo appendObject descritto sopra. Per mostrare l'utilizzo del metodo consideriamo i tre oggetti personaObject, indObject (ArrayList) e un Dictionary (of String,integer).

 

 

La funzione map(personaObject,String) non è definita in XalpNet pertanto bisogna utilizzare la funzione appendObject affinche sia possibile gestire questo tipo di oggetto:

 

Iniziamo con il mappare l'oggetto Dictionary tramite la funzione map.

 

    map(theDict,"dizionarioFigli")

 

In questo modo abbiamo registrato l'oggetto dizionarioFigli e l'abbiamo mappato. Adesso è sempre accessibile tramite il nome dizionarioFigli. Attenzione: Mappando due oggetti con lo stesso nome avviene un overwrite del vecchio!.

 

 

Mappiamo ora l'array list.

 

    map(indObject,"indirizziPersona")

 

Abbiamo ora disponibili i due oggetti da collegare all'oggetto principale personaObject.

Dobbiamo ora mappare l'oggetto personaObject. Tramite XalpNet abbiamo la possibilità di appendere qualsiasi oggetto mappato ad un altro oggetto. Quindi è per noi possibile appendere un oggetto mappato ad una stringa.... utilizziamo quindi:

 

    map(new String("nomeUtente"),"un nome")

    map(new String("personaObject"),"personaObject")

 

Abbiamo ora un oggetto personaObject mappato e quindi utilizzabile. Utilizziamo la funzione appendObject per costruire l'oggetto finale completo:

 

    appendObject("dizionarioFigli","personaObject")

    appendObject("nomeUtente","personaObject")

    appendObject("indirizziPersona","personaObject")

 

    addResultItem("personaObject") <-- lo aggiungiamo all'oggetto _xalpObject

 

L'oggetto "personaObject" anche se non mappabile direttamente è stato aggiunto all'oggetto _xalpObject.

E' possibile dunque evitare di creare un mapper personalizzato per oggetti complessi utilizzando la funzione appendObject.

 

E le immagini?

Il mapping delle immagini non è attualmente disponibile in Xalp. Una possibile soluzione potrebbe essere aggiungere all'oggetto _xalpObject una URL utilizzabile per recuperare l'immagine.

 

 

Implementazione di un servizio xalp-like su piattaforma .NET ( tramite XalpNet )

 

Xalp per .NET Framework ( XalpNet ) non necessita di nessuna configurazione particolare per essere eseguito. E' necessario importare la classe all'interno dell'applicazione web (quindi nella cartella appropriata app_code ).

 

E' possibile implementare un servizio tramite una web form ( pagina aspx ) o un web control ( ascx ) .

E' necessario utilizzare la seguente specifica per scrivere un servizio xalp correttamente:

  1. Un servizio xalp-like non scrive nulla nel flusso HTTP di risposta:  Nessun TAG HTML deve essere inserito nella pagina aspx o nel web control ascx che implementerà il servizio. Tale pagina, o controllo, vengono usati solo per implementare la logica applicativa che costruirà l'oggetto _xalpObject di risposta. La pagina conterrà solo codice eseguibile, racchiuso tra i tag <% %>.  

  2. Il flusso HTTP di risposta non verrà mai utilizzato direttamente ( a meno di non voler scrivere un servizio pure xalp )

  3. Ogni servizio Xalp verrà gestito da una propria istanza della classe XalpNet. Tale classe non và condivisa ( per quanto riguarda questa release) tra servizi diversi!

  4. Ogni servizio Xalp deve richiamare il metodo initService della classe XalpNet prima di qualsiasi altro metodo.

  5. Ogni servizio Xalp deve richiamare il metodo commitService della classe XalpNet dopo l'ultima istruzione eseguibile!

Per quanto riguarda il servizio da implementare è possibile utilizzare tutte le funzioni che il framework .NET mette a disposizione facendo attenzione al mapping dei tipi durante la costruzione dell'oggetto _xalpObject.

Esempio completo di utilizzo di Xalp.

Il servizio HelloWorld  (http://www.dibiasi.it/sourceData/xalp/basic/HelloWorld.aspx)

Il servizio è stato implementato in una pagina aspx.

<%

    ' HelloWorld with XalpNet


    Dim myServ As xalpNET = New xalpNET(Request, Response)  // si passa all'oggetto il flusso http di richiesta e risposta.
    myServ.initService()
    myServ.map("hello world by xalp", "helloMsg")
    myServ.addResultItem("helloMsg")
    myServ.commitService()

%>

Il client per accedere al servizio

<html>

    <head>

        <script language="javascript" src="./xalp">

        </script>

    </head>

    <body>

            <script language="javascript">

                    invoke("http://www.dibiasi.it/sourceData/xalp/basic/HelloWorld.aspx",new Array(),"doXalp",0);

                    function doXalp(_xO)

                    {

                        alert(_xO['helloMsg']);

                    }

            </script>

    </body>
</html>