Gestion des Projets Integres Groupe No : 2 Rapport de conception

tonguescurlyΛογισμικό & κατασκευή λογ/κού

17 Νοε 2012 (πριν από 4 χρόνια και 9 μήνες)

566 εμφανίσεις

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


1


Gestion des Projets Intégrés

Groupe No :

2

Rapport de conception

Medawar Elias

Peissard Yves

Dorthe Christophe


Département :

Technologie de l’Information et de la Communication

Filière :

Informatique

Mot
-
clé :

MYSQL 5.5.8, java EE

Date :

Février 2011


Mai 2011

Superviseurs :

Prof. Houda Chabbi Drissi


Prof. Pierre Kuonen


Prof. Omar Abou Khaled

Client

:

Prof. Houda Chabbi Drissi



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


2

Table des matières

1

Implémentation SGBD

................................
................................
....................

4

1.1

Estimation de la taille des données

................................
................................
............................

4

1.1.1

Table project

................................
................................
................................
................................
......

4

1.1.2

Table subscriptionPeriod

................................
................................
................................
.............

4

1.1.3

Table user

................................
................................
................................
................................
............

5

1.2

Vos choix en tant qu’administrateur de votre SGBD

................................
...........................

5

1.2.1

Installation SGBD
-

création BD

................................
................................
................................

5

1.2.2

Comptes

................................
................................
................................
................................
................

5

1.2.3

Choix pour gérer la sécurité contre l’injection

................................
................................
...

6

1.3

Choix d’index pour chaque relation

................................
................................
............................

6

1.4

Argumentation sur la
dénormalisation

................................
................................
.....................

6

1.5

Etude d’un plan d’exécution

................................
................................
................................
..........

6

1.6

Etude et test

d’un accès concurrentiel

................................
................................
......................

7

1.7

Code SQL dans cet ordre

................................
................................
................................
.................

8

1.7.1

Code de l’implémentation des tables

................................
................................
.......................

8

1.7.2

Code des triggers

................................
................................
................................
............................

10

1.7.3

Code des procédures stockées et des fonctions implémentés

................................
.....

12

1.7.4

Code de création des utilisateurs avec leurs privilèges

................................
...............

12

1.7.5

Remarques

................................
................................
................................
................................
.........

13

1.8

Caractéristiques SGBD

................................
................................
................................
..................

13

2

Implémentation SI

................................
................................
.......................

17

2.1

Environnement spécifique de développement

................................
................................
...

17

2.1.1

Framework

................................
................................
................................
................................
........

17

2.2

Eléments architecturaux

................................
................................
................................
..............

17

2.2.1

Couche présentation

................................
................................
................................
.....................

17

2.2.2

Couche métier

................................
................................
................................
................................
..

19

2.2.3

Couche service

................................
................................
................................
................................
.

28

2.3

Eléments technologiques

................................
................................
................................
.............

30

2.3.1

Outils de gestion de versioning (CVS / SVN)

................................
................................
......

30

2.3.2

Outils de modélisation

................................
................................
................................
.................

31

2.3.3

Outils de documentation du code

................................
................................
...........................

31

2.3.4

Outils de journalisation de prototype

................................
................................
...................

31

2.3.5

Outils de test

................................
................................
................................
................................
.....

32

2.3.6

Outils de gestion de licences

................................
................................
................................
......

33

2.3.7

Outils d’installation et de packaging

................................
................................
....................

33

2.4

Diagrammes d’architecture

................................
................................
................................
........

34

2.4.1

Diagramme de package

................................
................................
................................
..............

34

2.4.2

Diagramme de navigation (état
-
transition)

................................
................................
.....

35

2.5

Choix technologique

................................
................................
................................
.......................

36

2.6

Contraintes d’utilisation technologique

................................
................................
................

36

2.7

Outils administratifs

................................
................................
................................
......................

38

3

Conclusion

................................
................................
................................
...

39

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


3

3.1

Objectifs atteints

................................
................................
................................
..............................

39

3.2

Problèmes rencontrés

................................
................................
................................
...................

39

3.3

Problèmes non résolus

................................
................................
................................
.................

40

3.4

Perspectives futures
................................
................................
................................
.......................

40

3.5

Synthèse

................................
................................
................................
................................
..............

40

4

Références

................................
................................
................................
...

41

4.1

Bibliographie

................................
................................
................................
................................
.....

41

4.1.1

Thème : GlassFish

................................
................................
................................
...........................

41

4.2

Webographie

................................
................................
................................
................................
.....

41

4.2.1

Thème : XML, XSLT, XSL
-
FO, PDF

................................
................................
............................

41

4.2.2

Thème : Développement J2EE

................................
................................
................................
...

41

4.2.3

Thème : Base de données

................................
................................
................................
............

41

5

Annexes

................................
................................
................................
.......

42

5.1

CD
-
ROM (une copie par rapport)

................................
................................
.............................

42


PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


4

1

Implémentation SGBD


1.1

Estimation de la taille des
données

1.1.1

Table proje
c
t

Libellé

Type

Mid [Bytes]

Max [Bytes]

title

varchar(100)

50

1001

nbMaxStudents

int

4

4

description

text

1000

2000

technologie

text

15

30

schoolYear

year

4

4

computedXML

longtext

2000

4000

isReadOnly

tinyint

1

1

isDocumented

tinyint

1

1

client_id

int

4

4

idPeriod

int

4

4

parentProject_id

int

4

4

10 séparateurs



10

10

champs numériques



11

22

Subtotal pour un nuplet



3108

7085

Subtotal pour 50 nuplets (x50)



155400

354250


+ 1/3 pour index



51800

118083.3333


+
taille fixe de la table



6144

6144

Total



213344

478477.3333


1.1.2

Table subscriptionPeriod

Libellé

Type

Mid [Bytes]

Max [Bytes]

idPeriod

int

4

4

title

varchar(100)

50

100

begin

date

3

3

end

date

3

3

3 séparateurs



3

3

champs numériques



2

4

Subtotal pour un nuplet



65

117

Subtotal pour 10 nuplets (x1
0)



650

1170


+ 1/3 pour index



216.6666667

390


+ taille fixe de la table



6144

6144

Total



7010.666667

7704




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


5

1.1.3

Table user

Libellé

Type

Mid [Bytes]

Max [Bytes]

idUser

int

4

4

login

varchar(50)

25

50

lastname

varchar(50)

25

50

firstname

varchar(50)

25

50

shortname

varchar(4)

4

4

password

varchar(32)

10

20

email

varchar(100)

50

100

isProf

tinyint

1

1

subacribedFor

int

4

4

8 séparateurs



8

8

champs numériques



4

8

Subtotal
pour un nuplet



160

299

Subtotal pour 100 nuplets (x100)



16000

29900


+ 1/3 pour index



5333.333333

9966.666667


+ taille fixe de la table



6144

6144

Total



27477.33333

46010.66667




Mid [Bytes]

Max [Bytes]

Taille totale de la base de données
(totale des 3 tables)

247832

472125.3333


Taille moyenne:
247832

/ 1024 Bytes =
242
kBytes

Taille maximale

:
472125.33

/ 1024 Bytes =
4
61.1

kBytes

1.2

Vos choix en tant qu’administrateur de votre SGBD

1.2.1

Installation SGBD
-

création BD

Sur notre serveur nous avons installé la version 5.5.11 de MySQL pour Windows, que
nous avons téléchargé sur
http://dev.mysql.com/downloads/mysql/
. Comme “storage
engine” principal nous avon
s décidé de prendre InnoDB. InnoDB supporte les
transactions et les clefs
étrangère
s, ce qui n’est pas le cas pour le “storage engine”
MyISAM.
L’outil
MySqlWorkbench
nous a aidé à mettre en place la base de données ainsi
que de créer les tables de la base
de données. Pour le code SQL de la création de la base
de données, voir point 1.7.

1.2.2

Comptes

Pour la gestion de la base de données nous utilisons un compte
pmanager
-
admin

qui a
tous les droits sur la base de données pmanager (voir section 1.7.4 pour le code
SQL).
Pour faciliter la gestion de la base de données, l’utilisateur
pmanager
-
admin

peut
accéder depuis partout

(anyhost)
. Notre application utilise un utilisateur
pmanager

qui
PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


6

a seulement les droits d’utilisation.
(
select
,
insert
,
update
,
delete
et
execut
e
(voir
section 1.7.4 pour le code SQL)). L’utilisateur
pmanager

peut seulement accéder depuis
la même machine (localhost).

1.2.3

Choix pour gérer la sécurité contre l’injection

Nous utilisons les «

prepared statements

» pour les requêtes que nous avons
implémentés nous même (sans JPA). Pour les requêtes JPA, ceci est déjà fait et nous
n’avons rien besoin de faire.

Pour la requête que nous utilisons au login de l’application, nous avons décidé d’utiliser
une vue qui n’offre seulement les utilisateurs à di
sposition. Ceci réduit le risque d’une
injection MySql parce que la vue est
isolée

des autres tables de la base de données.

1.3

Choix d’index pour chaque relation

Notre base de données utilise uniquement les index sur des nombres entiers qui sont
soit des
clefs primaires ou des clefs étrangères. Pour indexer des nombres entiers,
MySQL utilise le type BTREE.

1.4

Argumentation sur la dénormalisation

Vu que notre base de donné
es est relativement petite (peu

de données) et que les temps
d’accès sont judicieux, nou
s n’avons pas eu besoin de dénormaliser notre base de
données.

1.5

Etude d’un plan d’exécution

Nous allons étudier le plan d’exécution de la
requête

suivante:

SELECT p.title FROM pmanager.project AS p

JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.
idPeriod

WHERE p.idProject = 1

AND now() > sp.begin

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


7


A1

est exécuté en premier, qui fait le filtre
now() > begin
et qui

remonte l’id de
subscriptionPeriod
. A2 est en suite exécuté, qui filtre par (
idProject = 1)

et qui remonte id
et titre de la table
project
. A3 peut en suite faire la jointure avec les champs pour qu’il
puisse faire la sélection finale de title.

1.6

Etude et test d’un accès concurrentiel

Pour dé
montrer
un cas concurrentiel nous allons simuler la modification concurrentielle
de la table
pr
ojects
. Pour faire ceci nous mettons un breakpoint avec l’IDE NetBeans
dans notre code Java

:


Le breakpoint est mis après l’exécution de
START TRANSACTION
et avant la fin de la
transaction. Le niveau de la transaction est serialisable. C’est
-
à
-
dire qu’el
le est bloquante.
PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


8

Une fois mis le breakpoint, nous éditons un projet via notre frontend et cliquons en suite
sur «

save

» pour enregistrer le projet modifié. Nous voyons que nous arrivons dans le
code jusqu’à notre breakpoint

:


En suite nous avons exécut
é la requête suivante

:

set transaction isolation LEVEL SERIALIZABLE;

Start transaction ;

DELETE FROM pmanager.project where idProject =1;

ROLLBACK;


Nous observons que la requête
delete

est en train d’attendre


(Running…):


Si nous continuons au breakpoint (run), la requête de
delete

est en
suite
exécutée
.

1.7

Code SQL dans cet ordre

1.7.1

Code de l’implémentation des tables

DROP SCHEMA IF EXISTS `pmanager` ;

CREATE SCHEMA IF NOT EXISTS `pmanager` DEFAULT CHARACTER SET utf8 COLLATE
utf8
_general_ci ;

USE `pmanager` ;


--

-----------------------------------------------------

--

Table `pmanager`.`user`

--

-----------------------------------------------------

DROP TABLE IF EXISTS `pmanager`.`user` ;


CREATE TABLE IF NOT EXISTS `pmanager`.`u
ser` (


`idUser` INT NOT NULL AUTO_INCREMENT ,


`login` VARCHAR(50) NOT NULL ,


`lastname` VARCHAR(50) NOT NULL ,


`firstname` VARCHAR(50) NOT NULL ,


`shortname` VARCHAR(4) NULL DEFAULT NULL ,


`password` VARCHAR(32) NOT NULL COMMENT 'MD5 valueß' ,


`email` VARCHAR(100) NOT NULL ,


`isProf` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'If not prof then student.' ,


`subscribedFor` INT NULL ,


PRIMARY KEY (`idUser`) ,


UNIQUE INDEX `login_UNIQUE` (`login` ASC) ,


INDEX `fk_usersubscribedFor`
(`subscribedFor` ASC) ,

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


9


CONSTRAINT `fk_usersubscribedFor`


FOREIGN KEY (`subscribedFor` )


REFERENCES `pmanager`.`project` (`idProject` )


ON DELETE NO ACTION


ON UPDATE NO ACTION) ENGINE = InnoDB;


--

----------------------------------------
-------------

--

Table `pmanager`.`subscriptionPeriod`

--

-----------------------------------------------------

DROP TABLE IF EXISTS `pmanager`.`subscriptionPeriod` ;


CREATE TABLE IF NOT EXISTS `pmanager`.`subscriptionPeriod` (


`idPeriod` INT NOT NULL
AUTO_INCREMENT ,


`begin` DATE NOT NULL ,


`end` DATE NOT NULL ,


PRIMARY KEY (`idPeriod`)) ENGINE = InnoDB;


--

-----------------------------------------------------

--

Table `pmanager`.`project`

--

-----------------------------------------------------

DROP TABLE IF EXISTS `pmanager`.`project` ;


CREATE TABLE IF NOT EXISTS `pmanager`.`project` (


`idProject` INT NOT NULL AUTO_INCREMENT ,


`title` VARCHAR(100) NOT NULL ,


`nbMaxStudents` INT NOT NULL ,


`description` TEXT NOT NULL ,


`technologie` VARCHAR(60) NOT NULL ,


`schoolYear` YEAR NOT NULL ,


`computedXML` LONGTEXT NOT NULL ,


`isReadOnly` TINYINT(1) NOT NULL DEFAULT 0 ,


`isDocumented` TINYINT(1) NOT NULL DEFAULT 0 ,


`client_id` INT NOT NULL ,


`idPeriod` INT NULL D
EFAULT NULL ,


`parentProject_id` INT NULL ,


PRIMARY KEY (`idProject`) ,


INDEX `fk_projectClient` (`client_id` ASC) ,


INDEX `fk_project_subscriptionPeriod` (`idPeriod` ASC) ,


INDEX `fk_project_parent` (`parentProject_id` ASC) ,


CONSTRAINT `fk_pr
ojectClient`


FOREIGN KEY (`client_id` )


REFERENCES `pmanager`.`user` (`idUser` )


ON DELETE RESTRICT


ON UPDATE NO ACTION,


CONSTRAINT `fk_project_subscriptionPeriod`


FOREIGN KEY (`idPeriod` )


REFERENCES `pmanager`.`subscriptionPeriod` (`idPeriod` )


ON DELETE RESTRICT


ON UPDATE NO ACTION,


CONSTRAINT `fk_project_parent`


FOREIGN KEY (`parentProject_id` )


REFERENCES `pmanager`.`project` (`idProject` )


ON DELETE NO ACTION



ON UPDATE NO ACTION) ENGINE = InnoDB;




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


10

1.7.2

Code des triggers

DELIMITER $$

DROP TRIGGER IF EXISTS user_update;

CREATE TRIGGER user_update BEFORE UPDATE ON pmanager.user


FOR EACH ROW


BEGIN


--

CI2


IF (SELECT DISTINCT p.idProject FROM pmanager.project AS p


JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.idPeriod


WHERE p.idProject = NEW.subscribedFor


AND (sp.begin > now() OR sp.end < now())) THEN



SET NEW.subscribedFor = OLD.subscribedFor;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI2 business constraint
violation: Subscription period is not available!';


END IF;




--

CI11


IF (SELECT p.idProject FROM pmanager.project AS p


WHERE p.client_id = OLD.idUser


AND NEW.isProf = 0) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI11 business constraint
violation: Can
\
't change state to stu
dent because this teacher is attributed to a
project!';


END IF;




--

CI12


IF (NEW.subscribedFor IS NOT NULL AND NEW.isProf = 1) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI12 business constraint
violation:
Only students can subscribe for projects! Updated user is a teacher!';


END IF;




END; $$



DELIMITER $$

DROP TRIGGER IF EXISTS user_insert;

CREATE TRIGGER user_insert BEFORE INSERT ON pmanager.user


FOR EACH ROW


BEGIN


--

CI2


IF (SELECT DISTINCT p.idProject FROM pmanager.project AS p


JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.idPeriod


WHERE p.idProject = NEW.subscribedFor


AND (sp.begin > now() OR sp.end < now())) THEN


--

SET NEW.subscribedFor = OLD.subscribedFor;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI2 business constraint
violation: Subscription period is not available!';


END IF;




--

CI12



IF (NEW.subscribedFor IS NOT NULL AND NEW.isProf = 1) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI12 business constraint
violation: Only students can subscribe for projects! Inserted user is a teacher!';


END IF;





END; $$






DELIMITER $$

DROP TRIGGER IF EXISTS subscriptionPeriod_update;

CREATE TRIGGER subscriptionPeriod_update BEFORE UPDATE ON pmanager.subscriptionPeriod


FOR EACH ROW


BEGIN




--

CI3


IF (now() >= OLD.begin AND OLD.en
d = NEW.end) THEN


--

SET NEW.begin = OLD.begin;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI3 business constraint
violation: Subscriptionperiod is already opened, you can
\
't modify the begin
anymore!';


END IF;



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


1
1


--

CI3


IF ((now() >= OLD.begin AND OLD.begin != NEW.begin) AND (now() < OLD.end OR
now() < NEW.end)) THEN


SET NEW.begin = OLD.begin;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT
= 'CI3 business constraint
violation: Subscriptionperiod is already opened, you can
\
't modify the begin
anymore!';


END IF;




--

CI4


IF (now() >= NEW.end) THEN


--

SET NEW.begin = OLD.begin;
--

maybe we don't need thi
s


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI4 business constraint
violation: New end date can
\
't be smaller than today!';


END IF;




--

CI4


IF (OLD.begin = NEW.begin AND now() >= OLD.end) THEN


--

SET NE
W.begin = OLD.begin;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI4 business constraint
violation: Subscriptionperiod is already closed, you can
\
't modify the end anymore!';


END IF;




--

CI4


IF (now() >= OLD.end) THEN


--

SET NEW.end = OLD.end;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI4 business constraint
violation: Subscriptionperiod is already closed, you can
\
't modify it anymore!'
;


END IF;




--

CI4


IF (OLD.begin >= NEW.end) THEN


--

SET NEW.end = OLD.end;
--

maybe we don't need this


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI4 business constraint
violation: Subscriptionperiod end

must be greater than begin!';


END IF;


END; $$




DELIMITER $$

DROP TRIGGER IF EXISTS project_update;

CREATE TRIGGER project_update BEFORE UPDATE ON pmanager.project


FOR EACH ROW


BEGIN




--

CI5


IF (SELECT p.i
dProject FROM pmanager.project AS p


JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.idPeriod


WHERE p.idProject = OLD.idProject


AND now() > sp.begin) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI5 business constraint
violation: Project can
\
't be modified because its subscriptionperiod is already
open!';


END IF;




--

CI6


IF (SELECT p.idProject FROM pmanager.pro
ject AS p


JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.idPeriod


WHERE NEW.parentProject_id = p.idProject


AND now() < sp.begin) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI6 business cons
traint
violation: Projects can only inherit from read
-
only projects (now() < begin)';


END IF;




--

CI11


IF (SELECT u.idUser FROM pmanager.user AS u


WHERE u.isProf = 0


AND NEW.client_id = u.idUser) TH
EN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI11 business constraint
violation: Clients of project must be teachers! The chosen project client is not a
teacher!';


END IF;




END; $$

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


12





DELIMITER $$

DROP TRIGGER IF
EXISTS project_insert;

CREATE TRIGGER project_insert BEFORE INSERT ON pmanager.project


FOR EACH ROW


BEGIN




--

CI6


IF (SELECT p.idProject FROM pmanager.project AS p


JOIN pmanager.subscriptionPeriod AS sp ON sp.idPeriod = p.idPeriod


WHERE NEW.parentProject_id = p.idProject


AND now() < sp.begin) THEN


SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI6 business constraint
viola
tion: Projects can only inherit from read
-
only projects (now() < begin)';


END IF;




--

CI11


IF (SELECT u.idUser FROM pmanager.user AS u


WHERE u.isProf = 0


AND NEW.client_id = u.idUser) THEN



SIGNAL SQLSTATE '99001' SET MESSAGE_TEXT = 'CI11 business constraint
violation: Clients of project must be teachers! The chosen project client is not a
teacher!';


END IF;


END; $$


1.7.3

Code des procédures stockées et des fonctions implémentés

--

Routines

DELIMITER $$

DROP PROCEDURE IF EXISTS isReadOnly;

CREATE DEFINER=`pimanager
-
admin`@`%` PROCEDURE `isReadOnly`()

BEGIN


--

Returns all read
-
only projects


SELECT


p.*


FROM pmanager.project AS p


JOIN pmanager.subscriptionPeri
od AS sp


ON sp.idPeriod = p.idPeriod


WHERE now() >= sp.begin;

END; $$


1.7.4

Code de création des utilisateurs avec leurs privilèges

Utilisateur pmanager

CREATE

USER

'pmanager'
@
'localhost'

IDENTIFIED

BY

'***'
;


GRANT

SELECT

,


INSERT

,

UPDATE

,

DELETE

,

EXECUTE

ON

pmanager

.

*

TO

'pmanager'
@
'localhost'

IDENTIFIED

BY

'password_here'

WITH

MAX_QUERIES_PER_HOUR

0

MAX_CONNECTIONS_PER_HOUR

0

MAX_UPDATES_PER_HOUR

0

MAX_USER_CONNECTIONS

0

;

Utilisateur pmanager
-
admin

CREATE

USER

'pmanager
-
admin'
@
'%'

IDENTIFIED

BY

'***'
;

GRANT

ALL

PRIVILEGES

ON

pmanager

.

*

TO

'pmanager
-
admin'
@
'%'

IDENTIFIED

BY

'password_here'

WITH

GRANT

OPTION

MAX_QUERIES_PER_HOUR

0

MAX_CONNECTIONS_PER_HOUR

0

MAX_UPDATES_PER_HOUR

0

MAX_USER_CONNECTIONS

0

;

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


13

1.7.5

Remarques

Comme nous
l’
avons découvert
durant la phase
"Analyse"
,

la syntaxe

"
CHECK" de Mysql
existe dans la

documentation mais n'est pas

implémenté
e
. La syntaxe "CHECK" nous
aurait servis pour vérifier par

exemple que la fin d'une période d'inscription doit être
ultérieure à celle de
début
etc... Nous avons du utiliser des Triggers à la place. Après

avoir fait des recherches pour savoir

comment gérer les exceptions avec Mysql

nous
avons trouvé la syntaxe "SIGNAL", qui a été introduit
e

avec Mysql

5.5. La syntaxe
"SIGNAL" permet de monter des
Exceptions. Nous avons

d'abord pensé qu'il n'y avait
pas
d’
exceptions avec Mysql. Donc la

découverte de la syntaxe "SIGNAL"
était

un point
très positif
.


Concernant l
es Triggers
,

nous avons remarqué qu'il n'est pas possible de faire

un
CREATE TRIGGER xy be
fore update OR insert on yz
(le
OR

n'est pas

possible avec Mysql).
Nous étions

obligés

de créer deux trigger
s
, un pour

update et un
pour insert.

1.8

Caractéristiques SGBD

Complétez le tableau déjà pré
-
rempli au niveau de l’analyse et qui récapitule les
caracté
ristiques de votre SGBD



MySql

:



Version

5.5.11

Modèle relationnel

Critères

Description

Spécifier si utilisé ou pas et où

?

Déclaration de type

Différents type standard possible
tel que:


TINYINT, SMALLINT

SMALLINT,
INT, INTEGER, INTEGER, FLOAT,
DOUBLE
PRECISION, DOUBLE,
REAL, DECIMAL, NUMERIC,
DATE, DATETIME, TIMESTAMP,
TIME, YEAR, CHAR, BIT, BOOL,
VARCHAR, TEXT, LONGTEXT, SET,
ENUM.

Utilisation table
project

:

int, varchar, text, year, longtext,
tinyint


Utilisation table
subscriptionPeriod

:

int, date


Utilisation table
user

:

int, varchar, tinyint


Contraintes d’intégrité
référentielle et les options de la
gestion de sa violation

Géré avec les options
suivantes

:ON DELETE et ON
UPDATE

: RESTRICT | CASCADE |
SET NULL | NO ACTION

Pas utilisé

Support
du CHECK

Non, la syntaxe de création
l’accepte mais le check est
ignoré tout le temps.
Incroyable

!!!


---

Contrôle format de chaines de
champs

Non

---

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


14

Gestion de clés automatiques

Auto_increment

Utilisé pour les tables
project
,
subscriptionPeriod

et
user

….



Objets de la base

Critères

Description

Spécifier si utilisé ou pas et
référencer où

et comment?

Support du type XML

Partielle, permet de stocker et
requêter XPATH ExtractValue()

UpdateXML()

Pas utilisé

Support de BLOBs, CLOB

?

Oui


Type
date et son support

Oui, grande série de méthode

http://dev.mysql.com/doc/refma
n/5.5/en/date
-
and
-
time
-
functions.html

Type year

:

CREATE TABLE IF NOT EXISTS
`pmanager`.`project` (



`
schoolY
ear` YEAR NOT NULL ,

..

)


Par défaut une longueur de 4
chiffres de
1901 à 2155

est
requis.


Type date

:

CREATE TABLE IF NOT EXISTS
`pmanager`.`subscriptionPeriod`
(

`idPeriod` INT NOT NULL
AUTO_INCREMENT ,

`begin`
DATE

NOT NULL ,

`end`
DATE

NOT NULL ,

PRIMARY KEY (`idPeriod`))
ENG
INE = InnoDB;


Format

: YYYY
-
MM
-
DD

Une valeure de
1000
-
01
-
01
à 9999
-
12
-
31 est
requis.

Vues et les options de l’insert
possibles

Vues possibles.

L’insert quand il s’agit d’une vue
sur une table est toléré.

L’insert sur des vues qui
viennent de table multiple est
limité.

Voir les actions permises

:
http://dev.mysql.com/doc/refma
n/5.5/en/view
-
updatability.html

Pour raisons de sécurité nous
avons utilisé une vue pour le
login

:

CREATE OR REPLACE VIEW
manager`.`loginView` AS Select
login,password, CASE isProf

WHEN 0 THEN 'Student' WHEN
1 THEN 'Professor' END AS
groupOfUser from user;

Option possible sur la structure
physique des tables (cluster,
fillfactor etc…)

Cluster non supporté (supporter
à partir

de la version 6.3)

---

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


15

Structure des index proposés

:
(B
-
arbre, binaire….)

b
-
arbres

R
-
arbres

Hash index

MySQL utilise les
BTREE

pour les
index sur les nombres entiers.


Utilisé dans les tables
project
,
subscriptionPeriod

et
user


Triggers

:



Niveau
(row,set)



Type (before,after)



Variables propres aux
triggers


Row

Before and after

OLD NEW SET


Ne fonctionne pas pour les vues.

Nous avons utilisé les triggers
pour toutes les contraintes
d’intégrité
sauf
CI8, CI9, CI10
que nous faisons au côté
application.


Pour MySQL il n’existe
seulement les triggers before.


Exemple d’utilisation de NEW et
OLD

:

SELECT p.idProject FROM
pmanager.project AS p


WHERE p.client_id =
OLD
.idUser

AND
NEW
.isProf = 0


Pour plus d’exemple, voir
chapitre 1.7.2 (Code de
s
triggers)

Procédures stockées

:



Language



Imbrications



Curseurs

: forward,
backward


SQL:2003

Oui

Uniquement forward(fetch)

Nous avons utilisé une
procédure socké MySql qui
s’appelle
isReadOnly
. Elle
retourne toutes les projets qui
sont ReadOnly (now() >

projet.begin)

Déclarations de fonctions


Pas utilisé

Niveau d’isolation

possible

Read commited

Read uncommited

Repeatable read

Serializable

Pour nos transactions nous
avons utilisé les niveaux
d’isolation que nous avons
spécifié dans la documentation
de

conception.

Type de verrous explicites
possibles

Avec MySql 5.5 il existe les
«

shared locks (S)

» et les
«

exclusive locks (X)

»

Pas utilisé

Requêtes

Critères

Description

Spécifier si utilisé ou pas et où

?

Type de jointures possibles

:



Natrural join



Inner join



Outer join



Cross join

Natural join équivalent à inner
join et à Left join

Right join

Inner join

Cross join otherwise

Straight_join


Comme convenu nous avons fait
toutes les requêtes de sélection
avec notre framework JAVA.
Nous ne savons pas c
e que le
framework genère comme
requêtes.


Pour toutes autres requêtes
insert, update ou delete nous
n’avons pas utilisé de join.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


16

Requêtes imbriquées

Possible pour les fonctions:

ANY,IN,SOME,ALL,EXISTS,NOT
EXISTS, from

Pas utilisé

Opérateurs ensemblistes

Union

Pas utilisé

Insertion multi
-
ligne

Possible

Pas utilisé

Additionnel

Critères

Description

Spécifier si utilisé ou pas et où

?

Activation des statistiques



Voir le plan d’exécution d’une
requête






PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


17

2

Implémentation SI

2.1

Environnement spécifique de

développement

2.1.1

Framework

Il s’agit de remplir et compléter les informations sur des éventuelles couches et
Framework qui ont été rajouté sur l’environnement de base :

1.

GlassFish

Notre application fonctionne avec
Oracle GlassFish Server qui fournit un serve
ur
po
ur le développement et le déplo
iement

d’application Java Platform, Java EE et
technologie web basée sur la technologie Java.

2.

Primeface

PrimeFaces est un framework Java Server Faces
(
JSF
)

2.0 qui fournit une
plus
d’une
centaine de composant
, il est lég
er et facile d’utilisation.

3.

P
lus d’infos & liens :

a.

https://glassfish.dev.java.net/

b.

http://www.primefaces.org/


2.2

Eléments architecturaux

2.2.1

Couche présentation

1.

Type de
l’IHM

:
Client mixte.

Pourquoi:
L
e triage des tableaux se fait au côté

du client. Tout le r
este et fait au
côté serveur. Pour cette raison nous parlons d’un client mixte

(calculs d’IHM sur
serveur et client)
.

2.

Support de

l’
IHM

Sensé de fonctionner sur tout

les brows
ers, mais testé uniquement sur F
irefox
(version

: 3.6 et 4.0.1
).

Nous n’avons pas eu assez de temps à disposition pour
tester sur
tous les browsers
.

Mais vu que nous utilisons les composants
PrimeFaces,

le risque que quelque chose ne fonctionne p
as avec un autre
browser que Firefox est très faible.



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


18

3.

Explication sur le choix technologique :

a.

Explications générales :

Nous avons choisit pour la couche de présentation d’utiliser les
composants PrimeFaces par
-
ce
-
que
il nous
permettait

de facilement
d’utiliser des composants graphiques
préconçus
.

b.

Plateforme :

PrimeFaces utilise à l’
intérieur

de ses composants la plateforme jQuery
qui est à notre avis
une bonne solution pour des sites
modernes qui
utilisent la technologie
AJAX.


4.

Réalisation de l’interface

L’interface IHM est
réalisée

en utilisant le standard de xHTML.

Dans les pages
xHTML nous utilisons les librairies JSF et PrimeFaces
.

Comment

:
En déclarent les namespaces
nécessaires
, nous pouvons utiliser les
librairies de la
manière

suivante


(exemple d’utilisation PrimeFaces)
:

<h:form>







<p:dataTable

var="car"

value="#{tableBean.carsSmall}">











<p:column>















<f:facet

name="header">























Model















</f:facet>















<
h:outputText

value="#{car.model}"

/>











</p:column>














<p:column>















<f:facet

name="header">























Year















</f:facet>















<h:outputText

value="#{car.year}"

/>











</p:column>














<p:column>















<f:facet

name="header">























Manufacturer















</f:facet>















<h:outputText

value="#{car.manufacturer}"

/>











</p:column>














<p:column>















<f:facet

name="heade
r">























Color















</f:facet>















<h:outputText

value="#{car.color}"

/>











</p:column>







</p:dataTable>



</h:form>




Plus d’infos & liens :

http://www.primefaces.org



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


19

2.2.2

Couche métier

Il s’agit de remplir et compléter les informations suivantes :

1.

Inventaire
de nos classes utilitaires

Nom
package

Li
s
te des classes

explications

page

MenuView.xhtml

Cette page permet de naviguer
entre les différe
ntes
fonctionnalités de l’application

灡pe

L潧inVi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⁡畸u
utilisateurs de l’application de
s’authentifier

灡pe

䝲潵灄整慩lVi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⃠e畮u
professeur d’afficher les détails
摥d⁧牯rp敳

灡pe

偲潪散瑅ti瑯tVi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⃠e畮u
professeur d’éditer les
informations d’un projet

灡pe

S畢ucri灴楯n健物o摳Vi敷ex桴hl

䍥瑴攠灡p攠e敲m整⃠e畮u
灲潦psse畲⁤攠g敲敳⁰é物潤os
d’inscription

灡pe

Assign慴a潮Vi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⁡甠
灲潦psse畲⁤攠g敲é
l’assignation de projets à une
烩物潤e

灡pe

S畢ucri灴楯nVi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⃠e畮u
professeur d’afficher et
d’imprimer la liste des élèves
insc物ts⁡畸⁰牯r整s

灡pe

偲潪散瑳䵡湡M敲Vi敷⹸桴ml

䍥瑴攠灡p攠e敲m整⁡甠
灲潦psse畲⁤攠g敲愠汩st攠摥e
灲p
j整e

灡pe

S瑵摥湴Vi敷⹸桴ml

䍥瑴攠灡p攠es琠c敬汥⁧狢r攠
污煵敬l攠畮uév攠eo畲牡u
s’inscrire à un projet.

c栮ei慦爮灩.
g㈮睥2

N慶楧慴i潮o慮a汥爮r慶a

䍥瑴攠cl慳s攠e攠è愠a慶楧a瑩潮o
敮e牥敳⁤i晦敮ées⁰慧es

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


20

ch.eiafr.pi.
g2.Facade

ProjectFacade.java

Cette façade permet de gérer
des objets correspondant à des
projets dans la BD

ch.eiafr.pi.
g2.Facade

SubscriptionPeriodsFacade
.java

Cette façade permet de gérer

des objets correspondant à

des
périodes d’inscription (ajout,
m潤ific慴i潮Ⱐs異灲ussi潮o

c栮e
i慦爮灩.
g㈮䙡2慤a

䡩Ht潲oF慣慤e
⹪慶a

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
污l
génération de l’historique

c栮ei慦爮灩.
g㈮䙡2慤a

䝲潵灄整慩汆ac慤攮橡ea

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
汥l
g牯r灥p 整愠g慴é潮od甠u䑆

c栮ei慦爮灩.
g㈮䙡2慤a

S畢ucri灴楯nFac慤攮橡ea

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
污l
liste d’inscription au projet

c栮ei慦爮灩.
g㈮䙡2慤a

S瑵摥湴tac慤a

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
l’inscription d’un élève

c栮ei慦爮灩.
g㈮䑡瑡䉡s
e

偲潪散t

䍥瑴攠cl慳s攠牥灲敮e攠en
enregistrement d’un projet dans
污⁢慳攠摥

d潮os

c栮ei慦爮灩.
g㈮

䑡瑡䉡se

S畢ucri灴楯n健物od

䍥瑴攠cl慳s攠牥灲敮e攠en攠
période d’inscription dans la
b慳攠摥e摯湮é敳

c栮ei慦爮灩.
g㈮

䑡瑡䉡se

User

䍥瑴攠cl慳s攠牥灲敮e攠en
畴ulis慴敵爠摡ds愠b慳攠摥
摯湮é

c栮ei慦爮灩.
g㈮2


偲潪散瑄tO

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
l’accès à la B
䐠D潵爠畮u灲潪整

c栮ei慦爮灩.
g㈮䙡2慤a

S畢ucri灴楯n健物o摄dO

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
l’accès à la B
䐠D潵爠畮攠ué潤攠
d’inscription

c栮ei慦爮灩.
g㈮䙡2慤a

Use牄rO

䍥瑴攠晡ç慤攠e敲e整⁤攠eé牥爠
l’accès à la B
D

p潵爠畮u
畴ulis慴敵r




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


21

2.

Techniques de mapping BD vs. XML schémas : il s’agit de fournir des explications
sur les moyens utilisés pour assurer le mapping entre les champs de la base de
données et les éléments XML nécessaires à la publication :

Lors de
l’insertion ou de la modification d’un projet dans la base de données,
nous allons mettre à jour le champ computedXML de la table projet, lequel
contiendra toutes les informations du projet sous forme XML. Cela nous
permettra ensuite de générer les différe
nts fichiers PDF que l’utilisateur désirera.
Le résultat ne sera donc pas enregistré en tant que fichier XML mais sous forme
de String dans la base de données.

XMLGenerator.java

static final String JAXP_SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/prope
rties/schemaLanguage";

static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";

static final String JAXP_SCHEMA_SOURCE =
"http://java.sun.com/xml/jaxp/properties/schemaSource";


private static final String FILE_XSD = "computedXML.xsd";


//
Nous allons commencer notre arborescence en créant la racine XML

qui sera ici

//
"project".

private static Element racine = new Element("project");


// On crée un nouveau Document JDOM basé sur la racine que l'on vient de créer

private static
org.jdom.Document document = new Document(racine);

/**


* Genere un XML et le retourne sous la forme d'un string. Si le XML n'est


* pas valide, une valeur null est retournee.


*


* @param project


* @param client


* @param history


* @param students


* @param subscriptionPeriod


* @return


*/

public static String generateXML(Project project, User client, Project[] history,
User[] students, SubscriptionPeriod subscriptionPeriod){


createProject(project);


createClient(client);


createHistory(h
istory);


createStudents(students);


createSubscriptionPeriod(subscriptionPeriod);


try {


if (validateXML()){


org.jdom.output.Format format = Format.getPrettyFormat();


format.setOmitDeclaration(true);


XMLOutputter sortie = new XMLOutputter( format);


StringWriter sw = new StringWriter();


sortie.output(document, sw);


return sw.toString();


}


} catch (IOException ex) {


Logger.getLogger(XM
LGenerator.class.getName()).log(Level.SEVERE, null, ex);


}


return null;

}

Création des différents éléments du fichier

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


22

private static void createProject(Project p) {


Attribute aId = new Attribute("id", p.getIdProject() + "");


racine.setAttribute(aId);


Attribute aNbMaxStudents = new Attribute("nbMaxStudents",



p.getNbMaxStudents()+ "");


racine.setAttribute(aNbMaxStudents);



Element eTitle = new Element("title").setText(p.getTitle());


racine.addContent(eTitle);



Element eD
escription = new



Element("description").setText(p.getDescription());


racine.addContent(eDescription);



Element eTechnologies = new



Element("technologies").setText(p.getTechnologie());


racine.addContent(eTechnologies);



Calendar c = new GregorianCalendar();


c.setTime(p.getYear());



Element eYear = new

Element("year").setText(c.get(Calendar.YEAR)+"/"+(c.get(Calendar.YEAR)+1));


racine.addContent(eYear);


}

Note

: la création des autres éléments étant toujours
effectuées selon ce même principe,
ne figurent pas dans ce document.


Validation du XML avec la feuille XSD

en Java

private static boolean validateXML(){



try {


isValide = true;



String nomXSD = FILE_XSD;




XMLOutputter output=new XMLOutputter()
;



String str = output.outputString(document);




byte currentXMLBytes[] = str.getBytes();



ByteArrayInputStream _xmlFile = new




ByteArrayInputStream(currentXMLBytes);




SAXParserFactory spf = SAXParserFactory.newInstance();



spf.setNamespaceAware(true);



spf.setValidating(true);



SAXParser sp = spf.newSAXParser();



sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);



sp.setProperty(JAXP_SCHEMA_SOURCE, nomXSD);



sp.parse(_xmlFile, new DefaultHandler(){


@Overr
ide




public void fatalError(SAXParseException e) {





isValide = false;




}




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


23



@Override


public void error(SAXParseException e) {


isValide = false;


}



@Override


public void warning(SAXParseException e) {





isValide = false;




}



});


}


catch ( Exception e) {



Logger.getLogger(XMLGenerator.class.getName())




.log(Level.SEVERE, null, e);


return false;


}


return isValide;

}


computedXML.xsd

<!
--

edited with XMLSpy v2009 sp1 (http://www.altova.com) by Christophe (EMBRACE)
--
>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


<xsd:include schemaLocation="computedXMLTypes.xsd"/>


<xsd:element name="project">



<
xsd:complexType>




<xsd:sequence>





<!
--

Project Title
--
>





<xsd:element name="title" type="xsd:string"/>





<!
--

Project Description
--
>





<xsd:element name="description" type="xsd:string"/>





<!
--

Project Technologies
--
>





<xsd:element name
="technologies" type="xsd:string"/>





<!
--

Year Format YYYY/YYYY checked by complex Type myYear
--
>





<xsd:element name="year" type="myYear"/>





<!
--

The one and only client for the project
--
>





<xsd:element name="client" type="myCoordinates"/>





<!
--

The subscribed students for this project
--
>





<xsd:element name="history" type="myHistoryProject" minOccurs="0"/>





<xsd:element name="students" type="myStudents" minOccurs="0"/>





<!
--

Subscription Period for the project
--
>





<xsd:element

name="subscriptionPeriod" type="myPeriod" minOccurs="0"/>




</xsd:sequence>




<xsd:attribute name="id" type="xsd:positiveInteger" use="required"/>




<xsd:attribute name="nbMaxStudents" type="xsd:positiveInteger"
use="required"/>




<!
--

Unique ID of th
e project
--
>




<!
--

Maximal number of students
--
>



</xsd:complexType>


</xsd:element>

</xsd:schema>




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


24

computedXMLTypes.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">


<!
--

Complex Types
--
>


<xsd:complexType name="myPeriod">



<
xsd:sequence>




<xsd:element name="begin" type="myDate"/>




<xsd:element name="end" type="myDate"/>



</xsd:sequence>


</xsd:complexType>


<!
--

We have a custom myDate type with day, month and year tags. This makes it
easier to deal with xPath
--
>


<xsd:
complexType name="myDate">



<xsd:sequence>




<xsd:element name="day">





<xsd:simpleType>






<xsd:restriction base="xsd:positiveInteger">







<xsd:maxInclusive value="31"/>






</xsd:restriction>





</xsd:simpleType>




</xsd:element>




<
xsd:element name="month">





<xsd:simpleType>






<xsd:restriction base="xsd:positiveInteger">







<xsd:maxInclusive value="12"/>






</xsd:restriction>





</xsd:simpleType>




</xsd:element>




<xsd:element name="year">





<xsd:simpleType>






<xs
d:restriction base="xsd:positiveInteger">







<xsd:pattern value="[1
-
9][0
-
9]{3}"/>






</xsd:restriction>





</xsd:simpleType>




</xsd:element>



</xsd:sequence>


</xsd:complexType>


<!
--

The myStudent Type contains one or more students
--
>


<xsd:comp
lexType name="myStudents">



<xsd:sequence>




<xsd:element name="student" type="myCoordinates" maxOccurs="unbounded"/>



</xsd:sequence>



<xsd:attribute name="nbStudents" type="xsd:positiveInteger" use="required"/>



<!
--

The number of subscribed
students (Maybe we are going to delete this and
use xsl:count())
--
>


</xsd:complexType>


<!
--

A custom Coordinate type. Only shortname is not required
--
>


<xsd:complexType name="myCoordinates">



<xsd:sequence>




<xsd:element name="firstname" type="xsd:
string"/>




<xsd:element name="lastname" type="xsd:string"/>




<xsd:element name="shortname" type="xsd:string" minOccurs="0"/>




<xsd:element name="email" type="myEmail"/>



</xsd:sequence>


</xsd:complexType>


<!
--

A custom Project type for history
--
>


<xsd:complexType name="myHistoryProject">



<xsd:sequence>




<xsd:element name="historyProject" maxOccurs="unbounded">





<xsd:complexType>






<xsd:sequence>







<xsd:element name="name" type="xsd:string"/>






</xsd:sequence>






<xsd:attribute
name="number" type="xsd:integer"/>

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


25





</xsd:complexType>




</xsd:element>



</xsd:sequence>


</xsd:complexType>


<!
--

Simple Types
--
>


<!
--

Checks the format YYYY/YYYY
--
>


<xsd:simpleType name="myYear">



<xsd:restriction base="xsd:string">




<xsd:pat
tern value="[1
-
9][0
-
9]{3}/[1
-
9][0
-
9]{3}"/>



</xsd:restriction>


</xsd:simpleType>


<!
--

Email format check
--
>


<xsd:simpleType name="myEmail">



<xsd:restriction base="xsd:string">




<xsd:pattern value="[a
-
zA
-
Z0
-
9._
-
]+@[a
-
zA
-
Z0
-
9.
-
]+
\
.[a
-
zA
-
Z]{2,4}"/>



</xsd:restriction>


</xsd:simpleType>

</xsd:schema>


Voici un exemple de ce que cette classe permet de générer. Comme cité précédemment,
ce XML n’a pas d’instance physique (uniquement en mémoire) et sera ensuite stocké
dans la base de données comme
String.

<project id="1234" nbMaxStudents="2">


<title>Gestion des projets</title>


<description>desc</description>


<technologies>tech1, tech2</technologies>


<year>2011/2012</year>


<client>


<firstname>Omar</firstname>


<lastname>Abou Khaled<
/lastname>


<shortname>OAK</shortname>


<email>omar.aboukhaled@hefr.ch</email>


</client>


<history>


<historyProject number="1">


<name>Projet 1</name>


</historyProject>


</history>


<students nbStudents="2">


<student>


<fir
stname>Yves</firstname>


<lastname>Peissard</lastname>


<shortname>YP</shortname>


<email>yves.peissard@etu.hefr.ch</email>


</student>


<student>


<firstname>Elias</firstname>


<lastname>Medawar</lastname>


<shortname /
>


<email>elias.medawar@etu.hefr.ch</email>


</student>


</students>





PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


26


<subscriptionPeriod>


<begin>


<day>1</day>


<month>1</month>


<year>2011</year>


</begin>


<end>


<day>2</day>


<month>2</month>


<
year>2011</year>


</end>


</subscriptionPeriod>

</project>



Une fois notre XML créé, on fera appel à la classe utilitaire PDFGenerator.java qui prend
en paramètre le XML et le XSL
-
FO.

PDFGenerator.java

public class PDFGenerator {


private static final String PDF_FILE = "ResultXML2PDF.pdf";


private static int noPdf = 0;



public static void generePDFfromXSL(String xsl_fileName, String xml){


try {


// Setup directories


File baseDir = new File(
".");


File outDir = new File(baseDir, "out");


outDir.mkdirs();



// Setup input and output files


File xsltfile = new File(baseDir, xsl_fileName);


File pdffile = new File(outDir, noPdf++ +PDF_FILE);



// configure fopFactory as desired


FopFactory fopFactory = FopFactory.newInstance();



// configure foUserAgent as desired


FOUserAgent foUserAgent = fopFactory.newFOUserAgent();



// Setup output


OutputStream out = new java.io.FileOutputStream(pdffile);


out = new java.io.BufferedOutputStream(out);



try {


// Construct fop with desired output format


Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);



// Setup XSLT


TransformerFactory factory = TransformerFactory.newInstance();


Transformer transformer = factory.newTransf
ormer(new


StreamSource(xsltfile));



// Set the value of a <param> in the stylesheet


transformer.setParameter("versionParam", "2.0");



// Setup input for XSLT transformation



InputStream is = new ByteArrayInputStream(xml.getBytes());


Source src = new StreamSource(is);


PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


27


//Resulting SAX events (the generated FO) must be piped through to FOP


Result res = new SAXResult(fop.getDefaul
tHandler());



// Start XSLT transformation and FOP processing


transformer.transform(src, res);


} finally {


out.close();


}




//Open the file


Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " +


pdffile);


} catch (Exception e) {


Logger.getLogger(PDFGenerator.class.getName()).log(Level.SEVERE, null, e);


}


}


Le XSL
-
FO sui
vant permet de générer l’historique d’un projet

history.xslt

<?xml version="1.0" encoding="UTF
-
8"?>

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude
-
result
-
prefixes="fo">


<
xsl:output method="xml" version="1.0" omit
-
xml
-
declaration="no" indent="yes"/>


<xsl:param name="versionParam" select="'1.0'"/>


<!
--

=================================
--
>


<!
--

root element: project
--
>


<!
--

=================================
--
>


<xsl:template match="project">



<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">




<fo:layout
-
master
-
set>





<fo:simple
-
page
-
master master
-
name="simpleA4" page
-
height="29.7cm" page
-
width="21cm" margin
-
top="2cm" margin
-
bottom="2cm" margin
-
left
="2cm" margin
-
right="2cm">






<fo:region
-
body/>





</fo:simple
-
page
-
master>




</fo:layout
-
master
-
set>




<fo:page
-
sequence master
-
reference="simpleA4">





<fo:flow flow
-
name="xsl
-
region
-
body">






<fo:block font
-
size="20pt" font
-
weight="bold" space
-
a
fter="5mm">Title:
<xsl:value
-
of select="title"/>






</fo:block>






<fo:block font
-
size="12pt" space
-
after="5mm">







<xsl:apply
-
templates select="history/historyProject"/>






</fo:block>





</fo:flow>




</fo:page
-
sequence>



</fo:root>


</xsl:tem
plate>



<!
--

=================================
--
>


<!
--

child element: history
--
>


<!
--

=================================
--
>


<xsl:template match="history/historyProject">


<fo:block font
-
size="12pt">


<
xsl:value
-
of select="@number"/>. <xsl:value
-
of select="name"/>


</fo:block>


</xsl:template>


</xsl:stylesheet>

Exemple de résultat

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


28


Title: Gestion des PI

1. projet A

2. projet B

3. projet C


3.

Les Technologies XML pour publication

Pour la publication du

fichier PDF, nous avons fait appel à la librairie FOP qui
permet, entre autre, de générer un fichier PDF à partir d’un fichier XML et
passant par une feuille de style XSL.


Lien

:
http://xmlg
raphics.apache.org/fop/download.html

2.2.3

Couche service

Il s’agit de remplir et compléter les informations suivantes :

1.

L’accès à la base de données : il s’agit de donner des informations sur le
connecteur vers la base de données.

a.

Nom :
EclipseLink

b.

Version :

2.0

c.

Plateforme :
Java Persistance API (JPA)

d.

Configuration :

persistance.xml

<persistence version="2.0" >


<persistence
-
unit name="Pi
-
Manger
-
ejbPU" transaction
-
type="JTA">


<jta
-
data
-
source>jdbcMysql</jta
-
data
-
source>


<properties/>


<
/persistence
-
unit>

</persistence>


sun
-
ressources.xml

<resources>


<jdbc
-
connection
-
pool
[...]>


<property name="serverName" value="localhost"/>


<property name="portNumber" value="3306"/>


<
property name="databaseName" value="pmanager"/>


<property name="User" value="pmanager"/>


<property name="Password" value="*****"/>


<property name="URL"
value="jdbc:mysql://localhost:3306/pmanager"/>


<property name="driverCla
ss" value="com.mysql.jdbc.Driver"/>


</jdbc
-
connection
-
pool>


<jdbc
-
resource enabled="true" jndi
-
name="jdbcMysql" object
-
type="user" pool
-
name="mysql_pmanager_rootPool"/>

</resources>



2.

La gestion de la politique et des droits d’accès : il s’agit de
donner des
informations sur les éléments de gestion de la politique d’accès.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


29

a.

Interne à la base de données

i.

Utilisateurs

Tous nos utilisateurs se trouvent au même endroit dans notre
base de données. Nous avons décidé d’avoir une seule table User,
regroupant
les élèves et les professeurs
.

ii.

Rôles et droits

Pour notre application, nous avons 2 rôles

: professeur et
étudiant. Chacun accédera à une partie de l’application lui
correspondant.

b.

Externe à la base de données

Web.xml

Définition de la zone «

professor

»


<security
-
constraint>


<display
-
name>Professor area</display
-
name>


<web
-
resource
-
collection>


<web
-
resource
-
name>logged_in</web
-
resource
-
name>


<description/>


<url
-
pattern>/professor/*</url
-
pattern>


</web
-
resource
-
collection>


<auth
-
constraint>


<description/>


<role
-
name>Professor</role
-
name>


</auth
-
constraint>


<user
-
data
-
constraint>


<description/>


<transport
-
guarantee>CONFIDENTIAL</transport
-
guarantee>


</user
-
data
-
constraint>


</security
-
constraint>

Définition de la zone «

student

»


<security
-
constraint>


<display
-
name>Student Area</display
-
name>


<web
-
resource
-
collection>


<web
-
resource
-
name>LogedinStudent</web
-
resource
-
name>


<description/>


<url
-
pattern>/student/*
</url
-
pattern>


</web
-
resource
-
collection>


<auth
-
constraint>


<description/>


<role
-
name>Student</role
-
name>


</auth
-
constraint>


<user
-
data
-
constraint>


<description/>


<transport
-
guarantee>CONFIDENTIAL<
/transport
-
guarantee>


</user
-
data
-
constraint>


</security
-
constraint>

Définition des rôles


<security
-
role>


<role
-
name>Professor</role
-
name>


</security
-
role>


<security
-
role>


<role
-
name>Student</role
-
name>


</security
-
role>


3.

La gestion
des aspects de sécurité: il s’agit de donner des informations sur les
éventuelles techniques de protection de passwd, de cryptograph
ies, du
protocole https, etc.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


30


Nous n’avons pas employé de mots de passe cryptés, tout est en clair dans la
base de données.

Ceci serait clairement une faille pour une application réelle et
serait probablement le premier point abordé en cas de développement futur. La
seule sécurité que notre site représente est le système de droits d’accès, qui
empêche un utilisateur non logué
d’accéder à une page de notre application.

2.3

Eléments technologiques

2.3.1

Outils de gestion de versioning (CVS / SVN)

Il s’agit de donner les plus amples informations sur le système de gestion de version
utilisé dans le cadre de votre projet : L’adresse du serveu
r, Le client utilisé, Le chemin
d’accès, Synthèse sur les avantages et les facilités d’utilisation, Synthèse sur les
désavantages et les difficultés d’utilisation

Afin de faciliter le développement en groupe, nous avons utilisé un serveur SVN sur
Google Co
de. Nous avons utilisé cela autant pour le code que pour les documents. Pour
synchroniser les documents, nous employions soit la ligne de commande soit Tortoise
SVN (
http://tortoisesvn.tigris.org/
).

Le chemin
d’accès à notre SVN est

:

https
://project
-
manager
-
eif.googlecode.com/svn/trunk/


Synthèse sur les avantages et les facilités d’utilisation

Le SVN nous a été très utile durant tout notre projet. Nous l’avons utilisé pour
synchroniser tout nos documents, de
l’analyse à la conception.

Synthèse sur les désavantages et les difficultés d’utilisation

Concernant les documents, nous n’avons eu aucun problème. Cependant avec le projet,
nous avons rencontré quelques problèmes concernant la mise à jour des fichiers du
projet.



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


31

2.3.2

Outils de modélisation

Pour la modélisation UML, nous avons utilisé le programme VisualParadigm. Nous
avons opté pour ce logiciel, car après l’avoir utilisé
d
urant plusieurs modules,
nous
commençons à être assez familiarisés avec.

Génération de
code

La génération de code est disponible pour beaucoup de langage à partir du diagramme
de classe. Cependant, dans notre cela ne nous à pas servi.

Documentation de
développement

La version standard dont nous disposons permet de
générer un rapport avec les

différents diagrammes. Mais cela ne nous à pas été extrêmement utile puisque nous
devions respecter la mise en page imposée.

2.3.3

Outils de documentation du code

Nos classes sont documentées à l’aide de balises respectant la norme établie pour la
javadoc.

2.3.4

Outils de journalisation de prototype

Dans le cadre de notre projet, nous avons employé le Logger natif à Java.
D’usage simple,
elle permet de journaliser des

évènements dans un fichier au format texte ou XML.

Différents niveaux de sévérité sont
applicables aux

messages journalisés.


Syn
thèse sur son utilisation

Il suffit d’initialiser le Logger

static final Logger logger = Logger.getLogger(XMLGenerator.class.getName());

Et ensuite d’appeler la m
é
thode log

logger.log(Level.INFO, "XML generated");

Le result suivant s’
affiche dans la console

10 mai 2011 16:01:59 ch.eiafr.pi.g2.Utilities.XMLGenerator generateXML

INFO: XML generated

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


32

On pourrait aussi enregistrer ces logs dans un fichier grâce à un FileHandler

Handler fh = new FileHandler("myLog.log");

logger.addHandler(fh);

2.3.5

Outils de test

Les tests fonctionnels ont étés effectués à la main, en testant si chaque fonctionnalité
implémentée donnait le résultat attende. Concernant
les tests unitaires
, nous
avons

utilisé JUnit.

Utilisation

:

Le principe d
e JUnit est de tester si la valeur que retourne une méthode que l’on désire
tester correspond à la valeur attendue

:

expResult = false;

XMLGenerator instance3 = new XMLGenerator();

assertEquals(expResult, instance3.generateXML(projectInvalid, client, null,

null,
null));

Exemple de test unitaire testant la gestion du fichier XML

/**

* Test of generateXML method, of class XMLGenerator.

*/

@Test

public void testGenerateXML() throws Exception {


System.out.println("generateXML");



Project project = new Project(1234, "titre", 2, "desc", "tech1, tech2", new Date(),


null, true, true);


User client = new User();


client .setFirstname("Omar");


client.setLastname("Abou Khaled");


client.setShortname("OAK");



User student1 =
new User();


student1 .setFirstname("Yves");


student1.setLastname("Peissard");


student1.setShortname("YP");



User student2 = new User();


student2 .setFirstname("Elias");


student2.setLastname("Medawar");



User[] students = new User[]{student1,
student2};



SubscriptionPeriod subscriptionPeriod = new SubscriptionPeriod(1, new


Date(2011,1,1), new Date(2011,2,2), "period1");



boolean expResult = true;



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


33



//generation du XML avec tout les champs (valide)


XMLGenerator instance1 = new
XMLGenerator();


assertEquals(expResult, instance1.generateXML(project, client, new


Project[]{project, project}, students, subscriptionPeriod));




//generation du XML uniquement avec les champs obligatoires (valide)


XMLGenerator instance2 = new

XMLGenerator();


assertEquals(expResult, instance2.generateXML(project, client, null, null, null));





//projet avec un nombre d'etudiant max =
-
1 : erreur à la validation attendu


Project projectInvalid = new Project(1234, "titre",
-
1, "desc", "tech1, tech2", new


Date(), null, true, true);



expResult = false;


XMLGenerator instance3 = new XMLGenerator();


assertEquals(expResult, instance3.generateXML(projectInvalid, client, null, null,


null));


}


Résultat

:



2.3.6

Outils de gestion de licences

Nous n’avons pas mis en place une gestion de licences, d’une part car ce projet reste
dans le cadre
académique et d’autre part car nous n’avons pas spécialement eu le temps
de nous pencher sur la question.

2.3.7

Outils d’installation et de packaging

Nous n’avons pas mis en place un installateur. En revanche, nous disposons tout de
même d’un script SQL permett
ant de créer et de peupler la base de données.



PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


34

2.4

Diagrammes d’architecture

2.4.1

Diagramme

de package

Le schéma suivant représente les packages de notre application. Une description des
différents packages est dressée dans le tableau qui suit.


Pi
-
Manager
-
ejb

Package

Description

Source Packages

Contient la logique de l’application. Est divisé en 4 packages

:



DAO (gère les connexions à la BD)



DataBase (contient les classes représentant des
enregistrements de la BD)



Facade (gère les communications avec les DAO)



Utilities (contient les classes utilitaires de
l’application, telles que génération XML et PDF)

Test Package

Contient les tests de l’application

Librairies

Contient les librairies de l’application



JDom



Fop



GlassFish

Test Librairies

Contient les
librairies de test de l’application



JUnit

Entreprise Beans

Vue représentant les Bean contenu dans Source Package

Configuration File

Contient les fichiers de configuration

Server Ressources

Contient les fichiers de ressources serveur



sun
-
ressources.xml
(contient les information de
connexion à la DB tel que username, password, url,
port, etc)


PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


35

Pi
-
Manager
-
war

Package

Description

Web Pages/WEB
-
INF

Contient les librairies



primefaces

Et les fichiers de configuration




face
-
config.xml



sun
-
web.xm



web.xml

Web

Pages/pages

Contient les pages .xhtml

Web Pages/resources

Con
tient 3 répertoires



images



stylesheets



templates

Source Packages

Est divisé en 2 packages

:



Helper (gère les méthodes appelées depuis les
pages .xhtml)



Web (contient une classe gérant la
redirection entre
les différentes pages)

Test Package

Contient les tests de l’application

Librairies

Contient les librairies de l’application



Pi
-
Manager
-
ejb.jar



Primefaces



GlassFish

Test Librairies

Contient les librairies de test de l’application



JUnit

Entreprise Beans

Vue représentant les Bean contenu dans Source Package

Configuration File

Contient les fichiers de configuration

2.4.2

Diagramme

de navigation (état
-
transition)

Ce diagramme schématise les liens entre les différentes pages de notre
application.


PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


36

2.5

Choix technologique

Approche technologique et
langages

IHM

Logique /
Middleware

Data

Java
-

PrimeFace

X



Java


X


JPA


X

X

SQL



X

DOM


JDOM


X


SAX




X


SQL


X

X

XSLT


fop1.0


X

X

XSL
-
FO


fop1.0


X

X

XML schéma, validation
avant
stockage dans la base



X

Fichiers de configuration

: Java
EE (web.xml, etc. )

X

X

X

Browser
-

iexplorer

X



Browser
-

firefox

X




2.6

Contraintes d’utilisation technologique


OUI (justifier)

NON (justifier)

Utilisation une architecture
3 tiers au
minimum


Comme définit dans le
document de conception,
il est possible de déployer
notre application sur 3
machines différentes.
Mais nous avons décidé
de placer le serveur web
sur la même machine que
la
BD
, puisque
celle
-
la

n’est pas très grande.


Utilisation des web
services dans votre
architecture


Nous n’avons pas ressenti
l’utilité d’utilité d’utiliser
des web services dans
cette application.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


37

Utilisation des RIA dans
votre
architecture

Nous avons utilisé
PrimeFace
s

pour
présenter du contenu
ric
he et interactif au client.


Utilisation au minimum
d’une feuille de style
XSLT

Nous avons créé 3 feuilles
de style pour la génération
des PDF.


Utilisation au minimum
d’une feuille de style XSL
-
FO

Nous avons créé 3 feuilles
de style pour la génération
des PDF

(historique, détail
d’un projet, liste des
projets)


Utilisation du SQL

Nous faisons des
requêtes SQL lorsque
nous insérons ou
supprimons des requêtes
de la base de données


Utilisation du XQuery


Nous n’allons pas
rechercher d’information
partic
ulière dans notre
fichier XML, nous nous
contentons de le
transformer en fichier PDF

Utilisation au minimum
d’un contrôle de validation
sur la saisie des données

Nous avons employé des
contrôles de validations
pour tous les champs pour
lesquels l’
utilisateur

peut y
introduire du contenu,
dans nos diverses pages.


Utilisation de DOM, SAX
ou JDOM, JAXP

Utilisation de SAX, JDOM
et JAXP pour la
génération du XML, la
validation et la génération
de PDF




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


38

2.7

Outils administratifs


Oui (
justifier
)

Non
(justifier)

Outil de gestion de
planning


Nous n’avons pas eu
recours à un tel outil, car
nous nous fixions une
séance par semaine où
nous discutions de notre
avancée et des
prochaines étapes à
effectuer.

Le planning était déjà
défini au départ de ce
projet, avec plusieurs
jalons

définis à l’avance et
un suivi régulier avec nos
professeurs (à l’aide de
fiches de suivi).


Outil de gestion
financière


Nous n’avons pas besoin
de faire une gestion
financière,
car notre projet
reste dans un cadre
académique.


Gestion tache, etc.


Nous nous sommes
répartis les diverses
tâches au terme de
séances hebdomadaire,
sans avoir recours à un
outil spécifique




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


39

3

Conclusion

3.1

Objectifs atteints

La conclusion résume très
succinctement ce qui a été réalisé. Cette sous
-
section se
terminera par un tableau de la forme suivante :

Objectifs


UseCas
e 1

: Login

10
0%

UseCase

2

: Display group + détail

10
0%

UseCas
e 3

: Manage project

10
0%

UseCase 4

: Manage subscrip
tion periods
(scheduler)

10
0%

UseCas
e 5

: Display history

10
0%

UseCase

6

: Display subscriptions

10
0%

UseCas
e 7

: Display available projects

10
0%

UseCase

8

: Subscribe/Unsubscribe

5
0%

Déploiement

10
0%

Test (
fonction
n
el
, unit, etc.)

5
0%

3.2

Problèmes rencontrés

Le
temps

Nous avons manqué un peut de temps pour l’implémentation de l’application. Nous
regrettons

qu’aussi peu de temps
aient

été
attribué

à cette partie en comparaison de la
phase d’analyse et celle de conception.
Ce manque temps ce reflète au travers de nos
tests qui, nous le sommes conscient, restent très superficiels ainsi que l’absence de
gestion de licence ou encore d’installateur.

MySQL

: check

Comm
e déjà mentionné dans la partie base de données de ce document

(cf. 1.7.5), nous
avons du trouvé une solution alternative à l’utilisation de la syntaxe «

CHECK

» puisque
celle
-
ci n’est pas implémentée dans MySQL.

Procédures stockées

Nous n’arrivions pas à appeler nos procédures stockées, la cause était que nous n’avi
ons
pas les droits nécessaires pour cela. Nous avons du passer par l’interface graphique de
MySQL Workbench afin d’activer cette autorisation.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


40

3.3

Problèmes non résolus

Upload de document

L’upload de document n’a pas été réalisé complètement pour le use case 8
. Cela ne
fonctionnait pas avec HTTPS.
La

solution peut être de désactiver HTTPS mais, nous
n’avons pas eu le temps de le faire.

Tri

Nous avons dans l’entête de nos colonnes une fonction de tri. Pour une raison que nous
n’avons pas encore identifiée,
certaines fois, ce tri ne fonctionne qu’après avoir fait une
recherche.

Nouvelle subscription
pe
riod

: Format de la date

Lorsqu’on édite une date à l’aide du composant calendrier, la date retournée est
formatée en fonction des paramètres régionaux. Concrèt
ement, on s’attend
à

avoir une
date avec comme séparateur des «

/

». Si par exemple, le séparateur de date de notre
système est «

.

» alors, il y aura une erreur de validation.

3.4

Perspectives futures



Sécurisation de l’application

: crypter les mots de passe



Améliorations graphiques

: rendre l’interface graphique plus agréable,
Embellir les PDF généré par l’application



Gérer la fonctionnalité d’upload de document



Fournir un installateur

3.5

Synthèse

Le projet intégré était une bonne expérience dans son ensemble. Nous avons trouvé bien
de regrouper le génie logiciel, les bases de données et SI dans un seul est même projet.
Bien que cela reste un projet académique, cela c’est avéré
être
plus intéressant

que
d’effectuer de simple
s

TP
s

dans chacune des branches
, nous avons bien pu prendre
conscience de l’importance d’une bonne spécification pour la suite du projet.

Nous jugeons que notre analyse de conception a été bonne car nous n’avons eu que peu

de

chan
gement à y apporter durant l’implémentation
, sachant qu’il n’est pas facile de
faire la conception
sans connaitre le
Framework
.

L’utilisation de PrimeFaces pour la partie graphique de l’interface, perm
et

de gagner du
temps en utilisant ces composant graphi
que par rapport à si nous avions du le faire
«

from scratch

» tout en obtenant un rendu à l’affichage plus agréable
, cependant il ne
faut pas négliger le temps de prise en main du
Framework
.

PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


41

4

Références

4.1

Bibliographie

4.1.1

Thème :
GlassFish

[B1],

Beginning Java
EE 6 Platform with GlassFish 3, Second Edition

C
opyright
2010 by Antonio Goncalves

Votre conseil relativement à cette référence:

bonne référence pour
l’utilisation de
GlassFish

4.2

Webographie

4.2.1

Thème :
XML, XSLT, XSL
-
FO, PDF

[S1],

http://www.developpez.com

Votre conseil relativement à cette référence
: bonne référence
contenant une grande
quantité d’exemples.

4.2.2

Thème :
Développement J2EE

[S2
],

http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html

Votre conseil relativement à cette référence
: référence
utile pour l’utilisation de
design pat
tern

J2EE
.


[S3
],

http://netbeans.dzone.com/articles/develop
-
java
-
ee
-
6
-
app
-
jsf2?page=0,0


Votre conseil relativement à cette référence
:
Bon tutorial pour
commencer

le
développement en J2EE avec Netbeans
.

[S4
],

http://primefaces.org/

Votre conseil relativement à cette référence
:
Téléchargement et documentation de
PrimeFaces.

4.2.3

Thème :
Base de données

[S5
],

http://dev.mysql.com/doc/refman/5.5/en/mysql
-
nutshell.html

Votre conseil relativement à cette référence
:
Site de référence pour MySQL
.




PI pour architectes en technologies de l'information
-

Année académique 2010
-
2011



Implémentation


42

5

Annexes

5.1

CD
-
ROM (une copie par rapport)

[1]

répertoire 1 : Répertoire de travail du PI



Rapport, présentation, etc., Procès verbaux, les emails, etc.

[2]

répertoire 2 : Développement logiciels



Sources, Librairies (spécifique, communes), Serveurs ou autres produits.