User Tools

Site Tools


wiki:epims4_0m2:developer:epcorearchitecture

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
wiki:epims4_0m2:developer:epcorearchitecture [2008/07/21 16:57]
dupierris
wiki:epims4_0m2:developer:epcorearchitecture [2008/10/02 10:21] (current)
Line 1: Line 1:
 ===== Architecture ===== ===== Architecture =====
 Cette section décrit l’organisation des packages ainsi que les points d’interaction entre les objets des différents frameworks. eP-Core ne concernant pas tout ce qui se rapporte à la partie présentation,​ seuls les objets de persistance de données et ceux propre à la logique applicative sont définis. Cette section décrit l’organisation des packages ainsi que les points d’interaction entre les objets des différents frameworks. eP-Core ne concernant pas tout ce qui se rapporte à la partie présentation,​ seuls les objets de persistance de données et ceux propre à la logique applicative sont définis.
 +
  
  
Line 6: Line 7:
  
 {{ epc_diagram_appli.png }} {{ epc_diagram_appli.png }}
-** Figure ​Diagramme de classe globale ** +** FigureDiagramme de classe globale ** 
  
   *  Les objets du package BO (BusinessObject) représentent les données du model (en l’occurrence celles de la base de données). Ces objets ne contiennent que des informations (des attributs) mais pas de ‘comportements’. Ils sont accessibles dans toutes les couches de l’application.   *  Les objets du package BO (BusinessObject) représentent les données du model (en l’occurrence celles de la base de données). Ces objets ne contiennent que des informations (des attributs) mais pas de ‘comportements’. Ils sont accessibles dans toutes les couches de l’application.
Line 22: Line 23:
  
 **REMARQUE** : ServiceLocator recherche dans l’ApplicationContext qui lui est spécifié les beans correspondants à l’implémentation de IXXXService (définit dans spring-*.xml). **REMARQUE** : ServiceLocator recherche dans l’ApplicationContext qui lui est spécifié les beans correspondants à l’implémentation de IXXXService (définit dans spring-*.xml).
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
  
Line 44: Line 58:
 \\ \\
 ---- ----
-\\ 
 == Remarque == == Remarque ==
  
-FIXME Cette partie ​est en cours de mise en place et est donc susceptible d'​évoluer en permanence ! +L'​architecture du projet eP-Core suite à l'​utilisation de Hibernate Tools n'est pas celle de la version distribuée (eP-Core 3.4.6) dans ePims 4.0M2 
 +mais elle est intégrée à partir de la version 3.5.0  (seule cette intégration différencie les versions)
  
 Actuellement pour la génération automatique nous utilisons Hibernate Tools comme plugin Eclipse.  ​ Actuellement pour la génération automatique nous utilisons Hibernate Tools comme plugin Eclipse.  ​
-Les règles / spécificités que l'​on ​souhaite ​conserver : +Les règles / spécificités que l'​on ​a souhaité ​conserver : 
-  *Absolument +  * Absolument 
-    * séparation des POJOs et DAOs dans des packages différents +    * séparation des POJOs et DAOs dans des packages différents ​: **OK Avec Hibernate Tools !**  
-    * séparation interface / implémentation pour les DAOs    ​ +    * séparation interface / implémentation pour les DAOs    ​: **OK Avec Hibernate Tools !** 
-  ​Éventuellement +
-    ​deux niveaux de hiérarchie pour les POJOs+
  
-De plus les modifications entrainées par le changement de //​générateur// ​doit impacter au minimum les modules utilisant eP-Core.+La séparation en deux niveaux de hiérarchie pour les POJOs n'est pas possible (a moindre coût ... après une rapide évaluation). 
 + 
 +De plus les modifications entrainées par le changement de //​générateur// ​doivent ​impacter au minimum les modules utilisant eP-Core.
 \\ \\
 ---- ----
 \\ \\
 == Préparation == == Préparation ==
-Pour les différentes générations automatiques décrites ici, il est nécessaire de définir une ''​configuration hibernate''​. ​+Pour les différentes générations automatiques décrites ici, il est nécessaire de définir une ''​configuration hibernate''​. \\ 
 +**Remarque** le fichier \eP-Core\resources\hibernate\hibernate.cfg.xml utilisé par Hibernate Tools ne défini pas de connexion à la BD puisque les fichiers hbm.xml sont créés manuellement et les objets générés le sont à partir de ces fichiers hbm. Il n'y a donc pas de connexion à la BD pour la génération automatique.
  
 +\\
 +1.\\
 Dans la perspective Hibernate et la vue ''​Hibernate Configurations'',​ cliquer droit et choisir "add Configuration"​. ​ Dans la perspective Hibernate et la vue ''​Hibernate Configurations'',​ cliquer droit et choisir "add Configuration"​. ​
 Choisir un nom, <​ePCore_config>,​ et saisir les informations suivantes: ​ Choisir un nom, <​ePCore_config>,​ et saisir les informations suivantes: ​
Line 73: Line 90:
     * Entrer tous les fichiers hbm.xml qui sont définis dans /​eP-Core/​src/​mapping/​cea/​edyp/​epims/​domain/​mapping     * Entrer tous les fichiers hbm.xml qui sont définis dans /​eP-Core/​src/​mapping/​cea/​edyp/​epims/​domain/​mapping
  
 +\\
 +2.\\
 De la même manière, il faut définir un ''​Hibernate Code Generation''​ (<​HCG>​) ou ''​launch configuration''​. Un même HCG peut être utiliser pour générer en une seule fois tous les objets et documents. Mais ceci peut poser un problème puisque tous les objets ne doivent pas être générés à chaque fois !! A chacun de gérer sa/ses HCG et à être attentif aux objets générés lors de l'​exécution de celui-ci !  De la même manière, il faut définir un ''​Hibernate Code Generation''​ (<​HCG>​) ou ''​launch configuration''​. Un même HCG peut être utiliser pour générer en une seule fois tous les objets et documents. Mais ceci peut poser un problème puisque tous les objets ne doivent pas être générés à chaque fois !! A chacun de gérer sa/ses HCG et à être attentif aux objets générés lors de l'​exécution de celui-ci ! 
-Nous décrirons dans la doc trois configurations différentes selon que l'on souhaite générer la [[.:​epcoreintro#​generation_de_la_doc_du_modele|documentation du modèle]], les [[objets du domaines]] ou les [[#​Génération|DAO]].+Nous décrirons dans la doc trois configurations différentes selon que l'on souhaite générer la [[.:​epcoreintro#​generation_de_la_doc_du_modele|documentation du modèle]], les [[#​Génération1|objets du domaines]] ou les [[#​Génération|DAO]].
  
  
Line 88: Line 107:
  
 Les DAO sont générés dans le répertoire source “src/​main” et  Les DAO sont générés dans le répertoire source “src/​main” et 
-  * le package “cea.edyp.epims.domain.dao.impl” pour les classes d'​implémentation+  * le package “cea.edyp.epims.domain.dao.impl” pour les classes d'​implémentation. Une méthode static permet d'​obtenir une instance de la classe à partir d'un context spring. Cette méthode suppose que le bean correspondant à cette classe est identifié par un nom = nom de la classe ! 
   * le package “cea.edyp.epims.domain.dao” pour les interfaces. Seules les interfaces sont référencées dans les services.   * le package “cea.edyp.epims.domain.dao” pour les interfaces. Seules les interfaces sont référencées dans les services.
  
-Pour cela, depuis Eclipse, ouvrir la perspective Hibernate et accéder à la boite de dialogue ​Hibernate Code Generation, (en passant par le menu Run > Hibernate Code Generation > Open Hibernate Code Generation Dialog).+Pour cela, depuis Eclipse, ouvrir la perspective Hibernate et accéder à la boite de dialogue ​''​Hibernate Code Generation''​, (en passant par le menu Run > Hibernate Code Generation > Open Hibernate Code Generation Dialog).
  
 Créer un ''​Hibernate Code Generation''​ (<​HCG>​) ou ''​launch configuration''​ en spécifiant ​ Créer un ''​Hibernate Code Generation''​ (<​HCG>​) ou ''​launch configuration''​ en spécifiant ​
   * Dans l'​onglet **Main**   * Dans l'​onglet **Main**
     * un nom,      * un nom, 
-    * **Console configuration** : le nom de la configuration hibernate créé (voir ci-dessus), <​ePCore_config>​.+    * **Console configuration** : le nom de la configuration hibernate créé (voir [[#​preparation|ci-dessus]]), <​ePCore_config>​.
     * **Output directory** : \eP-Core\src\main     * **Output directory** : \eP-Core\src\main
   * Dans l'​onglet **Exporters**   * Dans l'​onglet **Exporters**
-    * Selon que l'on souhaite générer les interfaces et/ou les classes pour les DAO, il faut sélectionner un ou deux ''​Generic Exporter''​ configuré(s) comme celui indiqué ​ci-dessous. On peut ajouter et configurer autant de ''​Generic Exporter''​ que voulu en sélectionnant add dans l'​onglet **Exporters**.+    ​* Sélectionner l'​option "Use Java 5 Syntax"​ (afin d'​utiliser les ''​Generic''​) 
 +    ​* Selon que l'on souhaite générer les interfaces et/ou les classes pour les DAO, il faut sélectionner un ou deux ''​Generic Exporter''​ configuré(s) comme ceux indiqués ​ci-dessous. On peut ajouter et configurer autant de ''​Generic Exporter''​ que voulu en sélectionnant add dans l'​onglet **Exporters**.
       * Les paramètres pour les templates et le pattern pour la localisation et le nom de fichier diffèrent.       * Les paramètres pour les templates et le pattern pour la localisation et le nom de fichier diffèrent.
-      * **Attention** : Il est possible d'​exécuter ​ce HCG que sur un sous ensemble de fichiers mapping (les nouveaux par exemple). Pour cela il faut utiliser une ''​console configuration''​ dans laquelle seuls ces fichiers auront été spécifiés.+      * **Remarque** : Il est possible d'​exécuter ​le(s) exporter(s) ​que sur un sous-ensemble de fichiers mapping (les nouveaux par exemple). ceci afin de ne pas écraser les interfaces existantes... Pour cela il faut utiliser une ''​console configuration''​ dans laquelle seuls ces fichiers auront été spécifiés.
  
 {{ epc_hcg_dao.png }} {{ epc_hcg_dao.png }}
-** Figure: ​Diagramme de classes exemple pour les DAO Hibernate ** +** Figure: ​Génération automatique des DAO Hibernate ** 
  
 **__Attention__**:​ Certaines interfaces sont enrichies. La génération automatique ne doit donc pas être faite systématiquement et doit être faite avec précaution !  **__Attention__**:​ Certaines interfaces sont enrichies. La génération automatique ne doit donc pas être faite systématiquement et doit être faite avec précaution ! 
Line 119: Line 139:
  
 === Les POJOs ===  === Les POJOs === 
-Les Objets du domaines sont générés depuis les fichiers *.hbm.xml, dans le répertoire source src/main. Pour chaque classe du domaine, une classe abstraite est créée.+Les Objets du domaines sont générés depuis les fichiers *.hbm.xml, dans le répertoire source src/​main. ​
  
-Seules les classes mères abstraites “AbstractXXX” sont systématiquement générées. ​:!: A verifier avec Eclipse : Les sous classes ne sont générées que la première fois ce qui permet de les personnaliser sans tout perdre à chaque génération. ​+== Génération == 
 +**__Attention:__** \\ 
 +La génération est en cour de mise au point !
  
-{{ epc_dao_diagram.png?800 }} +Hibernate Tools ne permet pas de générer pour chaque classe du domaine, une classe abstraitePour le moment, il a été choisi de : 
-** FigureDiagramme ​de classes ​exemple ​pour les objets du domaine ​** +  * Revoir la hiérarchie des classes du domaines pour adopter celle générée par Hibernate Tools. Pour le code propriétaire (non généré) il est possible de le faire apparaitre au niveau des hbm.xml **(cf ci-dessous)** 
 +\\  
 +Dans  le cas où cette solution n'est plus satisfaisante,​ une autre solution serait de créer un ReverseEngineeringStrategy propriétaire pour générer les 2 niveaux qui existaient.  
 + 
 +__1. Le "​Custom code"​__ 
 + 
 +Intégration du //Custom code// définis dans les versions précédentes avec HibernateTools:​ \\ 
 + 
 +^ Custom Code  ^ Intégration dans HibernateTools ​ ^ 
 +| Méthode equals ​ | Utilisation du tag <meta attribute="​use-in-equals">​ pour les cas simples et de <meta attribute="​class-code"​ pour une définition plus complète ​ | 
 +| Méthode hashcode | Possibilité d'​utiliser <meta attribute="​class-code"​ si nécessaire ​ | 
 +| Méthode toString ​ | Possibilité d'​utiliser <meta attribute="​use-in-tostring">​ pour les cas simples et de <meta attribute="​class-code"​ pour une définition plus complète ​ | 
 +| AcquisitionResult . Méthode Boolean getArchived() retourne not null object ​ | Impossible de redéfinir cette méthode. La colonne ayant une valeur par défaut (false), utilisation de la méthode générée. **A l'​utilisateur de faire les vérifications** ! Peut aussi défini getNoneNullArchived() ​?!  | 
 +|Acquisition Définition des ''​Nature''​s autorisées. |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|Actor Définition des ''​Role''​s autorisées. :!: devrait être dans ActorRole ?! |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Déplacé effectivement dans ActorRole (qui n'​existait pas au début). Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|AttachedFile Définition des ''​Type''​s autorisées.. ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|Program : Méthodes isClosed et CloseProgram ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|Project : Méthodes isClosed et CloseProject ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|Sample Définition des ''​Status''​ autorisées.. ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|Study Définition des ''​Status''​ autorisées.. ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|VirtualPlate Méthodes addWell et isFull ​ |Utilisation du tag <meta attribute="​class-code">​ pour générée le code supplémentaire. :!: Utilisation des FQCN car pas d'​ajout d'​import ​ | 
 +|VirtualWell surcharge des constructeurs ayant un VirtualPlate comme paramètre pour appeler VirtualPlate.addWell |Impossible de surcharger. :!: Déplace la fonctionnalité dans le service IRobotPlanningService ​ | 
 + 
 +__2. Initialisation de l'ID__ \\ 
 +Jusque là, l'​appel suivant était ajouté dans les constructeurs pour initialisation de l'ID à la valeur spécifiée comme unsaved-value dans le hbm.xml 
 +<​code>​ 
 +super.setId(-1); ​    //Set id to -1 => unsaved-value 
 +</​code>​ 
 +Pour les classes: 
 +  ​Acquisition 
 +  ​AcquisitionProtocol 
 +  * AcquisitionResult 
 +  * Aliquotage 
 +  * AttachedFile 
 +  * BiologicOrigin 
 +  * ChromatographyColumn 
 +  * Contact 
 +  * Gel1D 
 +  * Instrument 
 +  * MassPlanning 
 +  * Mix 
 +  * Program 
 +  * Project 
 +  * Protocol 
 +  * ProtocolStep 
 +  * RobotPlanning 
 +  * RunRobot 
 +  * SampleAttachedFile 
 +  * SampleKind 
 +  * SampleLocator 
 +  * SampleType 
 +  * SeparationResult 
 +  * Species 
 +  * Study 
 +  * StudyAttachedFile 
 +  * SubCellularLocalisation 
 +  * Support 
 +  * VirtualWell 
 + 
 +A partir de la version 3.5.0 d'​eP-Core,​ la définition de l'id dans les hbm.xml a été changé de  
 +<​code>​ 
 +<id ... type="​int"​ unsaved-value="​-1"​ 
 +</​code>​ 
 +
 +<​code>​ 
 +<id ... type="​Integer"​ unsaved-value="​null"​ 
 +</​code>​ 
 + 
 +Par conséquent,​ il n'y a pas de code spécifique à ajouter dans les constructeurs. 
 + 
 +__3. Gestion des composite-id__ \\ 
 +Voir comment sont gérés les composite-id dans hibernate toolsActorRoleId,​ TreatmentsApplicationId 
 + 
 +=> Hibernate Tools ne défini pas de classes ​spécifique ​pour les composite ID... seulement tous les paramètres appartenant à la clé diovent être spécifiés ! 
 + 
 +__4. Génération avec Hibernate Tools__  
 + 
 +Les POJOs sont générés dans le répertoire source “src/​main” et le package cea.edyp.epims.domain 
 +Pour cela, depuis Eclipse, ouvrir la perspective Hibernate et accéder à la boite de dialogue ''​Hibernate Code Generation'',​ (en passant par le menu Run > Hibernate Code Generation > Open Hibernate Code Generation Dialog). 
 + 
 +Créer un ''​Hibernate Code Generation''​ (<​HCG>​) ou ''​launch configuration''​ en spécifiant  
 +  ​Dans l'​onglet ​**Main** 
 +    * un nom,  
 +    * **Console configuration** : le nom de la configuration hibernate créé (voir [[#​preparation|ci-dessus]]),​ <​ePCore_config>​. 
 +    * **Output directory** : \eP-Core\src\main 
 +  * Dans l'​onglet **Exporters** 
 +    * Sélectionner l'​option "Use Java 5 Syntax"​ (afin d'​utiliser les ''​Generic''​) 
 +    * Sélectionner ''​Domain Code (Java)''​ et le configurer avec la propriété ''​Template directory''​ = ''​\eP-Core\resources\hibernate\templates''​  
 + 
 +Exécuter la génération en sélectionnant Run ...
  
  
 === Les Services === === Les Services ===
  
-**__Accès__:​**+== Accès ==
  
 Seules les interfaces IxxxService sont visibles depuis toute autre application (telle que la couche présentation) qui utilisera eP-Core. Ces interfaces devront fournir les méthodes nécessaires pour l’accès aux données en lecture et en écriture. Seules les interfaces IxxxService sont visibles depuis toute autre application (telle que la couche présentation) qui utilisera eP-Core. Ces interfaces devront fournir les méthodes nécessaires pour l’accès aux données en lecture et en écriture.
  
  
-**__Règles ​de développement__**+== Règles ​de développement ==
  
 Les méthodes pour l'​écriture des données sont de la forme : Les méthodes pour l'​écriture des données sont de la forme :
Line 179: Line 290:
   * Et pour les DAOs :   * Et pour les DAOs :
 <code xml> <code xml>
-    <bean id="actorDAO" class="​cea.edyp.epims.domain.dao.impl.HibernateActorDAO" ​ >+    <bean id="ActorDAO" class="​cea.edyp.epims.domain.dao.impl.HibernateActorDAO" ​ >
         <​property name="​hibernateTemplate"><​ref bean="​hibernateTemplate"/></​property>​         <​property name="​hibernateTemplate"><​ref bean="​hibernateTemplate"/></​property>​
     </​bean>​     </​bean>​
wiki/epims4_0m2/developer/epcorearchitecture.1216652230.txt.gz · Last modified: 2008/09/24 15:35 (external edit)