====== 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é !