Architecture des Applications Réticulaires Id : cours6.bk 76 2010-01-12 17 :07 :21Z queinnec Christian Queinnec Université Paris 6 Deuxième vague 2010-2011
UPMC NI584-2010nov c C.Queinnec 2/23 Plan 1 Approches modernes Tendances 2 3 Hop 4 Links 5 Ocsigen 6 Continuation 7 Conclusions
UPMC NI584-2010nov c C.Queinnec 3/23 Approches modernes Approches modernes Application web en un seul programme source, en un seul langage (il faut donc séparer ce qui tourne côté client ou côté serveur) Désir de plus de vérifications statiques (notamment que l XML engendré est valide vis-à-vis d une grammaire) Quelques réalisations : Hop Continuations, Rife Links, Xduce, Ocsigen
Modèles : classique ou Ajax Approches modernes évenement navigateur serveur informations réaffichage évenement navigateur éventuellement! serveur RPC informations réaffichage UPMC NI584-2010nov c C.Queinnec 4/23
UPMC NI584-2010nov c C.Queinnec 5/23 Google Widget Toolkit L application est écrite en Java Les parties à exécuter côté client sont regroupées dans un paquetage.../client/ et sont compilées en Javascript Bibliothèque d exécution en Javascript (JRE emulation library) avec les principales classes de Java (et leurs principales méthodes) et des widgets : java.lang.{boolean, Class, Number, Integer, StringBuffer, Math, System,... } et des exceptions et des interfaces java.util.{collections, Collection, Date, Vector, HashMap, HashSet, TreeMap,... } Button, TextBox, TextArea, CheckBox, Grid, FlexTable, MenuBar, PopupPanel...
UPMC NI584-2010nov c C.Queinnec 6/23 compilations Plusieurs compilations possibles pour test en local (pur Java) via l IDE pour tests JUnit avec navigateur externe (et serveur Tomcat) par type de navigateur (et par langue) par mode d obfuscation de Javascript Manipulation de l historique
UPMC NI584-2010nov c C.Queinnec 7/23 application Une série d outils (à la Catalyst ou Ruby on Rails) pour créer les squelettes des fichiers à modifier : projectcreator, applicationcreator, i18ncreator, junitcreator (connaissent Eclipse en plus). % applicationcreator -out. fr.upmc.aar.client.app src/fr/upmc/aar/app.gwt.xml src/fr/upmc/aar/client/app.java src/fr/upmc/aar/public/app.html App.launch App-shell App-compile
UPMC NI584-2010nov c C.Queinnec 8/23 App-shell (development mode)
UPMC NI584-2010nov c C.Queinnec 9/23 Mode de mise au point ou déploiement Eclipse JVM(32b) Tomcat client.app server.app logdebug Mozilla+swt appserver server.app navigateur client.js
UPMC NI584-2010nov c C.Queinnec 10/23 page de garde en XHTML <html ><head ><title >... </ title > <meta name = gwt : module content = fr. upmc. aar.app / </ head > <body ><script language = javascript src = gwt.js /> <iframe id= gwt_historyframe style = width :0; height =0; border :0 /> <div id= content ></ div > </ body ></ html >
UPMC NI584-2010nov c C.Queinnec 11/23 application client package fr. upmc. aar. client ; public class Appl implements EntryPoint { public void onmoduleload () { RootPanel. get (" content "). add (/* buttons, etc. */ ); } // autres methodes de renvoi ( callback ), etc. } Attention : Java 1.5 et JRE réduite mais widgets additionnels
UPMC NI584-2010nov c C.Queinnec 12/23 descripteur de l application < module > < inherits name = com. google. gwt. user. User /> <entry - point class = fr. upmc. aar. client. App /> <! -- et des tas d autres descripteurs -- > < servlet path = / myservice class = fr. upmc. aar. server. AServiceImpl /> </ module >
UPMC NI584-2010nov c C.Queinnec 13/23 RPC côté serveur package fr. upmc. aar. client ; public interface AService extends RemoteService { Date getdate (); Date getsomedate ( long time ); } package fr. upmc. aar. server ; public class AServiceImpl extends RemoteServiceServlet implements AService { public Date getsomedate ( long time ) { return new Date ( time ); } public Date getdate () { return new Date (); } } // et ajout dans src /fr/ upmc / aar / App. gwt. xml (cf. tran
UPMC NI584-2010nov c C.Queinnec 14/23 RPC côté client package fr. upmc. aar. client ; public interface AServiceAsync { void getdate ( AsyncCallback cb ); void getsomedate ( long time, AsyncCallback cb ); } // utilisation AServiceAsync proxy = ( AServiceAsync ). create ( AServ ServiceDefTarget target = ( ServiceDefTarget ) proxy ; target. setserviceentrypoint (. getmodulebaseurl () + " AsyncCallback cb = new AsyncCallback () { public void onfailure ( Throwable caught ) {... } public void onsuccess ( Object result ) {...} }; proxy. getsomedate (42, cb ); proxy. getdate (cb );
UPMC NI584-2010nov c C.Queinnec 15/23 RPC anatomie (d après Google)
UPMC NI584-2010nov c C.Queinnec 16/23 et Javascript Injection et couplage (dans les deux sens) à des bibliothèques Javascript tierces (JSNI Javascript native interface) public native int length ( List list ) /* -{ return list. @java. util. List :: length ()(); }-*/; Structure pour méthodes : objet.classe : :method(typearguments)(arguments) Structure pour champs : objet.classe : :champ ou classe : :champ pour champ statique Sans oublier $wnd et $doc pour les variables globales de Javascript : window et document.
UPMC NI584-2010nov c C.Queinnec 17/23 Conclusions sur Java 1.5 maintenant JUnit 3 seulement l an dernier, HTMLunit cette année RPC encore trop verbeux à utiliser pour mon goût pas incompatible d autres architectures logicielles Des compléments : Handler et Spring, Server Library (-WL)
UPMC NI584-2010nov c C.Queinnec 18/23 Hop Hop Application web en un seul programme source, en un seul langage Hop (Scheme) compilé vers Javascript et séparation fine entre code client et serveur Architecture avec un courtier (broker) intermédiaire entre le navigateur et Internet Compilation incrémentielle ou à la volée RPC synchrone (sérialisation par S-expression) Cf. transparents coordination09.sld ou MitchFest/coordination.sld de la weblet HopSlide (http://hop.inria.fr/)
UPMC NI584-2010nov c C.Queinnec 19/23 Links Links Application web en un seul programme Un seul langage pour client, serveur et base de données. Le langage est compilé vers Javascript ou SQL (et actuellement interprété côté serveur en OCaml) les fonctions sont annotées client ou server typé statiquement, purement fonctionnel (pas d affectation mais update en base possible) Côté base, langage à la LINQ Côté client, langage à la Erlang (processus et message asynchrone) Continuations stockées côté client
UPMC NI584-2010nov c C.Queinnec 20/23 Ocsigen Ocsigen Application web en un seul programme source OCaml. Vérification statique (par typage) de la génération d XML conforme à une grammaire (un certain type) [Dans la lignée d XDuce] Pas de compilation côté client Usage de continuations pour dialogues complexes cf. article
UPMC NI584-2010nov c C.Queinnec 21/23 Continuation Continuation ( let (( n1 ( read1stnumber ))) ( let (( n2 ( read2ndnumber n1 ))) ( displaysum n1 n2) ) ) ( define ( read1stnumber ) ( define ( create- page kurl ) ( html ( head ( title " First number?")) ( body ( form action : kurl " Un nombre SVP : " ( input type : text name : "n1") ( input type : submit value : "go!") ) ( let (( request ( show create- page ))) ( string- > number ( request-parameter-get request "n1") ) ) ) ( define ( show page- creator ) ( call /cc ( lambda (k) ( answer- then- wait ( page- creator ( register! k ))) )
UPMC NI584-2010nov c C.Queinnec 22/23 Continuations : avantages Continuation Écriture en style direct : continuations et fermetures assurent automatiquement le passage des informations d une page à l autre Complète maîtrise des dialogues en présence de Back et Clone Composabilité des applications Langage à continuations : Scheme. Il y a aussi des implantations qui procurent des continuations : SML/NJ, Rhino (Javascript), SeaSide (Squeak),... La transformation de programme CPS permet de convertir tout programme utilisant des continuations en un programme équivalent n en n utilisant point. Mais voir aussi Rife en Java.
UPMC NI584-2010nov c C.Queinnec 23/23 Conclusions Conclusions Pour l instant, seulement des tendances