Vous êtes sur la page 1sur 16

TD JAVA

Mots cls : Bases de donnes, JDBC, architectures 3 couches

1.Le problme
On se propose dcrire une application console permettant dtablir le bulletin de salaire des assistantes maternelles employes par la "Maison de la petite enfance" d'une commune.

1.1 La base de donnes


Les donnes statiques utiles pour construire la fiche de paie sont places dans une base de donnes Firebird nomme dbpam (pam=Paie Assistante Maternelle). Cette base a un administrateur appel sysdba ayant le mot de passe masterkey. Elle a trois tables, EMPLOYES, COTISATIONS et INDEMNITES, dont la structure est la suivante : Table EMPLOYES : rassemble des informations sur les diffrentes assistantes maternelles Structure :
SS numro de scurit sociale de l'employ - cl primaire NOM nom de l'employ PRENOM son prnom ADRESSE son adresse VILLE sa ville CODEPOSTAL son code postal INDICE son indice de traitement - cl trangre sur le champ

[INDICE] de la table [INDEMNITES] Son contenu pourrait tre le suivant :

Table COTISATIONS : rassemble des pourcentages ncessaires au calcul des cotisations sociales Structure :
CSGRDS

pourcentage : contribution sociale gnralise + contribution au remboursement de la dette sociale CSGD pourcentage : contribution sociale gnralise dductible SECU pourcentage : contribution sociale gnralise dductible RETRAITE pourcentage : retraite complmentaire + assurance chmage Son contenu pourrait tre le suivant :

Les taux des cotisations sociales sont indpendants du salari. La table prcdente n'a qu'une ligne. Table INDEMNITES : rassemble les lments permettant le calcul du salaire payer.

C:\temp\dvp\java\pam.odt, le 14/12/2006

1/16

INDICE indice de traitement - cl primaire BASEHEURE prix net en euro dune heure de garde ENTRETIENJOUR indemnit dentretien en euro par jour de garde REPASJOUR indemnit de repas en euro par jour de garde INDEMNITESCP indemnit de congs pays. C'est un pourcentage

appliquer au salaire

de base. Son contenu pourrait tre le suivant :

On notera que les indemnits peuvent varier d'une assistante maternelle une autre. Elles sont en effet associes une assistante maternelle prcise via l'indice de traitement de celle-ci. Ainsi Mme Marie Jouveinal qui a un indice de traitement de 2 (table EMPLOYES) a un salaire horaire de 2,1 euro (table INDEMNITES).

1.2 Mode de calcul du salaire d'une assistante maternelle


Nous prsentons maintenant le mode de calcul du salaire mensuel d'une assistante maternelle. Il ne prtend pas tre celui utilis dans la ralit. Nous prenons pour exemple, le salaire de Mme Marie Jouveinal qui a travaill 150 h sur 20 jours pendant le mois payer. Les lments suivants sont pris en compte :
[TOTALHEURES]: total des heures travailles dans le mois [TOTALJOURS]: total des jours travaills dans le mois [TOTALHEURES]=150 [TOTALJOURS]= 20

Le salaire de base de l'assistante maternelle est donn par la formule suivante : Un certain nombre de cotisations sociales doivent tre prleves sur ce salaire de base :

[SALAIREBASE]=([TOTALHEURES]*[BASE [SALAIREBASE]=(150*[2.1])*(1+0.15) HEURE])*(1+[INDEMNITESCP]/100) = 362,25

Contribution sociale gnralise et contribution au remboursement de la dette sociale : [SALAIREBASE]*[CSGRDS/100] Contribution sociale gnralise dductible : [SALAIREBASE]*[CSGD/100] Scurit sociale, veuvage, vieillesse : [SALAIREBASE]*[SECU/100] Retraite Complmentaire + AGPF + Assurance Chmage : [SALAIREBASE]*[RETRAITE/100]

CSGRDS : 12,64 CSGD : 22,28 Scurit sociale : 34,02 Retraite : 28,55

Total des cotisations sociales : Par ailleurs, l'assistante maternelle a droit, chaque jour travaill, une indemnit d'entretien ainsi qu' une indemnit de repas. A ce titre elle reoit les indemnits suivantes : Au final, le salaire net payer l'assistante maternelle est le suivant :

[COTISATIONSSOCIALES]=[SALAIREBASE [COTISATIONSSOCIALES]=97,48 ]*(CSGRDS+CSGD+SECU+RETRAITE)/100 [INDEMNITS]=[TOTALJOURS]*(ENTRETI [INDEMNITES]=104 ENJOUR+REPASJOUR)

[SALAIREBASE][salaire NET]=368,77 [COTISATIONSSOCIALES]+[INDEMNITS]

1.3 Fonctionnement de l'application crire


Voici un exemple de ce qui est attendu. L'ensemble des excutables et des fichiers de configuration ncessaires l'application sont rassembls dans un unique rpertoire :
C:\temp\dvp\java\pam.odt, le 14/12/2006

2/16

Le fichier [runPam.bat] contient la commande lanant l'excution du programme Java de l'application :


1. 2. @echo off %JAVA_HOME%\bin\java.exe -classpath pam-console.jar;pam-metier.jar;pam-dao.jar;commonscollections.jar;commons-logging.jar;firebirdsql-full.jar;log4j-1.2.9.jar;spring-beans.jar;springcore.jar;spring-dao.jar;spring-jdbc.jar; istia.st.pam.ui.console.MainPamJdbc %1 %2 %3

Nous ne nous attarderons pas sur ce fichier de commandes. On notera simplement les points suivants :

les fichiers .jar ncessaires l'application sont indiqus derrire le paramtre [classpath] le programme excut est la classe [istia.st.pam.ui.console.MainPamJdbc] on lui passe trois paramtres nots ci-dessus %1 %2 %3

Voici un exemple d'excution :


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. dos>runPam.bat 254104940426058 150 20 Valeurs saisies : N de scurit sociale de l'employ : 254104940426058 Nombre d'heures travailles : 150 Nombre de jours travaills : 20 Informations Employ : Nom : Jouveinal Prnom : Marie Adresse : 5 rue des Oiseaux Ville : St Corentin Code Postal : 49203 Indice : 2 Informations Cotisations : CSGRDS : 3.49 % CSGD : 6.15 % Retraite : 7.88 % Scurit sociale : 9.39 % Informations Indemnits : Salaire horaire : 2.1 euro Entretien/jour : 2.1 euro Repas/jour : 3.1 euro Congs Pays : 15.0 % Informations Salaire : Salaire de base : 362.25 euro Cotisations sociales : 97.48 euro Indemnits d'entretien : 42.0 euro Indemnits de repas : 62.0 euro Salaire net : 368.77 euro

On crira un programme qui recevra les informations suivantes : 1. 2. 3. n de scurit sociale de l'assistante maternelle ( 254104940426058 dans l'exemple - ligne 1) nombre total d'heures travailles (150 dans l'exemple - ligne 1) nombre total de jours travaills (20 dans l'exemple - ligne 1)

On voit que :

lignes 9-14 : affichent les informations concernant l'employ dont on a donn le n de scurit sociale lignes 17-20 : affichent les taux des diffrentes cotisations lignes 23-26 : affichent les indemnits associes l'indice de traitement de l'employ (ici l'indice 2) 3/16

C:\temp\dvp\java\pam.odt, le 14/12/2006

lignes 29-33 : affichent les lments constitutifs du salaire payer

L'application signale les erreurs ventuelles. Appel sans paramtres :


dos>runPam.bat Syntaxe : pg num_securite_sociale nb_heures_travailles nb_jours_travaills

Appel avec des donnes errones :


dos>runPam.bat 254104940426058 150x 20x Le nombre d'heures travailles [150x] est erron Le nombre de jours travaills [20x] est erron

Appel avec un n de scurit sociale erron :


dos>runPam.bat xx 150 20 L'erreur suivante s'est produite : L'employ de n[xx] est introuvable

1.4 Architecture de l'application Java


La solution prcdente inclut trois phases classiques : 1. 2. 3. l'acquisition des donnes (en fait passes directement en paramtres au programme) le calcul de la solution l'affichage des rsultats

L'application sera dcoupe en trois couches ayant chacune un rle bien dfini :

utilisateur

Couche interface utilisateur [ui]

Couche mtier [metier] SPRING

Couche d'accs aux donnes [dao]

Donnes

la couche [metier] est celle qui contient les rgles mtier de l'application. Pour notre application, ce sont les rgles de calcul du salaire exposes au paragraphe 1.2, page 2. Cette couche a besoin de donnes pour travailler. Dans le schma ci-dessus, les donnes peuvent provenir de deux endroits :

la couche d'accs aux donnes ou [dao] (DAO = Data Access Object) pour les donnes dj enregistres dans des fichiers ou bases de donnes. la couche d'interface avec l'utilisateur ou [ui] (UI = User Interface) pour les donnes saisies par l'utilisateur ou affiches l'utilisateur. C'est le cas ici pour des informations telles que : le n de scurit sociale de la personne payer son nombre d'heures travailles son nombre de jours travaills la feuille de salaire

de faon gnrale, la couche [dao] s'occupe de l'accs aux donnes persistantes (fichiers, bases de donnes) ou non persistantes (rseau, ...). la couche [ui] elle, s'occupe des interactions avec l'utilisateur s'il y en a. les trois couches sont rendues indpendantes grce l'utilisation d'interfaces Java. Elles sont intgres dans le schma global de l'application l'aide du framework Spring.

1.5 Les interfaces des couches [metier] et [dao]


Revenons l'architecture 3tier de notre application :

C:\temp\dvp\java\pam.odt, le 14/12/2006

4/16

utilisateur

Couche interface utilisateur [ui]

Couche mtier [metier] SPRING

Couche d'accs aux donnes [dao]

Donnes

Quelle interface doit offrir la couche [dao] la couche [metier] et quelle interface doit offrir la couche [metier] la couche [ui] ? Une premire approche pour dfinir les interfaces des diffrentes couches est d'examiner les diffrents cas d'usage (use cases) de l'application. Ici nous n'en avons qu'un. Nous avons en effet dit que notre application serait utilise de la faon suivante (cf paragraphe 1.3, page 3) :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. dos>runPam.bat 254104940426058 150 20 Valeurs saisies : N de scurit sociale de l'employ : 254104940426058 Nombre d'heures travailles : 150 Nombre de jours travaills : 20 Informations Employ : Nom : Jouveinal ... Informations Cotisations : CSGRDS : 3.49 % ... Informations Indemnits : ... Informations Salaire : Salaire de base : 362.25 euro Cotisations sociales : 97.48 euro Indemnits d'entretien : 42.0 euro Indemnits de repas : 62.0 euro Salaire net : 368.77 euro

L'application reoit trois informations de l'utilisateur (cf ligne 1 ci-dessus) le n de scurit sociale de l'assistante maternelle le nombre d'heures travailles dans le mois le nombre de jours travaills dans le mois A partir de ces information et d'autres enregistres dans des fichiers de configuration, l'application affiche les informations suivantes :

lignes 4-6 : les valeurs saisies lignes 8-10 : les informations lies l'employ dont on a donn le n de scurit sociale lignes 12-14 : les taux des diffrentes cotisations sociales lignes 16-17 : les diffrentes indemnits bnficiant l'assistante maternelle lignes 19-24 : les lments de la feuille de salaire de l'assistante maternelle

Un certain nombre d'informations doivent tre fournies par la couche [metier] la couche [ui] : 1. 2. 3. 4. les informations lies une assistante maternelle identifie par son n de scurit sociale. On trouve ces informations dans la table [EMPLOYES]. Cela permet d'afficher les lignes 8-10. les montants des divers taux de cotisations sociales prlever sur le salaire brut. On trouve ces informations dans la table [COTISATIONS]. Cela permet d'afficher les lignes 12-14. les montants des diverses indemnits lies la fonction d'assistante maternelle. On trouve ces informations dans la table [INDEMNITES]. Cela permet d'afficher les lignes 16-17. les lments constitutifs du salaire affichs lignes 19-24

De ceci, on pourrait dcider d'une premire criture de l'interface [IPamMetier] prsente par la couche [metier] la couche [ui] :
1. 2. 3. 4. 5. 6. package istia.st.pam.metier; public interface IPamMetier { // obtenir la feuille de salaire FeuilleSalaire calculerFeuilleSalaire(String numEmploye, double nbHeuresTravailles, int nbJoursTravaills ); }

C:\temp\dvp\java\pam.odt, le 14/12/2006

5/16

ligne 1 : les lments de la couche [metier] sont mis dans le paquetage [istia.st.pam.metier] ligne 5 : la mthode [ calculerFeuilleSalaire ] prend pour paramtres les trois informations acquises par la couche [ui] et rend un objet de type [FeuilleSalaire] contenant les informations que la couche [ui] affichera sur la console. La classe [FeuilleSalaire] pourrait tre la suivante :
package istia.st.pam.metier; import istia.st.pam.dao.Cotisations; import istia.st.pam.dao.Employe; import istia.st.pam.dao.Indemnites; public class FeuilleSalaire { // champs privs private Employe employe; private Cotisations cotisations; private Indemnites indemnites; private ElementsSalaire elementsSalaire; ... }

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

ligne 9 : l'employ concern par la feuille de salaire - information n 1 affiche par la couche [ui] ligne 10 : les diffrents taux de cotisation - information n 2 affiche par la couche [ui] ligne 11 : les diffrentes indemnits lies l'indice de l'employ - information n 3 affiche par la couche [ui] ligne 12 : les lments constitutifs de son salaire - information n 4 affiche par la couche [ui]

La couche [metier] ne peut initialiser les champs [employe, cotisations, indemnites] de l'objet [FeuilleSalaire] ci-dessus qu'en questionnant la couche [dao] car ces informations sont dans les tables de la base de donnes. Aussi une premire dfinition de l'interface [IPamDao] de la couche [dao] pourrait tre la suivante :
1. package istia.st.pam.dao; 2. 3. public interface IPamDao { 4. // obtenir un salari via son n de scurit sociale 5. Employe getEmployeByNum(String num); 6. 7. // obtenir la liste des cotisations 8. Cotisations getCotisations(); 9. 10. // obtenir les indemnits d'un salari via son n de scurit sociale 11. Indemnites getIndemnitesByIndice(int indice); 12. }

ligne 1 : toutes les classes et interfaces de la couche [dao] sont places dans le paquetage [istia.st.pam.dao]. ligne 5 : la mthode [getEmployeByNum] permet d'obtenir un enregistrement de la table [EMPLOYES] partir de son n de scurit sociale. ligne 7 : la mthode [getCotisations] permet d'obtenir l'unique enregistrement de la table [COTISATIONS] ligne 11 : la mthode [getIndemnitesByIndice] permet d'obtenir un enregistrement de la table [INDEMNITES] partir d'un indice de traitement.

Au final, on voit que les couches [metier] et [dao] ont besoin des classes suivantes : la classe [Employe] qui encapsule dans un objet les donnes d'une ligne de la table [EMPLOYES] la classe [Cotisations] qui encapsule dans un objet les donnes d'une ligne de la table [COTISATIONS] la classe [Indemnites] qui encapsule dans un objet les donnes d'une ligne de la table [INDEMNITES] la classe [FeuilleSalaire] qui encapsule dans un objet les lments constitutifs de la feuille de salaire affiche l'cran.

1.6 La classe [PamException]


La couche [dao] va travailler avec l'API JDBC de Java. Cette API lance des exceptions contrles de type [SQLException] qui prsentent deux inconvnients : elles alourdissent le code qui doit obligatoirement grer ces exceptions avec des try / catch. elles doivent tre dclares dans la signature des mthodes de l'interface [IPamDao] par un "throws SQLException". Ceci a pour consquence d'empcher l'implmentation de cette interface par des classes qui lanceraient une exception contrle d'un type diffrent de [SQLException]. Pour remdier ce problme, la couche [dao] ne "remontera" que des exceptions non contrles de type [PamException]. Ceci a deux consquences : la couche [metier] n'aura pas grer les exceptions de la couche [dao] avec des try / catch. Elle pourra simplement les laisser remonter jusqu' la couche [ui].
C:\temp\dvp\java\pam.odt, le 14/12/2006

6/16

les mthodes de l'interface [IPamDao] n'ont pas mettre dans leur signature la nature de l'exception [PamException], ce qui laisse la possiblit d'implmenter cette interface avec des classes qui lanceraient un autre type d'exception non contrle.

Le code de la classe [PamException] est le suivant :


1. package istia.st.pam.dao; 2. 3. public class PamException extends RuntimeException { 4. 5. public PamException() { 6. super(); 7. } 8. 9. public PamException(String message) { 10. super(message); 11. } 12. 13. public PamException(String message, Throwable cause) { 14. super(message, cause); 15. } 16. 17. public PamException(Throwable cause) { 18. super(cause); 19. } 20. 21. }

ligne 3 : noter que la classe [PamException] drive de la classe [RuntimeException] ce qui en fait une exception non contrle.

Le fonctionnement de l'application, du point de vue des exceptions, sera donc le suivant : les couches [dao] et [metier] encapsulent toute exception contrle qu'elles peuvent tre amenes grer, dans une exception de type [PamException] et lancent cette dernire pour la couche suprieure. au final, c'est la couche [ui] qui intercepte toutes les exceptions non contrles qui remontent des couches [metier] et [dao]. Elle se contentera d'afficher l'exception sur la console et arrtera l'application. Examinons maintenant successivement l'implmentation des couches [dao] et [metier].

2 La couche [dao] de l'application [PAM]


2.1 Les classes de "mapping" relationnel / objets
A chacune des tables de la base de donnes [dbpam], nous allons faire correspondre une classe charge de mmoriser une ligne de la table. Ces classes sont appeles [Cotisations, Employe, Indemnites]. Nous les dcrivons maintenant :

2.1.1 Classe [Cotisations]


Son code est le suivant :
1. package istia.st.pam.dao; 2. 3. public class Cotisations { 4. // champs privs 5. private double csgrds; 6. private double csgd; 7. private double secu; 8. private double retraite; 9. 10. // constructeurs 11. public Cotisations() { 12. 13. } 14. 15. public Cotisations(double csgrds, double csgd, double secu, double retraite) { 16. setCsgrds(csgrds); 17. setCsgd(csgd); 18. setSecu(secu); 19. setRetraite(retraite); 20. } 21. 22. 23. // toString 24. public String toString(){ 25. return "["+csgrds+","+csgd+","+secu+","+retraite+"]"; 26. }
C:\temp\dvp\java\pam.odt, le 14/12/2006

7/16

27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... 38. }

// accesseurs public double getCsgrds() { return csgrds; } public void setCsgrds(double csgrds) { this.csgrds = csgrds; }

la classe [Cotisations] reprsente une ligne de la table [COTISATIONS] lignes 5-8 : les quatre champs correspondant aux quatre colonnes de la table [ COTISATIONS ] lignes 10-20 : les deux constructeurs de la classe lignes 24-26 : la mthode [toString] de la classe lignes 29 et au-del : les accesseurs (get / set) associs aux champs privs des lignes 5-8

2.1.2 Classe [Employe]


Son code est le suivant :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. package istia.st.pam.dao; public class Employe { // champs privs private String num; private String nom; private String prenom; private String adresse; private String ville; private String codePostal; private int indice; // constructeurs public Employe() { } public Employe(String num, String nom, String prenom, String adresse, String ville, String codePostal, int indice) { setNum(num); setNom(nom); setPrenom(prenom); setAdresse(adresse); setCodePostal(codePostal); setVille(ville); setIndice(indice); } // toString public String toString() { return "[" + num + "," + nom + "," + prenom + "," + adresse + "," + ville + "," + codePostal + "," + indice + "]"; } // accesseurs public String getAdresse() { return adresse; } public void setAdresse(String adresse) { this.adresse = adresse; }

... }

la classe [Employe] reprsente une ligne de la table [EMPLOYES] lignes 5-11 : les sept champs correspondant aux sept colonnes de la table [ EMPLOYES ] lignes 14-27 : les deux constructeurs de la classe lignes 30-33 : la mthode [toString] de la classe lignes 36 et au-del : les accesseurs (get / set) associs aux champs privs des lignes 5-11

2.1.3 Classe [Indemnites]


Son code est le suivant :
1. 2. package istia.st.pam.dao;

C:\temp\dvp\java\pam.odt, le 14/12/2006

8/16

3. public class Indemnites { 4. // champs privs 5. private int indice; 6. private double baseHeure; 7. private double entretienJour; 8. private double repasJour; 9. private double indemnitesCongesPayes; 10. 11. // constructeurs 12. public Indemnites() { 13. 14. } 15. 16. public Indemnites(int num, double baseHeure, double entretienJour, 17. double repasJour, double indemnitesCongesPayes) { 18. setIndice(num); 19. setBaseHeure(baseHeure); 20. setEntretienJour(entretienJour); 21. setRepasJour(repasJour); 22. setIndemnitesCongesPayes(indemnitesCongesPayes); 23. } 24. 25. // toString 26. public String toString() { 27. return "[" + indice + "," + baseHeure + "," + entretienJour + "," 28. + repasJour + "," + indemnitesCongesPayes + "]"; 29. } 30. 31. // accesseurs 32. public double getBaseHeure() { 33. return baseHeure; 34. } 35. 36. public void setBaseHeure(double baseHeure) { 37. this.baseHeure = baseHeure; 38. } 39. ... 40. }

la classe [Indemnites] reprsente une ligne de la table [INDEMNITES] lignes 5-9 : les cinq champs correspondant aux cinq colonnes de la table [ INDEMNITES ] lignes 12-23 : les deux constructeurs de la classe lignes 26-29 : la mthode [toString] de la classe lignes 31 et au-del : les accesseurs (get / set) associs aux champs privs des lignes 5-11

2.2 La classe d'implmentation [PamDaoImplJdbc]


Une classe d'implmentation de l'interface [IPamDao] pourrait tre la suivante :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. package istia.st.pam.dao; public class PamDaoImplJdbc implements IPamDao { // champs privs private String driverClassName; private String jdbcUrl; private String userName; private String passwd; // accesseurs public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } ... // constructeurs public PamDaoImplJdbc() { } // constructeur avec paramtres public PamDaoImplJdbc(String driverClassName, String jdbcUrl, String userName, String passwd) { // on mmorise les paramtres // on charge le pilote du driver JDBC en mmoire

...

C:\temp\dvp\java\pam.odt, le 14/12/2006

9/16

34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.

...

} // obtention d'un employe public Employe getEmployeByNum(String num) { } // obtention des cotisations public Cotisations getCotisations() { } // obtentions des indemnits lies un indice public Indemnites getIndemnitesByIndice(int indice) { }

...

...

... }

ligne 4 : la classe [PamDaoImplJdbc] implmente l'interface [IPamDao] ligne 7 : le nom de la classe du pilote JDBC du SGBD utilis ligne 8 : l'url de la base exploiter ligne 9 : le nom de l'utilisateur qui va se connecter au SGBD ligne 10 : son mot de passe lignes 12-21 : les accesseurs des champs des lignes 7-10 lignes 23-35 : les constructeurs de la classe lignes 38-48 : les mthodes implmentant l'interface [IPamDao].

Question 1 : crire le code du constructeur des lignes 29-35. On se laissera guider par les commentaires. Question 2 : crire le code de la mthode [getEmployeByNum] : num est un n de scurit sociale de la table [EMPLOYES] la mthode doit rendre l'objet de type [Employe] correspondant ce n de scurit sociale ou le pointeur [null] si aucune ligne de la table [ EMPLOYES ] ne correspond ce n. L'accs la table [EMPLOYES] se fera l'aide de l'API JDBC.

2.3 Tests de la couche [dao]


Nous supposerons dsormais que la classe [PamDaoImplJdbc] a t entirement crite. Un programme de test de la couche [dao] pourrait tre le suivant :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. package istia.st.pam.dao.tests; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import istia.st.pam.dao.IPamDao; public class MainTestPamDaoJdbc { public static void main(String[] args) { IPamDao pamDao = (IPamDao) (new XmlBeanFactory(new ClassPathResource( "spring-config-PamDaoJdbc.xml"))).getBean("pamDao"); System.out.println("Employ=" + pamDao.getEmployeByNum("260124402111742")); System.out.println("Cotisations=" + pamDao.getCotisations()); System.out.println("Indemnits=" + pamDao.getIndemnitesByIndice(1)); }

lignes 11-12 : un objet implmentant l'interface [IPamDao] est demand Spring. ligne 13 : affiche l'identit d'un employ identifi pas son n de scurit sociale ligne 15 : affiche la liste des taux de cotisations sociales ligne 16 : affiche la liste des indemnits lies un certain indice de traitement

Les rsultats obtenus sur la console sont les suivants :


1. 2. 3. Employ=[260124402111742,Laverti,Justine,la Brlerie,St Marcel,49014,1] Cotisations=[3.49,6.15,9.39,7.88] Indemnits=[1,1.93,2.0,3.0,12.0]

Le lecteur est invit vrifier l'exactitude de ces rsultats en consultant le contenu des diffrentes tables de la base de donnes [dbpam] montr en dbut de document.
C:\temp\dvp\java\pam.odt, le 14/12/2006

10/16

Question 3 : crire le fichier de configuration Spring nomm [ spring-config-PamDaoJdbc.xml ] utilis lignes 11-12 ci-dessus. Il doit permettre l'instanciation d'un objet de type [PamDaoImplJdbc].

3 La couche [metier] de l'application [PAM]


Maintenant que la couche [dao] a t crite, nous passons l'tude de la couche mtier :

utilisateur

Couche interface utilisateur [ui]

Couche mtier [metier] SPRING

Couche d'accs aux donnes [dao]

Donnes

3.1 L'interface Java [IPamMetier]


Celle-ci a t dcrite au paragraphe 1.5, page 5. Nous la rappelons ci-dessous :
1. 2. 3. 4. 5. 6. package istia.st.pam.metier; public interface IPamMetier { // obtenir la feuille de salaire FeuilleSalaire calculerFeuilleSalaire(String numEmploye, double nbHeuresTravailles, int nbJoursTravaills ); }

3.2 La classe [FeuilleSalaire]


La mthode [calculerFeuilleSalaire] rend un objet de type [FeuilleSalaire] qui reprsente les diffrents lments d'une feuille de salaire. Sa dfinition est la suivante :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. package istia.st.pam.metier; import istia.st.pam.dao.Cotisations; import istia.st.pam.dao.Employe; import istia.st.pam.dao.Indemnites; public class FeuilleSalaire { // champs privs Employe employe; Cotisations cotisations; Indemnites indemnites; ElementsSalaire elementsSalaire; // constructeurs public FeuilleSalaire() { } public FeuilleSalaire(Employe employe, Cotisations cotisations, Indemnites indemnites, ElementsSalaire elementsSalaire) { setEmploye(employe); setCotisations(cotisations); setElementsSalaire(elementsSalaire); setIndemnites(indemnites); } // toString public String toString() { return "[" + employe + "," + cotisations + "," + indemnites + "," + elementsSalaire + "]"; } // accesseurs public Cotisations getCotisations() { return cotisations; } public void setCotisations(Cotisations cotisations) { this.cotisations = cotisations;

C:\temp\dvp\java\pam.odt, le 14/12/2006

11/16

40. 41. 42. ... 43. }

ligne 9 : l'employ concern par la feuille de salaire ligne 10 : les diffrents taux de cotisation ligne 11 : les diffrentes indemnits lies l'indice de l'employ ligne 12 : les lments constitutifs de son salaire lignes 14-25 : les deux constructeurs de la classe lignes 28-31 : mthode [toString] identifiant un objet [FeuilleSalaire] particulier lignes 34 et au-del : les accesseurs publics aux champs privs de la classe

La classe [ElementsSalaire] rfrence ligne 12 de la classe [FeuilleSalaire] ci-dessus, rassemble les lments constituant une fiche de paie. Sa dfinition est la suivante :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. package istia.st.pam.metier; public class ElementsSalaire { // champs privs private double salaireBase; private double cotisationsSociales; private double indemnitesEntretien; private double indemnitesRepas; private double salaireNet; // constructeurs public ElementsSalaire() { } public ElementsSalaire(double salaireBase, double cotisationsSociales, double indemnitesEntretien, double indemnitesRepas, double salaireNet) { setSalaireBase(salaireBase); setCotisationsSociales(cotisationsSociales); setIndemnitesEntretien(indemnitesEntretien); setIndemnitesRepas(indemnitesRepas); } // toString public String toString() { return "[" + salaireBase + "," + cotisationsSociales + "," + indemnitesEntretien + "," + indemnitesRepas + "," + salaireNet + "]"; } // accesseurs publics public double getCotisationsSociales() { return cotisationsSociales; } public void setCotisationsSociales(double cotisationsSociales) { this.cotisationsSociales = cotisationsSociales; }

... }

ligne 6 : le salaire de base ligne 7 : les cotisations sociales payes sur ce salaire de base ligne 8 : les indemnits journalires d'entretien de l'enfant ligne 9 : les indemnits journalires de repas de l'enfant ligne 10 : le salaire net payer l'assistante maternelle lignes 12-24 : les constructeurs de la classe lignes 27-31 : mthode [toString] identifiant un objet [ElementsSalaire] particulier lignes 34 et au-del : les accesseurs publics aux champs privs de la classe

3.3 La classe d'implmentation [PamMetierImpl] de la couche [metier]


La classe d'implmentation [PamMetierImpl] de la couche [metier] pourrait tre la suivante :
1. 2. 3. 4. 5. package istia.st.pam.metier; import istia.st.pam.dao.Cotisations; import istia.st.pam.dao.Employe; import istia.st.pam.dao.IPamDao;

C:\temp\dvp\java\pam.odt, le 14/12/2006

12/16

6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.

import istia.st.pam.dao.Indemnites; import istia.st.pam.dao.PamException; public class PamMetierImpl implements IPamMetier { // rfrence sur la couche [dao] private IPamDao pamDao = null; public IPamDao getPamDao() { return pamDao; } public void setPamDao(IPamDao pamDao) { this.pamDao = pamDao; } // obtenir la feuille de salaire public FeuilleSalaire calculerFeuilleSalaire(String numEmploye, double nbHeuresTravailles, int nbJoursTravaills) {

....} }

ligne 12 : une rfrence sur un objet implmentant la couche [dao] lignes 14-20 : les accesseurs publics au champ [pamDao] lignes 23-25 : la mthode [calculerFeuilleSalaire]

Question 4 : crire le code de la mthode [ calculerFeuilleSalaire ]. On notera les points suivants : lorsque cette mthode s'excute, le champ [pamDao] a dj t initialis. Il pointe donc sur un objet donnant accs au contenu de la base de donnes [dbpam]. le mode de calcul du salaire a t expliqu au paragraphe 1.2, page 2. si le paramtre [numEmploye] ne correspond aucun employ (la couche [dao] a renvoy un pointeur null), la mthode lancera une exception de type [PamException] avec un message d'erreur appropri

3.4 Tests de la couche [metier]


Un programme de tests de la couche mtier pourrait tre le suivant :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. package istia.st.pam.metier.tests; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import istia.st.pam.dao.PamException; import istia.st.pam.metier.IPamMetier; public class MainTestMetierDaoJdbc { public static void main(String[] args) { // instanciation couche [metier] IPamMetier pamMetier = (IPamMetier) (new XmlBeanFactory( new ClassPathResource( "spring-config-PamMetierDaoJdbc.xml"))) .getBean("pamMetier"); // calcul de feuilles de salaire System.out.println(pamMetier.calculerFeuilleSalaire("260124402111742", 30, 5)); System.out.println(pamMetier.calculerFeuilleSalaire("254104940426058", 150, 20)); try { System.out.println(pamMetier.calculerFeuilleSalaire( "xx", 150, 20)); } catch (PamException ex) { System.err.println(ex.toString()); } }

Les rsultats obtenus sont les suivants :


1. 2. 3. [[260124402111742,Laverti,Justine,la Brlerie,St Marcel,49014,1],[3.49,6.15,9.39,7.88],[1,1.93,2.0,3.0,12.0],[64.85,17.45,10.0,15.0,72.4]] [[254104940426058,Jouveinal,Marie,5 rue des Oiseaux,St Corentin,49203,2],[3.49,6.15,9.39,7.88],[2,2.1,2.1,3.1,15.0],[362.25,97.48,42.0,62.0,368.77]] istia.st.pam.dao.PamException: L'employ de n[xx] est introuvable

Question 5 : crire le fichier de configuration Spring [ spring-config-PamMetierDaoJdbc.xml ] utilis lignes 13-16 ci-dessus et qui instancie un objet de type [ PamMetierImpl ].
C:\temp\dvp\java\pam.odt, le 14/12/2006

13/16

4 La couche [ui] de l'application [PAM]


Maintenant que la couche [metier] a t crite, il ne nous reste plus qu' crire la couche [ui] :

utilisateur

Couche interface utilisateur [ui]

Couche mtier [metier] SPRING

Couche d'accs aux donnes [dao]

Donnes

La couche [ui] prsente l'utilisateur est ici un programme console dont le fonctionnement a t dcrit au paragraphe 1.3, page 3. Son squelette pourrait tre le suivant :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. package istia.st.pam.ui.console; import istia.st.pam.dao.PamException; import istia.st.pam.metier.FeuilleSalaire; import istia.st.pam.metier.IPamMetier; import java.util.ArrayList; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class MainPamWithJdbc { public static void main(String[] args) { // donnes locales final String syntaxe = "pg num_securite_sociale nb_heures_travailles nb_jours_travaills"; // on vrifie le nombre de paramtres du tableau args // complter ... // le second paramtre args[1] doit tre un nombre rel >0 // complter ... // le troisime paramtre args[2] doit tre un nombre entier >0 // complter ...

17. 18. 19. 20. 21. 22. 23. 24. // instanciation couche [metier] 25. IPamMetier pamMetier = (IPamMetier) (new XmlBeanFactory( 26. new ClassPathResource( 27. "spring-config-PamMetierDaoJdbc.xml"))) 28. .getBean("pamMetier"); 29. // calcul de la feuille de salaire 30. // complter ... 31. // affichage dtaill 32. String output = "Valeurs saisies :\n"; 33. output += ajouteInfo("N de scurit sociale de l'employ", args[0]); 34. output += ajouteInfo("Nombre d'heures travailles", args[1]); 35. output += ajouteInfo("Nombre de jours travaills", args[2]); 36. output += ajouteInfo("\nInformations Employ", ""); 37. output += ajouteInfo("Nom", feuilleSalaire.getEmploye().getNom()); 38. output += ajouteInfo("Prnom", feuilleSalaire.getEmploye().getPrenom()); 39. output += ajouteInfo("Adresse", feuilleSalaire.getEmploye() 40. .getAdresse()); 41. output += ajouteInfo("Ville", feuilleSalaire.getEmploye().getVille()); 42. output += ajouteInfo("Code Postal", feuilleSalaire.getEmploye() 43. .getCodePostal()); 44. output += ajouteInfo("Indice", "" 45. + feuilleSalaire.getEmploye().getIndice()); 46. output += ajouteInfo("\nInformations Cotisations", ""); 47. output += ajouteInfo("CSGRDS", "" 48. + feuilleSalaire.getCotisations().getCsgrds() + " %"); 49. output += ajouteInfo("CSGD", "" 50. + feuilleSalaire.getCotisations().getCsgd() + " %"); 51. output += ajouteInfo("Retraite", "" 52. + feuilleSalaire.getCotisations().getRetraite() + " %"); 53. output += ajouteInfo("Scurit sociale", "" 54. + feuilleSalaire.getCotisations().getSecu() + " %"); 55. output += ajouteInfo("\nInformations Indemnits", ""); 56. output += ajouteInfo("Salaire horaire", "" 57. + feuilleSalaire.getIndemnites().getBaseHeure() + " euro"); 58. output += ajouteInfo("Entretien/jour", "" 59. + feuilleSalaire.getIndemnites().getEntretienJour() + " euro"); 60. output += ajouteInfo("Repas/jour", "" 61. + feuilleSalaire.getIndemnites().getRepasJour() + " euro");
C:\temp\dvp\java\pam.odt, le 14/12/2006

14/16

62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. }

output += ajouteInfo("Congs Pays", "" + feuilleSalaire.getIndemnites().getIndemnitesCongesPayes() + " %"); output += ajouteInfo("\nInformations Salaire", ""); output += ajouteInfo("Salaire de base", "" + feuilleSalaire.getElementsSalaire().getSalaireBase() + " euro"); output += ajouteInfo("Cotisations sociales", "" + feuilleSalaire.getElementsSalaire().getCotisationsSociales() + " euro"); output += ajouteInfo("Indemnits d'entretien", "" + feuilleSalaire.getElementsSalaire().getIndemnitesEntretien() + " euro"); output += ajouteInfo("Indemnits de repas", "" + feuilleSalaire.getElementsSalaire().getIndemnitesRepas() + " euro"); output += ajouteInfo("Salaire net", "" + feuilleSalaire.getElementsSalaire().getSalaireNet() + " euro"); } System.out.println(output);

static String ajouteInfo(String message, String valeur) { return message + " : " + valeur + "\n"; }

Question 6 : complter le code ci-dessus (lignes 18, 20, 22, 30)

C:\temp\dvp\java\pam.odt, le 14/12/2006

15/16

Table des matires


1.LE PROBLME........................................................................................................................................................................ 1 1.1LA BASE DE DONNES..................................................................................................................................................................... 1 1.2MODE DE CALCUL DU SALAIRE D'UNE ASSISTANTE MATERNELLE......................................................................................................... 2 1.3FONCTIONNEMENT DE L'APPLICATION CRIRE................................................................................................................................ 2 1.4ARCHITECTURE DE L'APPLICATION JAVA.......................................................................................................................................... 4 1.5LES INTERFACES DES COUCHES [METIER] ET [DAO]............................................................................................................................4 1.6LA CLASSE [PAMEXCEPTION]......................................................................................................................................................... 6 2LA COUCHE [DAO] DE L'APPLICATION [PAM]............................................................................................................... 7 2.1LES CLASSES DE "MAPPING" RELATIONNEL / OBJETS......................................................................................................................... 7 2.1.1CLASSE [COTISATIONS]................................................................................................................................................................. 7 2.1.2CLASSE [EMPLOYE]......................................................................................................................................................................8 2.1.3CLASSE [INDEMNITES]...................................................................................................................................................................8 2.2LA CLASSE D'IMPLMENTATION [PAMDAOIMPLJDBC].......................................................................................................................9 2.3TESTS DE LA COUCHE [DAO]..........................................................................................................................................................10 3LA COUCHE [METIER] DE L'APPLICATION [PAM]......................................................................................................11 3.1L'INTERFACE JAVA [IPAMMETIER].............................................................................................................................................. 11 3.2LA CLASSE [FEUILLESALAIRE]...................................................................................................................................................... 11 3.3LA CLASSE D'IMPLMENTATION [PAMMETIERIMPL] DE LA COUCHE [METIER]...................................................................................12 3.4TESTS DE LA COUCHE [METIER].....................................................................................................................................................13 4LA COUCHE [UI] DE L'APPLICATION [PAM]................................................................................................................. 14

C:\temp\dvp\java\pam.odt, le 14/12/2006

16/16

Vous aimerez peut-être aussi