====== Architecture eP-Admin ====== Accès au [[https://bioproj.extra.cea.fr/redmine/wiki/epims/BlocNote_creation_eP-Admin | Bloc Note sur la création eP-Admin]] sur le serveur RedMine Ce Projet est un projet écrit en GWT. On retrouve donc l'architecture classique (je crois ;o)) des projets GWT : (référence : [[http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&s=google-web-toolkit-doc-1-5&t=GettingStartedCreateProject| GWT Project]]) * Sous cea.edyp.epims.admin on trouve ''AdminManager.gwt.xml'' : définition du module utilisé pour le //hosted// mode. * package cea.edyp.epims.admin.public : contient les fichiers (css, js, html...) qui seront copié tels quel dans l'application web finale. * package cea.edyp.epims.admin.client : Code qui sera ensuite compilé en JS pour être exécuté coté client. Voir les restriction sur le site GWT... * package cea.edyp.epims.admin.server : Code Java exécuté coté serveur. * Sous WebContent/WEB-INF: Définition des fichiers de configuration des application Web ===== Hosted Mode pour le développement ===== GWT permet de tester son application avec un serveur embarqué. Le fichier ''AdminManager.gwt.xml'', qui est utilisé pour ce mode et uniquement pour ce mode, est mis à jour automatiquement lors de la création de RemoteService par CypalStudio. La définition du servlet implémentant le nouveau RemoteService est ajouté : Or, **ATTENTION**, nous utilisons une architecture hibernate / spring et l'accès aux services GWT ne peut pas se faire directement ! Il est nécessaire de passer via les servelt dispatcher de spring ... voir chapitre cote serveur... ce qui n'est pas possible en //hosted mode//. Par conséquent, lors de l'ajout de nouveau RemoteService il est nécessaire : * de créer, coté serveur, un FakeXXXGWTServiceImpl * de modifier ''AdminManager.gwt.xml'' pour référencer cette classe ===== Coté Client ===== Sous le package cea.edyp.admin.client on retrouve les sous-packages : * model : définition des objets manipulés cote client * service : interface des services (RemoteService) rendu par le serveur * ui : définition de Panel constituant l'IHM. * ui.component : définition de composants plus générique utilisés dans l'IHM. * util : icône et Class ImageBundle correspondante ainsi que la définition des ressources (messages) === RemoteService === Pour plus d'info voir le [[http://code.google.com/webtoolkit/|site GWT]] Pour chaque Remote Service, on trouve : * les interfaces (XXXGWTService et XXXGWTServiceAsync) . Chaque interface XXXGWTService contient le code suivant : public static final String SERVICE_URI = "uri.service"; public static class Util { public static XXXGWTServiceAsync getInstance() { XXXGWTServiceAsync instance = (XXXGWTServiceAsync) GWT.create(XXXGWTService.class); ServiceDefTarget target = (ServiceDefTarget) instance; target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI); return instance; } } Le ''ServiceURI'' est l'URI utilisé pour l'appel au service cote serveur. **__Attention__**, cette uri doit impérativement être terminé par ''.service'' (voir //cote serveur//). La classe Util permet d'obtenir la classe d'implémentation (fourni par GWT) des services. L'utilisation des services dans le code client est simple : XXXGWTServiceAsync xxxService = XXXGWTService.Util.getInstance(); xxxService.serviceMethod(uniqueParam, new MyOperationCallback()); La classe ''MyOperationCallback'' défnit les méthodes ''onSucess'' et ''onFailure'' appelés par le serveur. ===== Coté Serveur ===== Pour plus d'info voir le [[http://code.google.com/webtoolkit/|site GWT]] Dans le package cea.edyp.epims.admin.server on trouve les classes d'implémentation des RemoteService. Ces classes utilisent les services eP-Core pour l'accès aux données. L'accès aux services d'eP-Core se fait grâce à spring. ([[http://code.google.com/p/google-web-toolkit-incubator/wiki/IntegratingWithSpring | Integrating with GWT]]) * fichier //web.xml// contient la définition d'un spring dispatcher. La configuration de celui-ci est dans le fichier //springDispatcher-servlet.xml//. Aucune modification n'est nécessaire ici lors de l'ajout de service. **__Attention__**: lors de la création de RemoteService avec CypalStudio, du code est **automatiquement ajouté** (servlet et servlet-mapping) et **doit être supprimé** ! La définition à conservée : springDispatcher org.springframework.web.servlet.DispatcherServlet springDispatcher *.service * fichier //springDispatcher-servlet.xml// fichier spring permettant l'accès aux services GWT et la configuration de ceux-ci avec les services eP-Core ! * mapping entre les url et le bean appelé : /**/archive.service=archiveController /**/data.service=dataController * définition des bean appelé : tous ayant la même classe d'implémentation mais avec la propriété remoteService initialisée différemment. Ces remoteService correspondent à l'implémentation des RemoteService GWT. __**Attention**__ : en plus de ce que dit la doc, GWTController doit également implémenter ServletContextAware pour être correctement initialisé ! * Initialisation des beans services GWT avec les services eP-Core (id des beans définis dans le contexte spring d'eP-Core) :