This is an old revision of the document!
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.
Figure: Diagramme de classe globale
En résumé, la couche model rend visible d’une part les objets représentant les données (package BO) et, d’autre part, les interfaces Services qui permettent de manipuler ces données.
On retrouve donc dans les fichiers de configuration xml : (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).
L'objectif est d'obtenir la même architecture que celle décrite ci-dessus mais en utilisant les outils de génération automatique et en évitant au maximum de devoir définir des “template” maison.
Le fichier ./hibernate.reveng.xml est le fichier de Reverse Engineering de Hibernate. Il permet de spécifier, entre autre, des noms de classes différentes que ceux proposés par défaut pour certaines tables.
o table ms_protocol => classe cea.edyp.epims.domain.dao.impl.MSProtocol o table msms_protocol => classe cea.edyp.epims.domain.dao.impl.MSMSProtocol o table gel_1d => classe cea.edyp.epims.domain.dao.impl.Gel1D o table gel_2d => classe cea.edyp.epims.domain.dao.impl.Gel2D o table gel_1d_migration => classe cea.edyp.epims.domain.dao.impl.Gel1DMigration o table gel_2d_migration => classe cea.edyp.epims.domain.dao.impl.Gel2DMigration o table sample_species => classe cea.edyp.epims.domain.dao.impl.Species o table sample_subcellular_localisation => classe cea.edyp.epims.domain.dao.impl.SubCellularLocalisation
Cette partie est en cours de mise en place et est donc susceptible d'évoluer en permanence !
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 :
De plus les modifications entrainées par le changement de générateur doivent impacter au minimum les modules utilisant eP-Core.
Pour les différentes générations automatiques décrites ici, il est nécessaire de définir une configuration hibernate
.
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:
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 documentation du modèle, les objets du domaines ou les DAO.
Les tables suivantes ne nécessitent pas de classes DAOs:
Les DAO sont générés dans le répertoire source “src/main” et
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
Generic
)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.console configuration
dans laquelle seuls ces fichiers auront été spécifiés.
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 !
Après génération des classes DAO, certaines modifications manuelles sont nécessaires. En effet, ces classes sont générées en fonction de templates correspondant à la définition des interfaces. Si des modifications manuelles sont faites au niveau des interfaces, il est nécessaire de les répercuter au niveau des classes.
Par exemple (seul exemple pour le moment ! ), pour l'objet Study :
Les Objets du domaines sont générés depuis les fichiers *.hbm.xml, dans le répertoire source src/main.
Attention:
La génération automatique n'est actuellement pas en place. Hibernate Tools ne permettant pas de générer pour chaque classe du domaine, une classe abstraite. Deux solutions :
Le Custom code actuellement définis :
Nature
s autorisées.Role
s autorisées. Type
s autorisées.Status
autorisées.Status
autorisées + Méthodes isClosed et CloseStudy et setSamples
Pour chaque classe du domaine, une classe abstraite est créée.
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.
Figure: Diagramme de classes exemple pour les objets du domaine
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.
Les méthodes pour l'écriture des données sont de la forme :
Pour les accès en lecture, les services sont écrits selon le principe suivant :
Il est certain que certaines actions ne peuvent être appliquées par une simple requête (aussi compliquée qu'elle puisse être !!), à ce moment là, les services peuvent aussi avoir des méthodes exécutant des tâches partiulières.
les classes d'implémantation des services utilisent donc des objets typés par les interfaces des DAOs. Spring gère le lien entre ces objets :
* Dans le fichier SpringAppContext.xml :
<bean id="contactServiceTarget" class="cea.edyp.epims.service.impl.HibernateContactService"> <property name="actorDao"><ref bean="ActorDAO"></ref></property> <property name="contactDao"><ref bean="ContactDAO"></ref></property> <property name="actorRoleDao"><ref bean="ActorRoleDAO"></ref></property> <property name="companyDao"><ref bean="CompanyDAO"></ref></property> </bean> <!-- Transactional proxy Services --> <bean id="baseTransactionProwy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager"><ref local="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="create*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> ... <bean id="contactService" parent="baseTransactionProxy"> <property name="target"><ref local="contactServiceTarget"/></property> </bean>
<bean id="ActorDAO" class="cea.edyp.epims.domain.dao.impl.HibernateActorDAO" > <property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property> </bean>
(Continuez vers la suite de la documentation ⇒ epcorespring)