====== 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) :