Vous êtes sur la page 1sur 11

CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

NFP111 Systmes et Applications Rpartis


Anne 2010 2011
Examen Final 2me session
Dure : 3H
Tout document est autoris
Pas de calculatrice
Cet examen est de 3 pages

Exercice 1 : Servlet (5 points)

Considrer un formulaire qui permet dentrer un nom, un prnom, un code postal et une
adresse mail. Ce formulaire contient 2 boutons envoyer et Reset .
1. Ecrire la servlet permettant dafficher ce formulaire. (2 points)
2. Lorsque l'utilisateur soumet ces donnes, votre servlet effectuera des contrles
lmentaires sur leur integrit, ces contrles sont rsums dans le tableau suivant :

Ecrire le code correspondant cette vrification et montrer le rsultat de ces


vrifications l'utilisateur dans une page. (3 points)

Suivez les indications suivantes pour rsoudre cet exercice:

a. Utiliser la classe Pattern du package java.util.regex qui contient les mthodes


ncessaires pour raliser le contrle dintgrit demand.
b. Utiliser la mthode matches de la classe Pattern . Cette mthode va tenter de
faire correspondre une chane cible avec un motif et renvoyer un boolen pour
signaler si la chaine correspond ou pas au motif.

Un exemple dutilisation est le suivant :


Pattern.matches ("[Yy]es|[Yy]|[Oo][Kk]|[Tt]rue", answer)
O answer est la chane cible quon veut comparer avec le motif
"[Yy]es|[Yy]|[Oo][Kk]|[Tt]rue" pour savoir si answer contient Yes, yes, Y, y, OK, Ok,
oK, ok, True ou true.

c. Pour construire le motif:


[abc] a, b, ou c
[^abc] Nimporte quel caractre sauf a, b, ou c
[a-zA-Z] de a z ou A Z, inclusive (intervalle)
[a-d[m-p]] de a d, ou m p: [a-dm-p] (union)
\d Un chiffre : [0-9]
\D Un non-chiffre : [^0-9]
\d{3} Une squence de 3 chiffres
+ Utilis pour avoir 2 squences distinctes

Page 1 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

Solution :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.regex.*;

public class Exo2 extends HttpServlet {


public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter(); 0.5 point
out.println("<html>");
out.println("<head>");
out.println("<title>Une servlet avec un formulaire !</title>");
out.println("</head>");
out.println("<body>");
out.println("<form method=post>");
out.println("<table>");
out.println("<tr><td>Nom<td><input name=nom type=text ");
out.println("<tr><td>Prnom<td><input name=prenom type=text ");
out.println("<tr><td>Code postal<td><input name=code type=text "); 1.5 points
out.println("<tr><td>Ml<td><input name=mel type=text ");
out.println("</table>");
out.println("<input type=submit>");
out.println("<input type=reset>");
out.println("</form>");
out.println("</body></html>");
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)


throws ServletException, IOException {

resp.setContentType("text/html");
PrintWriter out = resp.getWriter();

String nom = req.getParameter("nom"); 1 point


String prenom = req.getParameter("prenom");
String code = req.getParameter("code");
String mel = req.getParameter("mel");

out.println("<html>");
out.println("<head>");
out.println("<title>Vrification des valeurs entres</title>");
out.println("</head>");
out.println("<body>");
out.println("<table>");
out.println("<tr><td>Nom");
out.println(" <td>" + Boolean.toString(Pattern.matches("^[a-zA-
Z]+$",nom)));
2 points
Page 2 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

out.println("<tr><td>Prenom");
out.println(" <td>" + Boolean.toString(Pattern.matches("^[a-zA-
Z]+$",prenom)));
out.println("<tr><td>Code");
out.println(" <td>" + Boolean.toString(Pattern.matches("^\\d{5}$",code)));
out.println("<tr><td>Ml");
out.println(" <td>" +
Boolean.toString(Pattern.matches("^[^@]+@[^@]+$",mel)));
out.println("</body></html>");
}
}

Exercice 2 : RMI (11 points)

L'application raliser est constitue d'objets accessibles distance (objets RemoteObject)


et d'objets passs par copie (objets Serializable). Il s'agit de mettre en place une application
qui mmorise les rsultats acadmiques d'un ensemble d'tudiants.

Cette application est constitue de deux interfaces accessibles distance : Etudiant.java et


Promotion.java.

L'interface Etudiant.java donne accs aux donnes associes un tudiant : c'est dire son
nom, son prnom, son numro d'tudiant ainsi qu'un ensemble de notes. Chaque tudiant
passe plusieurs preuves. Chaque preuve donne lieu une note. Chaque note est associe
un coefficient. Un coefficient est une donne de type double dont la valeur est comprise
entre 0 et 1. La somme des coefficients de toutes les preuves d'un tudiant doit tre gale
1. Ces diffrentes preuves sont stockes dans un ensemble d'instance de la classe
Epreuve_avec_coeff.java donne ci-dessous.

Epreuve.java

import java.io.Serializable;

public interface Epreuve extends Serializable


{
public double note();
public void afficher();
}

Epreuve_avec_coeff.java

public class Epreuve_avec_coeff implements Epreuve


{
public double _note;
public String _nom_epreuve;
public double _coefficient;

public Epreuve_avec_coeff (double note, String nom_epreuve, double coefficient)


{

Page 3 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

_note=note;
_nom_epreuve=nom_epreuve;
_coefficient=coefficient;
}

public void afficher()


{
System.out.println("Epreuve " + _nom_epreuve + ": " + _note );
}

public double note()


{
return _note*_coefficient;
}
}

L'interface Etudiant.java propose trois mthodes:

a. ajouter_une_epreuve: qui permet d'ajouter une preuve un tudiant. Une


preuve est constitue d'un nom (ex: "Ecrit de math"), d'une note et d'un coefficient
indiquant le poids de l'preuve dans la moyenne gnrale de l'tudiant.
b. afficher_liste_des_epreuves: qui provoque l'affichage par le serveur de la liste des
preuves associes l'tudiant.
c. calculer_la_moyenne: qui calcule la moyenne gnrale de toutes les preuves d'un
tudiant conformment aux coefficients de chaque preuve.

L'interface Promotion.java permet de :

a. crer un nouvel tudiant (mthode ajouter_un_etudiant).


b. rechercher un tudiant prcdemment enregistr (mthode
rechercher_un_etudiant). Grce la rfrence d'objet ainsi rcupre, le client peut
alors demander le calcul de la moyenne gnrale de l'tudiant.
c. calculer la moyenne gnrale de toute la promotion (mthode
calculer_moyenne_de_la_promotion).

1. Ecrire linterface Etudiant.java et proposer une classe dimplmentation pour elle


(cest la classe qui matrialise le service). (4.5 points)

Solution

Linterface : (1 point)

public interface Etudiant extends java.rmi.Remote


{
String nom() throws java.rmi.RemoteException;
String prenom() throws java.rmi.RemoteException;
int numero_etudiant() throws java.rmi.RemoteException;

Page 4 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

void afficher_liste_des_epreuves() throws java.rmi.RemoteException;


void ajouter_une_epreuve(Epreuve e) throws java.rmi.RemoteException;
double calculer_la_moyenne() throws java.rmi.RemoteException;

Limplmentation de la classe : (3.5 points)

import java.io.*;
point import java.net.*;
import java.rmi.*;
import java.rmi.server.*;

public class EtudiantImpl extends UnicastRemoteObject


implements Etudiant
{
private String _nom;
private String _prenom;
point private int _numero;
private Epreuve [] liste = null;
int nb;

public EtudiantImpl(int num, String nom, String prenom) throws


java.rmi.RemoteException
{
_numero=num;
point _nom=nom;
_prenom=prenom;
liste = new Epreuve[10];
nb=0;
}

public String nom() throws java.rmi.RemoteException


{
point
return _nom;
}
public String prenom() throws java.rmi.RemoteException
point {
return _prenom;
}
public int numero_etudiant() throws java.rmi.RemoteException
point {
return _numero;
}

public void afficher_liste_des_epreuves() throws java.rmi.RemoteException


{
System.out.println("Etudiant " + _numero + " : " + _nom + " " +
_prenom);

Page 5 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

for (int i=0; i<nb; i++)


point liste[i].afficher();
System.out.println("");
System.out.println("");
}

public void ajouter_une_epreuve(Epreuve e) throws


java.rmi.RemoteException
{
point
liste[nb]=e;
nb++;
}

public double calculer_la_moyenne() throws java.rmi.RemoteException


{
double moy = 0.0;
double nbm =0.0;

for (int i=0; i<nb; i++)


point {
moy=moy+liste[i].note();
nbm=nbm+1.0;
}

if (nb>0)
return moy/nbm;
else return 0;
}

}
2. Ecrire linterface Promotion.java et proposer une classe dimplmentation pour elle.
(3 points)

public interface Promotion extends java.rmi.Remote


{
Etudiant ajouter_un_etudiant(int numero_etudiant, String nom, String prenom)
throws java.rmi.RemoteException;
point Etudiant rechercher_un_etudiant(int numero_etudiant)
throws java.rmi.RemoteException;

double calculer_moyenne_de_la_promotion()
throws java.rmi.RemoteException;

Page 6 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;

point public class PromotionImpl extends UnicastRemoteObject


implements Promotion
{

private Etudiant [] liste = null;


int nb=0;

public PromotionImpl() throws RemoteException

point nb=0;

liste = new Etudiant[10];

public Etudiant ajouter_un_etudiant(int numero_etudiant, String nom, String


prenom)
throws java.rmi.RemoteException
{
point EtudiantImpl e = new EtudiantImpl(numero_etudiant, nom, prenom);
liste[nb]=e;
nb++;
return e;
}

public Etudiant rechercher_un_etudiant(int numero_etudiant)


throws java.rmi.RemoteException
{
point for (int i=0; i<nb; i++)
if (liste[i].numero_etudiant() == numero_etudiant)
return liste[i];
}

public double calculer_moyenne_de_la_promotion()


throws java.rmi.RemoteException
{
double moy = 0.0;
double nbm =0.0;

point for (int i=0; i<nb; i++)


{
moy=moy+liste[i].calculer_la_moyenne();

Page 7 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

nbm=nbm+1.0;
}
if (nb>0)
return moy/nbm;
else return 0;
}
}

3. Ecrire le fichier Serveur pour permettre lenregistrement du service auprs de RMI


Registry. (1 point)

import java.rmi.*;
import java.rmi.server.*;
public class Serveur {

public static void main(String args[]) throws IOException


{

if (args.length != 1)
{
point System.out.println("Un argument : port-rmiregistry ");
System.exit(1);
}

// Creation et installation du security manager


point //
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());

try
{

PromotionServeur MonServeur = new PromotionServeur();


String nomService = "//machine:" + args[0] + "/PromotionServeur";
point Naming.rebind(nomService, MonServeur);
System.out.println("PromotionServeur enregistre : " + nomService);
}
catch (RemoteException e)
{
System.out.println("PromotionServeur err: " + e.getMessage());
e.printStackTrace();
}

}
}

Page 8 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

4. Proposez un client qui dclare plusieurs tudiants ayant passs plusieurs preuves.
Puis, afficher les preuves, la moyenne de chaque tudiant ainsi que la moyenne
gnrale de la promotion. (2.5 points)

import java.rmi.*;

public class Client


{
static String portRmiregistry;
public static void main (String args[])
{
if (args.length != 2)
{
System.out.println ("Deux arguments : port-rmiregistry machine ");
System.exit (2);
}
portRmiregistry=args[0];
try
{
1/2 point
String nomService = "//machine:" + portRmiregistry +
"/PromotionServeur";
System.out.println (" Connexion au service : " + nomService);
Promotion obj = (Promotion) Naming.lookup (nomService);

Etudiant Etudiant1 = obj.ajouter_un_etudiant(1, "albert", "le gall");


1/2 point
Etudiant Etudiant2 = obj.ajouter_un_etudiant(2, "michel", "le gall");
Etudiant Etudiant3 = obj.ajouter_un_etudiant(3, "franck", "le gall");

Etudiant2.ajouter_une_epreuve(new Epreuve_avec_coeff(10,
"math", 1));
1/2 point Etudiant3.ajouter_une_epreuve(new Epreuve_avec_coeff(6,
"physique", 0.5));
Etudiant3.ajouter_une_epreuve(new Epreuve_avec_coeff(14,
"math", 0.5));

Etudiant1.afficher_liste_des_epreuves();
1/2 point Etudiant2.afficher_liste_des_epreuves();
Etudiant3.afficher_liste_des_epreuves();

System.out.println("moy Etudiant1 = " +


Etudiant1.calculer_la_moyenne());
System.out.println("moy Etudiant2 = " +
Etudiant2.calculer_la_moyenne());
1/2 point
System.out.println("moy Etudiant3 = " +
Etudiant3.calculer_la_moyenne());
System.out.println("moy promo = " +
obj.calculer_moyenne_de_la_promotion());

Page 9 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

catch (Exception e)
{
System.out.println ("Client.java exception: " + e.getMessage ());
e.printStackTrace ();
}
}//end main
}//end class

Exercice 3 : Exclusion mutuelle rpartie (4 points)

Dans cet exercice, nous considrons le cas dune exclusion mutuelle rpartie, algorithme de
Ricart et Agrawal.

1. Appliquez cet algorithme sur le diagramme suivant (les flches reprsentent les
messages du type (Demandei;Hi)) et dterminez lordre dentre des processus en
section critique. (2 points)
2. Que doit-on faire si un processus tombe en panne aprs quun autre lui ait demand
la permission ? (2 points)

Solution :

1) Voici un exemple de scnario possible partir de la configuration initiale.


L'entre en section critique des processus s'effectue dans l'ordre de leur
demande (de la plus ancienne la plus rcente).

Page 10 de 11
CNAM NFP111 Systmes et Applications Rpartis Anne 2010 2011 Examen Final

2) L'algorithme tel qu'il est donn ici ne supporte pas les pannes. En effet, si un
processus tombe en panne, il faut un mcanisme pour que les autres processus
s'en aperoivent et cessent d'attendre des accuss de rception de la part du
processus dfaillant (ce qui provoquerait le blocage de tout le systme). Il faut
aussi prendre les dispositions ncessaires lorsque ce processus redmarre.

Page 11 de 11

Vous aimerez peut-être aussi